zoukankan      html  css  js  c++  java
  • mybatis 一对多和多对一

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

    一、表

    二、实体

    1.person

    [java] view plain copy
     
    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
    [java] view plain copy
     
    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

    [html] view plain copy
     
    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

    [html] view plain copy
     
    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

    [html] view plain copy
     
    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>  

    四。测试类
    [java] view plain copy
     
    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,导致测试结果级联出来的多一直只有一条数据,具体如下:


     

     
     
  • 相关阅读:
    微信小程序解析xml
    微信小程序获取openid
    PHPExcel-1.8导出
    期末复习--实用回归分析
    一元线性回归
    链表
    WSL 配置oh-my-zsh
    Introduction to Computer Science and Programming in Python chap2
    树莓派的一些记录
    Top
  • 原文地址:https://www.cnblogs.com/cai170221/p/7323365.html
Copyright © 2011-2022 走看看