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

一、表

二、实体

1.person

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

2.order

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

三、映射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. <mapper namespace="com.kerwin.mybatis.pojo.Person">
  6. <resultMap type="com.kerwin.mybatis.pojo.Person" id="personreSultMap">
  7. <id column="p_id" property="id"/>
  8. <result column="name" property="name"/>
  9. <collection property="orderList" ofType="com.kerwin.mybatis.pojo.Orders" column="pid">
  10. <id column="o_id" property="id"/>
  11. <result column="price" property="price"/>
  12. </collection>
  13. </resultMap>
  14. <select id="selectPersonFetchOrder" parameterType="int" resultMap="personreSultMap" >
  15. select p.*,o.* from person p,orders o where o.pid=p.p_id and p.p_id=#{id}
  16. </select>
  17. </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. <mapper namespace="com.kerwin.mybatis.pojo.Orders">
  6. <resultMap type="com.kerwin.mybatis.pojo.Orders" id="OrdersResultMap">
  7. <id column="o_id" property="id"/>
  8. <result column="price" property="price"/>
  9. <association property="person" javaType="com.kerwin.mybatis.pojo.Person">
  10. <id column="p_id" property="id"/>
  11. <result column="name" property="name"/>
  12. </association>
  13. </resultMap>
  14. <select id="selectOrdersFetchPerson" resultMap="OrdersResultMap">
  15. select p.*,o.* from person p,orders o where o.pid=p.p_id and o.o_id=#{id}
  16. </select>
  17. </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. <typeAliases>
  7. <typeAlias type="com.kerwin.mybatis.pojo.Author" alias="Author"/>
  8. </typeAliases>
  9. <environments default="development">
  10. <environment id="development">
  11. <transactionManager type="JDBC"/>
  12. <dataSource type="POOLED">
  13. <property name="driver" value="com.mysql.jdbc.Driver"/>
  14. <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
  15. <property name="username" value="root"/>
  16. <property name="password" value="root"/>
  17. </dataSource>
  18. </environment>
  19. </environments>
  20. <mappers>
  21. <mapper resource="com/kerwin/mybatis/pojo/AuthorMapper.xml"/>
  22. <mapper resource="com/kerwin/mybatis/pojo/PostMapper.xml"/>
  23. <mapper resource="com/kerwin/mybatis/pojo/PersonMapper.xml"/>
  24. <mapper resource="com/kerwin/mybatis/pojo/OrdersMapper.xml"/>
  25. </mappers>
  26. </configuration>

四。测试类

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

五、测试结果

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

 

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

 

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


 

 
 

mybatis 一对多和多对一的更多相关文章

  1. Java基础-SSM之mybatis一对多和多对一关系映射

    Java基础-SSM之mybatis一对多和多对一关系映射 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表)  1>.创建customers表: ...

  2. MyBatis一对多和多对多xml配置

    MyBatis一对多和多对多xml配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ma ...

  3. mybatis 一对多,多对一配置

    一. 简介: 本实例使用顾客和订单的例子做说明: 一个顾客可以有多个订单, 一个订单只对应一个顾客 二. 例子: 1. 代码结构图: 2. 建表语句: CREATE DATABASE test; US ...

  4. mybatis 一对多和多对一 简单案例笔记

    以案例说明(以下案例代码都敲过验证过) 多对一(多个学生对一个老师  即学生集合中都存一个老师对象) Mybatis多对一实现方式1: //定义Student 和 Teacher 实体 @Data p ...

  5. mybatis 一对多和多对一关联查询

    首先  数据库量表之间字段关系(没有主外键) studentmajor表的id字段对应student表里major字段 两个实体类 package com.model; import java.uti ...

  6. mybatis一对多,多对一

    假设两张表 person对order为一对多 实体类 person package com.kerwin.mybatis.pojo; import java.util.List; public cla ...

  7. Mybatis之关联关系(一对多、多对多)

    目的: Mybatis关系映射之一对多 Mybatis关系映射之多对多 Mybatis关系映射之一对多 一对多 (订单对应多个订单项) 多对一  (订单项对应一个订单) 其是映射关系的基层思维是一样的 ...

  8. 六 mybatis高级映射(一对一,一对多,多对多)

    1  订单商品数据模型 以订单商品数据为模型,来对mybaits高级关系映射进行学习.

  9. Mybatis(四) 高级映射,一对一,一对多,多对多映射

    天气甚好,怎能不学习? 一.单向和双向 包括一对一,一对多,多对多这三种情况,但是每一种又分为单向和双向,在hibernate中我们就详细解析过这单向和双向是啥意思,在这里,在重复一遍,就拿一对多这种 ...

随机推荐

  1. 队列实现 (双向循环链表 C++)

    队列是非常easy的.可是用数组实现可能更好点. . (事实上我认为数组在多个队列的时候更难) 然后我是第一次写双向循环链表.指向太乱了. 我这里是依照自己的想法.建立了一个头节点,一个尾节点,然后依 ...

  2. poj3481(splay tree 入门题)

    平衡树都能做. // // main.cpp // splay // // Created by 陈加寿 on 16/3/25. // Copyright © 2016年 chenhuan001. A ...

  3. 【BZOJ4825】[Hnoi2017]单旋 线段树+set

    [BZOJ4825][Hnoi2017]单旋 Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据结构,因为代码好写,功能 ...

  4. 《从零开始学Swift》学习笔记(Day 38)——构造函数与存储属性初始化

    原创文章,欢迎转载.转载请注明:关东升的博客 构造函数的主要作用是初始化实例,其中包括:初始化存储属性和其它的初始化.在Rectangle类或结构体中,如果在构造函数中初始化存储属性width和hei ...

  5. joisino's travel

    D - joisino's travel Time limit : 2sec / Memory limit : 256MB Score : 400 points Problem Statement T ...

  6. 用SQL语句生成唯一标识

    以前都是在代码中生成GUID值,然后保存到数据库中去,今天发现用sql也能生成GUID值,觉得很新奇,所以记下来. sellect newid();  //得到的即为GUID值 此sql内置函数返回的 ...

  7. Java实现单例模式的两种方式

    单例模式在实际开发中有很多的用途,比如我们在项目中常用的工具类,数据库等资源的连接类.这样做的好处是避免创建多个对象,占用内存资源,自始自终在内存中只有一个对象为我们服务. 单例对象一般有两种实现方式 ...

  8. 利用Google Analytics API实现自己的统计报表

    Google Analytics 简称 GA,功能实在是太强大了,正因如此,导致调研GA API花费了大量的时间,太多的名词需要梳理. 正确的学习步骤是: 首先,找个有权限的账号,登录GA(https ...

  9. Vue中使用定时器setInterval和setTimeout

    js中定时器有两种,一个是循环执行setInterval,另一个是定时执行setTimeout 一.循环执行(setInterval) 顾名思义,循环执行就是设置一个时间间隔,每过一段时间都会执行一次 ...

  10. CentOS 7.4 下安装Epel源和Nginx

    EPEL (Extra Packages for Enterprise Linux)是基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适用于RHEL.CentOS和Scientif ...