mybatis3一对一,一对多

     2022-03-15     562

关键词:

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

技术分享








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

...没有级联的概念,但是可以利用集合来实现类似的功能。mybatis3.0添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联...本回答被提问者和网友采纳 查看详情

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

】Laravel一对多关系和一对一关系【英文标题】:Laravelonetomanyrelationwithaonetoonerelation【发布时间】:2018-09-2702:11:20【问题描述】:我可能做错了,但我需要一个模型来建立一对多和一对一的关系。我有以下表格:botsbot_settingsmessage... 查看详情

如何在 DynamoDB 中建模一对一、一对多和多对多关系

】如何在DynamoDB中建模一对一、一对多和多对多关系【英文标题】:Howtomodelone-to-one,one-to-manyandmany-to-manyrelationshipsinDynamoDB【发布时间】:2019-08-0417:51:57【问题描述】:在DynamoDB中对这些关系建模的最佳方法是什么?一对一的关系... 查看详情

mybatis的面试一对一,一对多,多对多的mapper.xml配置

使用springboot完成一对一,一对多:https://blog.csdn.net/KingBoyWorld/article/details/78966789传统的mapper文件中的一对一,一对多:一对一:主要是<resultMap>与<association> 一对多:主要是<collection>多对多:  查看详情

gorm关系一对一,一对多,多对多查询(代码片段)

gorm关系一对一,一对多,多对多查询gormv2版本BelongsTomysql表CREATETABLE`user`(`id`int(11)NOTNULLAUTO_INCREMENT,`name`varchar(64)NOTNULLDEFAULT\'\',`c_sn`int(11)NOTNULLDEFAULT\'0\',`created_at`datetime(3)DEFAULTNULL,`up 查看详情

mybatis查询(一对一对多)

1、一对一(1)创建实体类:Student:publicclassStudentimplementsSerializable{privatestaticfinallongserialVersionUID=1L;privateStringstudentno;privateStringsname;privateStringsex;privateStringbirthday;privateStringc 查看详情

数据库中根据数据一对一,一对多,多对多关系设计

...:     数据库实体间有三种对应关系:一对一,一对多,多对多。    一对一关系示例:一个学生对应一个学生档案材料,或者每个人都有唯一的身份证编 查看详情

一对多查找,转换为一对一维度

】一对多查找,转换为一对一维度【英文标题】:Onetomanylookup,convertedtoaonetoonedimension【发布时间】:2018-11-2001:02:33【问题描述】:我正在努力弄清楚如何将事务数据库中的一对多表结构转换为数据仓库的一对一维度。事务数据库... 查看详情

hibernate关联关系配置(一对多一对一和多对多)

第一种关联关系:一对多(多对一)"一对多"是最普遍的映射关系,简单来讲就如消费者与订单的关系。一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多。多对一:从订单的角度来说多个订单可以对应一个... 查看详情

数据库一对一对多多对多关系(代码片段)

数据库一对一、一对多、多对多关系一、首先给出三种关系的实例一对一关系实例?一个人对应一张身份证,一张身份证对应一个人一对多关系实例?一个公司的部门拥有多个职员,一个职员只能够属于某个部门多对多实例?一本图... 查看详情

hibernate一对多实例

本文向大家介绍Hibernate实例一对多的情况,可能好多人还不了解Hibernate实例一对多,没有关系,下面通过一个实例来帮助您理解Hibernate实例一对多,希望本文能教会你更多东西。先看由满江红翻译团队(RedSagaTranslateTeam)翻译的一... 查看详情

Elasticsearch 关系映射(一对一和一对多)

】Elasticsearch关系映射(一对一和一对多)【英文标题】:Elasticsearchrelationshipmappings(onetooneandonetomany)【发布时间】:2014-06-1715:54:28【问题描述】:在我的弹性搜索服务器中,我有一个索引http://localhost:9200/blog。(博客)索引包含... 查看详情

一对多和一对多的关系 laravel

】一对多和一对多的关系laravel【英文标题】:onetomanyAndonetomanyrelationshiplaravel【发布时间】:2018-06-1602:30:03【问题描述】:这是项目迁移Schema::create(\'projects\',function(Blueprint$table)$table->increments(\'id\');$table->string(\'name\');$table 查看详情

mybatis之一对多

...化策略一、mybatis之一对多在说一对多之前,顺便说一下一对一。一对一,常见的例子,比如以常见的班级例子来说,一个班主任只属于一个班级(排除某个班主任能力超群可兼任多个班级).例如:<?xmlversion="1.0"encoding="UTF-8"?><... 查看详情

如何判断一对一对多和多对多的关系

如何判断一对一、一对多和多对多的关系 查看详情

删除一对一和一对多引用 - Mongoose

】删除一对一和一对多引用-Mongoose【英文标题】:Removingone-oneandone-manyreferences-Mongoose【发布时间】:2015-12-1622:00:36【问题描述】:我有一个Assignmentschema,它引用了Groups和Projects。Assignment==Group[One-OneRelationship]Assignment==Projects[One-Man... 查看详情

一对一,一对多,多对一,自关联

1.SQL片段<sqlid="columns">stuname,stuage</sql><select>select<includerefid="columns"></include>fromstudent</select>2.一对多Dad------>Son两种方案:单条SQL<resultMapid="DadM 查看详情

hibernate一对多关联

实体之间有三种关系:1.一对一2.一对多3.多对一一对多goods类packageentity;/**货物表**/publicclassgoods{ privateintgid; privatelonggnum; privateinventoryinv; publicintgetGid(){ returngid; } publicvoidsetGid(intgid){ this.gid=gid 查看详情