Mybatis一对多和多对一的映射

来源:互联网 发布:你睡过几个男人 知乎 编辑:程序博客网 时间:2024/05/17 08:14
在学习MyBatis3的过程中,文档上面一直在强调一个id的东西!在做这个实验的时候,也因为没有理解清楚id含义而导致一对多的“多”中也只有一条数据。id和result的唯一不同是id表示的结果将是当比较对象实例时用到的标识属性。这帮助来改进整体表现,特别是缓存和嵌入结果映射。所以不同数据的id应该唯一区别,不然导致数据结果集只有一条数据。

wKioL1lRICyTRjm1AAAgZBvmUSs656.png

wKiom1lRIFSC8ZciAAAKpjanp-s355.png


二、实体

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.   

三、映射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,导致测试结果级联出来的多一直只有一条数据,具体如下:


原创粉丝点击