Mybatis全面詳解——下(學習總結)


原文地址:https://blog.csdn.net/ititii/article/details/79999481

一、Mybatis關聯查詢映射

這里采用一個案例來進行分析:(下面的案例都是采用Mapper接口編程的方式來實現)

數據庫准備:在數據庫中創建一個Mybatis數據庫,並在中創建user(用戶)、orders(訂單)、orderdetail(訂單詳情)、items(商品)表。

各表的設計:

user表:


orders表:

orderdetail表:

items表:

表與表的關系:

user/orders表:

user——>orders:一個用戶可以有多個訂單;一對多

orders——>user:一個訂單只能由一個用戶創建;一對一

orders/orderdetail表:

orders——>orderdetail:一個訂單有多個訂單詳情,因為一個訂單可能包含多個商品;一對多

orderdetail——>orders:一個訂單詳情只能包含在一個訂單當中;一對一

orderdetail/items表:

orderdetail——>items:一個訂單明細只能對應一個商品;一對一

items——>orderdetail:一個商品可以有多個訂單明細;一對多。


為每個表創建一個javaBean對象:

user表對應的User類:


   
   
   
           
  1. public class User {
  2. private Integer id;
  3. private String username;
  4. private Date birthday;
  5. private String sex;
  6. private String address;
  7. //省略getter和setter方法
  8. }

orders表對應的Orders類:


   
   
   
           
  1. public class Orders {
  2. private Integer id;
  3. private Integer user_id;
  4. private String number;
  5. private Date createtime;
  6. private String note;
  7. //省略getter和setter方法
  8. }

orderdetail表對應的Orderdetail類:


   
   
   
           
  1. public class Orderdetail {
  2. private Integer id;
  3. private Integer ordersId;
  4. private Integer itemsId;
  5. private Integer itemsNum;
  6. //省略getter和setter方法
  7. }

items表對應的Items類:


   
   
   
           
  1. public class Items {
  2. private Integer id;
  3. private String name;
  4. private float price;
  5. private String text;
  6. private String pic;
  7. private Date createtime;
  8. //省略getter和setter方法
  9. }
1.1.一對一查詢

需求分析:

查詢訂單信息,關聯查詢用戶信息。

sql語句:

確定查詢主表:訂單表

確定查詢從表:用戶表

SELECT
        orders.`id`,
        orders.`user_id` userId,
        orders.`number`,
        user.`username`,
        user.`sex`
        FROM
        orders,
        USER
        WHERE orders.`user_id` = user.`id`

方式一:采用resultType結果集映射:

由於resultType結果集映射時把查詢出來的結果集中的每一列和javaBean對象中每個屬性進行一一對應。然而在我們創建的javaBean中Orders表並不滿足查詢結果集的要求,因此這里就對Orders類進行擴展。

擴展javaBean:OrdersExt


   
   
   
           
  1. public class OrdersExt extends Orders{
  2. private String username;
  3. private String sex;
  4. //省略getter和setter方法
  5. }

編寫Mapper接口:


   
   
   
           
  1. public interface OrdersMapper {
  2. public List<OrdersExt> findOrdersAndUser();
  3. }

編寫OrdersMapper.xml映射文件:


   
   
   
           
  1. <?xml version= "1.0" encoding= "UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace= "com.lc.mybatis.mapper.OrdersMapper">
  6. <!-- 一對一resultType結果映射 -->
  7. <select id= "findOrdersAndUser" resultType= "ordersExt">
  8. SELECT
  9. orders.`id`,
  10. orders.`user_id` userId,
  11. orders.`number`,
  12. user.`username`,
  13. user.`sex`
  14. FROM
  15. orders,
  16. USER
  17. WHERE orders.`user_id` = user.`id`
  18. </select>
  19. </mapper>

把OrdersMapper.xml映射文件加載到全局配置文件中SqlMapConfig.xml文件中:

我這里使用的是加載包下的所有映射文件的方式來加載映射文件;


   
   
   
           
  1. <!-- 加載映射文件 -->
  2. <mappers>
  3. <!-- 注冊指定包下的所有映射文件 -->
  4. < package name= "com.lc.mybatis.mapper"/>
  5. </mappers>


測試類:


   
   
   
           
  1. public class OrdersMapperTest {
  2. private SqlSessionFactory sqlSessionFactory ;
  3. @Before
  4. public void setUp() throws IOException {
  5. InputStream inputStream = Resources.getResourceAsStream( "SqlMapConfig.xml");
  6. sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  7. }
  8. @Test
  9. public void testFindOerdersAndUser() {
  10. SqlSession sqlSession = sqlSessionFactory.openSession();
  11. //獲取UserMapper的代理類
  12. OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
  13. List<OrdersExt> lists = ordersMapper.findOrdersAndUser();
  14. System.out.println(lists);
  15. sqlSession.close();
  16. }
  17. }

方式二:采用resultMap結果集映射

使用resultMap對結果集映射,需要先聲明resultMap,因為resultMap是對查詢出來的結果集中的每一列進行手動指定映射到javaBean對象中哪個屬性上。

修改OrdersExt類:


   
   
   
           
  1. public class OrdersExt extends Orders{
  2. private User user;
  3. //省略getter和setter方法
  4. }

修該OrdersMapper.xml映射文件:

其中映射文件中的:<association property="指定關聯關系映射到OrdersExt的哪個屬性上" javaType="指定該屬性的java類型">;該標簽是一對一所使用的關聯標簽。


   
   
   
           
  1. <?xml version= "1.0" encoding= "UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace= "com.lc.mybatis.mapper.OrdersMapper">
  6. <!-- 一對一resultMap結果映射 -->
  7. <!-- 聲明resultMap -->
  8. <resultMap type= "ordersExt" id= "findOrdersAndUserRstMap">
  9. <!-- 訂單信息 -->
  10. <id column= "id" property= "id"/>
  11. <result column= "userId" property= "userId"/>
  12. <result column= "number" property= "number"/>
  13. <!-- 用戶信息(一對一) -->
  14. <!--association標簽:一對一映射 -->
  15. <!-- property屬性:指定關聯信息映射到OrdersExt的哪個屬性上 -->
  16. <!-- javaType屬性:指定關聯屬性的java類型 -->
  17. <association property= "user" javaType= "user">
  18. <id column= "userId" property= "id"/>
  19. <result column= "username" property= "username"/>
  20. <result column= "sex" property= "sex"/>
  21. </association>
  22. </resultMap>
  23. <select id= "findOrdersAndUserRstMap" resultMap= "findOrdersAndUserRstMap">
  24. SELECT
  25. orders.`id`,
  26. orders.`user_id`userId,
  27. orders.`number`,
  28. user.`username`,
  29. user.`sex`
  30. FROM
  31. orders,
  32. USER
  33. WHERE orders.`user_id` = user.`id`
  34. </select>
  35. </mapper>

修改Mapper接口:


   
   
   
           
  1. public interface OrdersMapper {
  2. public List<OrdersExt> findOrdersAndUserRstMap();
  3. }

測試類:


   
   
   
           
  1. public class OrdersMapperTest {
  2. private SqlSessionFactory sqlSessionFactory ;
  3. @Before
  4. public void setUp() throws IOException {
  5. InputStream inputStream = Resources.getResourceAsStream( "SqlMapConfig.xml");
  6. sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  7. }
  8. @Test
  9. public void testFindOrdersAndUserRstMap() {
  10. SqlSession sqlSession = sqlSessionFactory.openSession();
  11. //獲取UserMapper的代理類
  12. OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
  13. List<OrdersExt> lists = ordersMapper.findOrdersAndUserRstMap();
  14. sqlSession.close();
  15. }
  16. }
1.2.一對多關聯查詢

需求分析:

查詢訂單信息及訂單明細信息。

sql語句:

查詢主表:訂單表

查詢從表:用戶表和訂單詳情表

SELECT
        orders.`id`,
        orders.`user_id`,
        orders.`number`,
        user.`username`,
        user.`sex`,
        orderdetail.`id` detailId,
        orderdetail.`items_id`,
        orderdetail.`items_num`
        FROM
        orders,
        USER,
        orderdetail
        WHERE orders.`user_id` = user.`id`
        AND orders.`id` = orderdetail.`orders_id`

編寫javaBean:

這里查詢信息有訂單詳情和用戶信息,因此,Orders類不能滿足我們查詢是映射的需求,因此,這里同樣采用對Orders類進行擴展:


   
   
   
           
  1. public class OrdersExt extends Orders{
  2. private User user;
  3. private List<Orderdetail> orderdetailLists;
  4. //省略getter和setter方法
  5. }

編寫Mapper接口:


   
   
   
           
  1. public interface OrdersMapper {
  2. public List<OrdersExt> findOrdersAndOrderdetail();
  3. }

編寫OrderMapper.xml映射文件:

在映射文件中使用了<collection property="指定關聯關信息映射到OrdersExt的哪個屬性上" ofType="集合中元素的java類型"> 標簽;該標簽時一對多關聯映射所使用的,把查詢的結果集中有多個結果放在集合中去。


   
   
   
           
  1. <?xml version= "1.0" encoding= "UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace= "com.lc.mybatis.mapper.OrdersMapper">
  6. <!-- 聲明resultMap -->
  7. <resultMap type= "ordersExt" id= "ordersAndOrderdetail">
  8. <!-- 訂單信息 -->
  9. <id column= "id" property= "id"/>
  10. <result column= "user_id" property= "userId"/>
  11. <result column= "number" property= "number"/>
  12. <!-- 用戶信息(一對一) -->
  13. <association property= "user" javaType= "user">
  14. <id column= "user_id" property= "id"/>
  15. <result column= "username" property= "username"/>
  16. <result column= "sex" property= "sex"/>
  17. </association>
  18. <!-- 訂單詳情信息(一對多) -->
  19. <!-- collection標簽:由於一對多映射 -->
  20. <!-- property屬性:指關聯信息映射到OrdeersExt的哪個屬性上 -->
  21. <!-- ofType屬性: 集合中java類型-->
  22. <collection property= "orderdetailLists" ofType= "com.lc.mybatis.po.Orderdetail">
  23. <id column= "detailId" property= "id"/>
  24. <result column= "items_id" property= "itemsId"/>
  25. <result column= "items_num" property= "itemsNum"/>
  26. </collection>
  27. </resultMap>
  28. <!-- 查詢訂單信息:主信息為訂單信息,從信息為用戶信息和訂單詳情 -->
  29. <select id= "findOrdersAndOrderdetail" resultMap= "ordersAndOrderdetail">
  30. SELECT
  31. orders.`id`,
  32. orders.`user_id`,
  33. orders.`number`,
  34. user.`username`,
  35. user.`sex`,
  36. orderdetail.`id` detailId,
  37. orderdetail.`items_id`,
  38. orderdetail.`items_num`
  39. FROM
  40. orders,
  41. USER,
  42. orderdetail
  43. WHERE orders.`user_id` = user.`id`
  44. AND orders.`id` = orderdetail.`orders_id`
  45. </select>
  46. </mapper>

加載OrderMapper.xml映射文件:


   
   
   
           
  1. <!-- 加載映射文件 -->
  2. <mappers>
  3. <!-- 使用相對於類路徑的資源 -->
  4. <!-- <mapper resource= "com/lc/mybatis/mapper/UserMapper.xml"/> -->
  5. <!-- 注冊指定包下的所有映射文件 -->
  6. < package name= "com.lc.mybatis.mapper"/>
  7. </mappers>

編寫測試類:


   
   
   
           
  1. private SqlSessionFactory sqlSessionFactory ;
  2. @Before
  3. public void setUp() throws IOException {
  4. InputStream inputStream = Resources.getResourceAsStream( "SqlMapConfig.xml");
  5. sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  6. }
  7. @Test
  8. public void testFindOrdersAndOrderdetail() {
  9. SqlSession sqlSession = sqlSessionFactory.openSession();
  10. //獲取UserMapper的代理類
  11. OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
  12. List<OrdersExt> lists = ordersMapper.findOrdersAndOrderdetail();
  13. sqlSession.close();
  14. }
  15. }
1.3.多對多關聯查詢

其實多對多就是特殊的一對一的關聯關系。

需求分析:

查詢用戶信息及用戶購買的商品信息。

sql語句:

主表:user表

從表:orders、orderdetail、items

SELECT
        orders.`id`,
        orders.`user_id`,
        orders.`number`,
        user.`username`,
        user.`sex`,
        orderdetail.`id` detailId,
        orderdetail.`items_id`,
        orderdetail.`items_num`,
        items.`name`,
        items.`price`
        FROM
        orders,
        USER,
        orderdetail,
        items
        WHERE orders.`user_id` = user.`id`
        AND orders.`id` = orderdetail.`orders_id`
        AND orderdetail.`items_id` = items.`id`

修改user表對應的User類:


   
   
   
           
  1. public class User {
  2. private Integer id;
  3. private String username;
  4. private Date birthday;
  5. private String sex;
  6. private String address;
  7. private List<Orders> ordersLists;

修改orders表對應的Orders類:


   
   
   
           
  1. public class Orders {
  2. private Integer id;
  3. private Integer userId;
  4. private String number;
  5. private Date createtime;
  6. private String note;
  7. private List<Orderdetail> orderdetailList;

修改orderdetail表對應的Orderdetail類;


   
   
   
           
  1. public class Orderdetail {
  2. private Integer id;
  3. private Integer ordersId;
  4. private Integer itemsId;
  5. private Integer itemsNum;
  6. private Items items;

修改items表對應的iItems類:


   
   
   
           
  1. public class Items {
  2. private Integer id;
  3. private String name;
  4. private float price;
  5. private String text;
  6. private String pic;
  7. private Date createtime;

編寫Mapper接口:


   
   
   
           
  1. public interface UserMapper {
  2. public List<User> findUserAndItems();
  3. }

編寫UserMapper.xml映射文件:

查詢用戶信息及其關聯的商品信息是先查用戶信息及關聯到的訂單信息再到訂單詳情信息最后到商品信息的一個映射過程,所以在映射文件中要注意各層級的映射關系以及映射標簽的嵌套。


   
   
   
           
  1. <?xml version= "1.0" encoding= "UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace= "com.lc.mybatis.mapper.UserMapper">
  6. <!-- 多對多:查詢用戶購買商品的詳細信息 -->
  7. <resultMap type= "user" id= "userAndItems">
  8. <!-- 用戶信息 -->
  9. <id column= "user_id" property= "id"/>
  10. <result column= "username" property= "username"/>
  11. <result column= "sex" property= "sex"/>
  12. <!-- 訂單信息(一對多) -->
  13. <collection property= "ordersLists" ofType= "orders">
  14. <id column= "id" property= "id"/>
  15. <result column= "user_id" property= "userId"/>
  16. <result column= "number" property= "number"/>
  17. <!-- 訂單詳情信息(一對多) -->
  18. <collection property= "orderdetailList" ofType= "orderdetail">
  19. <id column= "detailId" property= "id"/>
  20. <result column= "items_id" property= "itemsId"/>
  21. <result column= "items_num" property= "itemsNum"/>
  22. <!-- items信息:(一對多) -->
  23. <association property= "items" javaType= "items">
  24. <id column= "items_id" property= "id"/>
  25. <result column= "name" property= "name"/>
  26. <result column= "price" property= "price"/>
  27. </association>
  28. </collection>
  29. </collection>
  30. </resultMap>
  31. <select id= "findUserAndItems" resultMap= "userAndItems">
  32. SELECT
  33. orders.`id`,
  34. orders.`user_id`,
  35. orders.`number`,
  36. user.`username`,
  37. user.`sex`,
  38. orderdetail.`id` detailId,
  39. orderdetail.`items_id`,
  40. orderdetail.`items_num`,
  41. items.`name`,
  42. items.`price`
  43. FROM
  44. orders,
  45. USER,
  46. orderdetail,
  47. items
  48. WHERE orders.`user_id` = user.`id`
  49. AND orders.`id` = orderdetail.`orders_id`
  50. AND orderdetail.`items_id` = items.`id`
  51. </select>
  52. </mapper>

加載UserMapper.xml映射文件:


   
   
   
           
  1. <!-- 加載映射文件 -->
  2. <mappers>
  3. <!-- 注冊指定包下的所有映射文件 -->
  4. < package name= "com.lc.mybatis.mapper"/>
  5. </mappers>

編寫測試類:


   
   
   
           
  1. public class UserMapperTest {
  2. private SqlSessionFactory sqlSessionFactory ;
  3. @Before
  4. public void setUp() throws IOException{
  5. InputStream inputStream = Resources.getResourceAsStream( "SqlMapConfig.xml");
  6. sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  7. }
  8. @Test
  9. public void testFindOrdersAndOrderdetail() {
  10. SqlSession sqlSession = sqlSessionFactory.openSession();
  11. //獲取UserMapper的代理類
  12. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  13. List<User> lists = userMapper.findUserAndItems();
  14. sqlSession.close();
  15. }
  16. }
1.4.對關聯查詢做出總結

關聯查詢,也就是多表查詢,查詢的結果集也不是一個表所對應的JavaBean對象所能進行直接映射的。因此,我們在進行關聯查詢要進行合理的JavaBean對象處理和擴展,保證查詢出來的結果集都有所對應的JavaBean屬性和之對應。這樣就能保證查詢出來的結果正確無誤。

在關聯查詢中我們常用的標簽有:association和collection標簽。association標簽是一對一關聯映射所需要的標簽。collection標簽是一對多所需要的標簽。在Mybatis中,可以理解為多對一也是特殊的一對一(如同:多個員工對應一個部門;但是也可以理解為一個員工對應一個部門,只不過有多個員工而已;可以理解為:在一個Employee對象中有一個department屬性;同時又多個Employee對象,每個對象中的department對應同一個部門);多對多是特殊的一對多。

在結果集映射中,我們用的結果集映射總共有兩種,分別是:resultType和resultMap;那在關聯映射的時候,我們該如何選擇使用哪種結果映射方式呢?其實只需要理解兩種映射的不同和映射原理。resultType映射時把查詢出來的結果集和對應的JavaBean屬性進行一一對應。因此,在采用resultType映射,需要映射結果集的javaBean中的所有屬性都是與查詢結果集進行相互對應的(屬性不能進行嵌套)。而使用resultMap結果集映射,則需要先聲明resultMap,后使用。先聲明resultMap就是制定查詢出來的結果集中的列數和javaBean對象中的哪些屬性進行關聯映射(屬性可以嵌套)。

二、Mybatis的延遲加載

在mybatis中只有resultMap標簽的association標簽和collection標簽具有延遲加載的功能。

延遲加載的意思是在進行關聯查詢時,利用延遲加載,先加載主信息,需要關聯信息時,再去按需加載關聯信息。這樣就會大大的提高數據庫的性能,查詢單表要比查詢多表速度要快的多。

設置延遲加載(打開延遲加載):

Mybatis默認是不開啟延遲加載的,需要我們去配置打開延遲加載。需要在全局配置文件中SqlMapConfig.xml中設置lazyLoadingEnabled、aggressiveLazyLoading


開啟延遲加載:


   
   
   
           
  1. <!-- 設置延遲加載 -->
  2. <settings>
  3. <setting name= "lazyLoadingEnabled" value= "true"/>
  4. <setting name= "aggressiveLazyLoading" value= "false"/>
  5. </settings>

上面已經在全局配置文件中打開了延遲加載,下面我們就通過一個案例來測試是否已經可以使用延遲加載了:

需求分析:

查詢訂單信息及關聯的用戶信息。

編碼實現:

編寫Javabean:


   
   
   
           
  1. public class OrdersExt extends Orders{
  2. private User user;
  3. //省略getter和setter方法
  4. }

編寫Mapper接口:


   
   
   
           
  1. public interface OrdersMapper {
  2. public List<OrdersExt> findOrdersAndUserLazyLoading();
  3. }

編寫OrdersMapper.xml配置文件:

為了使用懶加載,把剛才的需求分解成,首先查詢訂單信息,然后再按需根據id查詢用戶信息。

這樣就需要配置兩個select標簽語句;在進行關聯查詢的時候,association標簽找那個的select 是把按需查詢用戶信息的statement的id,column的作用就是把查詢出來的orders信息集合的外鍵user_id作為findUserById的入參。


   
   
   
           
  1. <?xml version= "1.0" encoding= "UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace= "com.lc.mybatis.mapper.OrdersMapper">
  6. <!-- 需求:查詢訂單信息(主信息為訂單,從信息為用戶),並且對關聯表進行懶加載 -->
  7. <!-- 聲明resultMap -->
  8. <resultMap type= "ordersExt" id= "lazyloading">
  9. <!-- 訂單信息 -->
  10. <id column= "id" property= "id"/>
  11. <result column= "user_id" property= "user_id"/>
  12. <result column= "number" property= "number"/>
  13. <!-- 用戶信息(一對一) -->
  14. <!-- select屬性:指定關聯查詢statement(即查詢用戶statement的id),然后將查詢的結果封裝到property指定的屬性中去 -->
  15. <!-- column屬性:指定查詢出來的列column屬性的值,作為statement查詢語句的入參 -->
  16. <association property= "user" select= "findUserById" column= "user_id"></association>
  17. </resultMap>
  18. <select id= "findOrdersAndUserLazyLoading" resultMap= "lazyloading">
  19. SELECT * FROM ORDERS
  20. </select>
  21. <select id= "findUserById" parameterType= "user" resultType= "user">
  22. SELECT * FROM USER WHERE id=#{id}
  23. </select>
  24. <!-- 在mybatis中,resultMap標簽 的association標簽和collection標簽具有延遲加載的功能。resultType結果映射就沒有延遲加載 -->
  25. </mapper>

編寫測試類:

通過斷點方式來測試是否使用了懶加載。在測試語句中得到lists處打斷點,通過查詢lists中的元素中的user屬性是否為空,當執行到獲取user對象后,再看lists中元素的user屬性是否為空。


   
   
   
           
  1. public class OrdersMapperTest {
  2. private SqlSessionFactory sqlSessionFactory ;
  3. @Before
  4. public void setUp() throws IOException {
  5. InputStream inputStream = Resources.getResourceAsStream( "SqlMapConfig.xml");
  6. sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  7. }
  8. @Test
  9. public void testFindOrdersAndUserLazyLoading() {
  10. SqlSession sqlSession = sqlSessionFactory.openSession();
  11. //獲取UserMapper的代理類
  12. OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
  13. List<OrdersExt> lists = ordersMapper.findOrdersAndUserLazyLoading();
  14. lists.get( 0).getUser();
  15. sqlSession.close();
  16. }
  17. }

顯然通過測試:在第一次獲取lists集合,集合中的元素中user屬性為空,當獲取user后,lists集合中元素的user屬性就不為空。

三、Mybatis的逆向工程(會用)

什么是逆向工程:

簡單解釋:就是通過數據庫中的表,自動生成java代碼;

下載逆向工程:

逆向工程的下載地址:

https://github.com/mybatis/generator/releases/tag/mybatis-generator-1.3.2


使用逆向工程:

創建項目導入jar包:


創建generator配置文件:

該配置文件放在classpath下:

該配置文件說明看注釋;該配置文件可以在下載下來的逆向工程中docs中index.html中找到;


   
   
   
           
  1. <?xml version= "1.0" encoding= "UTF-8"?>
  2. <!DOCTYPE generatorConfiguration
  3. PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  4. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
  5. <generatorConfiguration>
  6. <context id= "testTables" targetRuntime= "MyBatis3">
  7. <commentGenerator>
  8. <!-- 是否去除自動生成的注釋 true:是 : false:否 -->
  9. <property name= "suppressAllComments" value= "true" />
  10. </commentGenerator>
  11. <!--數據庫連接的信息:驅動類、連接地址、用戶名、密碼 -->
  12. <jdbcConnection driverClass= "com.mysql.jdbc.Driver"
  13. connectionURL= "jdbc:mysql://localhost:3306/mybatis" userId= "root"
  14. password= "mysql">
  15. </jdbcConnection>
  16. <!-- <jdbcConnection driverClass= "oracle.jdbc.OracleDriver"
  17. connectionURL= "jdbc:oracle:thin:@127.0.0.1:1521:yycg"
  18. userId= "yycg"
  19. password= "yycg">
  20. </jdbcConnection> -->
  21. <!-- 默認 false,把JDBC DECIMAL 和 NUMERIC 類型解析為 Integer,為 true時把JDBC DECIMAL 和
  22. NUMERIC 類型解析為java.math.BigDecimal -->
  23. <javaTypeResolver>
  24. <property name= "forceBigDecimals" value= "false" />
  25. </javaTypeResolver>
  26. <!-- targetProject:生成PO類的位置 -->
  27. <javaModelGenerator targetPackage= "cn.itcast.ssm.po"
  28. targetProject= ".\src">
  29. <!-- enableSubPackages:是否讓schema作為包的后綴 -->
  30. <property name= "enableSubPackages" value= "false" />
  31. <!-- 從數據庫返回的值被清理前后的空格 -->
  32. <property name= "trimStrings" value= "true" />
  33. </javaModelGenerator>
  34. <!-- targetProject:mapper映射文件生成的位置 -->
  35. <sqlMapGenerator targetPackage= "cn.itcast.ssm.mapper"
  36. targetProject= ".\src">
  37. <!-- enableSubPackages:是否讓schema作為包的后綴 -->
  38. <property name= "enableSubPackages" value= "false" />
  39. </sqlMapGenerator>
  40. <!-- targetPackage:mapper接口生成的位置 -->
  41. <javaClientGenerator type= "XMLMAPPER"
  42. targetPackage= "cn.itcast.ssm.mapper"
  43. targetProject= ".\src">
  44. <!-- enableSubPackages:是否讓schema作為包的后綴 -->
  45. <property name= "enableSubPackages" value= "false" />
  46. </javaClientGenerator>
  47. <!-- 指定數據庫表 -->
  48. <table tableName= "items"></table>
  49. <table tableName= "orders"></table>
  50. <table tableName= "orderdetail"></table>
  51. <table tableName= "user"></table>
  52. </context>
  53. </generatorConfiguration>

創建生成表對應類的java類:


   
   
   
           
  1. public class Generator {
  2. public static void main(String[] args) throws Exception{
  3. List<String> warnings = new ArrayList<String>();
  4. boolean overwrite = true;
  5. File configFile = new File( "config/generatorConfig.xml");
  6. ConfigurationParser cp = new ConfigurationParser(warnings);
  7. Configuration config = cp.parseConfiguration(configFile);
  8. DefaultShellCallback callback = new DefaultShellCallback(overwrite);
  9. MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
  10. myBatisGenerator.generate( null);
  11. }
  12. }

執行該類中的方法就生成了我們所需要的類:












免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM