MyBatis3一对一,一对多

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis3一对一,一对多相关的知识,希望对你有一定的参考价值。

在学习MyBatis3的过程中,文档上面一直在强调一个id的东西!在做这个实验的时候,也因为没有理解清楚id含义而导致一对多的“多”中也只有一条数据。id和result的唯一不同是id表示的结果将是当比较对象实例时用到的标识属性。这帮助来改进整体表现,特别是缓存和嵌入结果映射。所以不同数据的id应该唯一区别,不然导致数据结果集只有一条数据。

一、表

技术分享技术分享


二、实体

1.person

 

  1. package com.kerwin.mybatis.pojo;  
  2.   
  3. import java.util.List;  
  4.   
  5. public class Person {  
  6.   
  7.     private int id;  
  8.     private String name;  
  9.     private List<Orders> orderList;  
  10.   
  11.     public int getId() {  
  12.         return id;  
  13.     }  
  14.   
  15.     public void setId(int id) {  
  16.         this.id = id;  
  17.     }  
  18.   
  19.     public String getName() {  
  20.         return name;  
  21.     }  
  22.   
  23.     public void setName(String name) {  
  24.         this.name = name;  
  25.     }  
  26.   
  27.     public List<Orders> getOrderList() {  
  28.         return orderList;  
  29.     }  
  30.   
  31.     public void setOrderList(List<Orders> orderList) {  
  32.         this.orderList = orderList;  
  33.     }  
  34.   
  35.     @Override  
  36.     public String toString() {  
  37.         return "Person [id=" + id + ", name=" + name + "]";  
  38.     }  
  39.   
  40.     public Person() {  
  41.         super();  
  42.         // TODO Auto-generated constructor stub  
  43.     }  
  44.   
  45.     public Person(int id, String name, List<Orders> orderList) {  
  46.         super();  
  47.         this.id = id;  
  48.         this.name = name;  
  49.         this.orderList = orderList;  
  50.     }  
  51.   
  52. }  


2.order


  1. package com.kerwin.mybatis.pojo;  
  2.   
  3. public class Orders {  
  4.     private int id;  
  5.     private double price;  
  6.     private Person person;  
  7.       
  8.       
  9.       
  10.     public Person getPerson() {  
  11.         return person;  
  12.     }  
  13.   
  14.     public void setPerson(Person person) {  
  15.         this.person = person;  
  16.     }  
  17.   
  18.     public int getId() {  
  19.         return id;  
  20.     }  
  21.   
  22.     public void setId(int id) {  
  23.         this.id = id;  
  24.     }  
  25.   
  26.   
  27.   
  28.     public double getPrice() {  
  29.         return price;  
  30.     }  
  31.   
  32.     public void setPrice(double price) {  
  33.         this.price = price;  
  34.     }  
  35.   
  36.   
  37.       
  38.   
  39.     @Override  
  40.     public String toString() {  
  41.         return "Orders [id=" + id + ", price=" + price + "]";  
  42.     }  
  43.   
  44.     public Orders() {  
  45.         super();  
  46.         // TODO Auto-generated constructor stub  
  47.     }  
  48.   
  49. }  


三、映射mapper文件

1. PersonMapper.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.       
  6. <mapper namespace="com.kerwin.mybatis.pojo.Person">  
  7.     <resultMap type="com.kerwin.mybatis.pojo.Person" id="personreSultMap">  
  8.         <id column="p_id" property="id"/>  
  9.         <result column="name" property="name"/>  
  10.         <collection property="orderList" ofType="com.kerwin.mybatis.pojo.Orders" column="pid">  
  11.             <id column="o_id" property="id"/>  
  12.             <result column="price" property="price"/>  
  13.         </collection>  
  14.           
  15.     </resultMap>  
  16.       
  17.     <select id="selectPersonFetchOrder" parameterType="int" resultMap="personreSultMap" >  
  18.         select p.*,o.* from person p,orders o where o.pid=p.p_id and p.p_id=#{id}  
  19.     </select>  
  20.       
  21.       
  22. </mapper>  

2.     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.   
  6. <mapper namespace="com.kerwin.mybatis.pojo.Orders">  
  7.     <resultMap type="com.kerwin.mybatis.pojo.Orders" id="OrdersResultMap">  
  8.         <id column="o_id" property="id"/>  
  9.         <result column="price" property="price"/>  
  10.         <association property="person" javaType="com.kerwin.mybatis.pojo.Person">  
  11.             <id column="p_id" property="id"/>  
  12.             <result column="name" property="name"/>  
  13.         </association>  
  14.     </resultMap>  
  15.       
  16.     <select id="selectOrdersFetchPerson" resultMap="OrdersResultMap">  
  17.         select p.*,o.* from person p,orders o where o.pid=p.p_id and o.o_id=#{id}   
  18.     </select>  
  19.   
  20. </mapper>  

3.sqlMapConfig.xml

 

  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE configuration  
  3.   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
  4.   "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  5. <configuration>  
  6.   
  7. <typeAliases>  
  8.     <typeAlias type="com.kerwin.mybatis.pojo.Author" alias="Author"/>  
  9. </typeAliases>  
  10.   <environments default="development">  
  11.     <environment id="development">  
  12.       <transactionManager type="JDBC"/>  
  13.       <dataSource type="POOLED">  
  14.         <property name="driver" value="com.mysql.jdbc.Driver"/>  
  15.         <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>  
  16.         <property name="username" value="root"/>  
  17.         <property name="password" value="root"/>  
  18.       </dataSource>  
  19.     </environment>  
  20.   </environments>  
  21.   <mappers>  
  22.     <mapper resource="com/kerwin/mybatis/pojo/AuthorMapper.xml"/>  
  23.     <mapper resource="com/kerwin/mybatis/pojo/PostMapper.xml"/>  
  24.     <mapper resource="com/kerwin/mybatis/pojo/PersonMapper.xml"/>  
  25.     <mapper resource="com/kerwin/mybatis/pojo/OrdersMapper.xml"/>  
  26.   </mappers>  
  27. </configuration>  


四。测试类

 

  1. /** 
  2.  *  
  3.  */  
  4. package com.kerwin.mybatis.test;  
  5.   
  6. import java.io.InputStream;  
  7.   
  8. import org.apache.ibatis.io.Resources;  
  9. import org.apache.ibatis.session.SqlSession;  
  10. import org.apache.ibatis.session.SqlSessionFactory;  
  11. import org.apache.ibatis.session.SqlSessionFactoryBuilder;  
  12. import org.junit.BeforeClass;  
  13. import org.junit.Test;  
  14.   
  15. import com.kerwin.mybatis.pojo.Orders;  
  16. import com.kerwin.mybatis.pojo.Person;  
  17.   
  18. /** 
  19.  * @author Administrator 
  20.  *  
  21.  */  
  22. public class PersonAndOrderTest {  
  23.   
  24.     private static SqlSessionFactory sessionFactory;  
  25.       
  26.     /** 
  27.      * @throws java.lang.Exception 
  28.      */  
  29.     @BeforeClass  
  30.     public static void setUpBeforeClass() throws Exception {  
  31.         SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();  
  32.         InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");  
  33.         sessionFactory = factoryBuilder.build(inputStream);  
  34.   
  35.     }  
  36.       
  37.     //一对多,查询person(一)级联查询订单order(多)  
  38.     @Test  
  39.     public void testSelectPersonFetchOrder() throws Exception {  
  40.         SqlSession session = sessionFactory.openSession();  
  41.         Person person = session.selectOne("com.kerwin.mybatis.pojo.Person.selectPersonFetchOrder", 1);  
  42.         System.out.println(person);  
  43.         System.out.println(person.getOrderList().size());  
  44.         for(Orders orders : person.getOrderList()){  
  45.             System.out.println(orders);  
  46.         }  
  47.         session.close();  
  48.     }  
  49.       
  50.     //多对一,查询订单order(多)级联查询person(一)  
  51.     @Test  
  52.     public void testSelectOrdersFetchPerson() throws Exception{  
  53.         SqlSession session = sessionFactory.openSession();  
  54.         Orders orders = session.selectOne("com.kerwin.mybatis.pojo.Orders.selectOrdersFetchPerson", 1);  
  55.         System.out.println(orders);  
  56.         System.out.println(orders.getPerson());  
  57.         session.close();  
  58.     }  
  59.       
  60. }  

五、测试结果

1.一对多,查询person(一)级联查询订单order(多)

技术分享


2.多对一,查询订单order(多)级联查询person(一)

技术分享


注意:两张表中的主键id字段名要唯一,例如不能都写id,不然的话,在一对多查询的时候就会出现:级联出来的订单项只有一条记录。我之前就是将两张表的主键id字段名都写为id,导致测试结果级联出来的多一直只有一条数据,具体如下:

技术分享








以上是关于MyBatis3一对一,一对多的主要内容,如果未能解决你的问题,请参考以下文章

mybatis 一对多和多对一

mybatis 查询一对多 集合中没有值为啥

mybatis3.2.7应用_高级映射(一对一对多多对多)

Laravel 一对多关系和一对一关系

mybatis映射 一对一,一对多,多对多高级映射

MyBatis高级篇 - 关联查询(一对多)