MyBatis3一对一,一对多

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

一、表

二、实体

1.person

[java] view plain copy

  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

[java] view plain copy

  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

[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. <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

[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. <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

[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. <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>

四。测试类

[java] view plain copy

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

时间: 2024-10-12 20:40:39

MyBatis3一对一,一对多的相关文章

多对多 一对一 一对多 主从 关联 字典

 "订单"表中的主键.  "产品"表中的主键.  一个订单可以包含多种产品 ...   ... 且每种产品可以出现在多个订单上.   课程文本 在多对多关系中,一个表中的一个记录与第二个表中的多个记录相关,第二个表中的一个记录与第一个表中的多个记录相关. 这种类型的关系需要一个称为连接表的第三个表.连接表包含另两个表中的主键,并将它们用作其外键. 例如,"订单"表和"产品"表具有多对多关系.一个订单可以包含多种产品,每种产品可

gorm 一对一 一对多 例子

gorm 一对一 一对多 例子 数据库sql CREATE TABLE `allin_asset` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `instance_id` varchar(255) DEFAULT '' COMMENT '实例ID', `instance_name` varchar(255) DEFAULT '' COMMENT '标签', `host_name` varchar(255) DEFAULT '' COMMENT

mybatis 一对一 一对多 多对多

一对一 一对多 多对多 原文地址:https://www.cnblogs.com/cwone/p/11909271.html

mysql表的一对一/一对多/多对多联系

1.数据库中的多对多关联关系一般需采用中间表的方式处理,将多对多转化为两个一对多. 2.通过表的关系,来帮助我们怎样建表,建几张表. 一对一 一张表的一条记录一定只能与另外一张表的一条记录进行对应,反之亦然. 学生表:姓名,性别,年龄,身高,体重,籍贯,家庭住址,紧急联系人 其中姓名.性别.年龄.身高,体重属于常用数据,但是籍贯.住址和联系人为不常用数据 如果每次查询都是查询所有数据,不常用的数据就会影响效率,实际又不用 常用信息表:ID(P),姓名,性别,年龄,身高,体重 不常用信息表:ID(

映射关系模板--一对一, 一对多

一对一: <!-- {1}属性, 本类与{2}的一对一, 采用基于外键的一对一映射, 本方有外键 --><many-to-one name="{1}" class="{2}" column="{1}Id" unique="true"></many-to-one> 多对一: <!--{1}属性, 本类与{2}的多对一 --> <many-to-one name="1

SQLAlchemy_定义(一对一/一对多/多对多)关系

目录 Basic Relationship Patterns One To Many One To One Many To Many Basic Relationship Patterns 基本关系模式 The imports used for each of the following sections is as follows: 下列的 import 语句,应用到接下来所有的代章节中: from sqlalchemy import Table, Column, Integer, Forei

Hibernate 映射文件的配置 核心文件的配置 一对一 一对多 多对多 hibernate实现分页 Hibernate中session的关闭问题总结

以留言系统为实例 1 .配置映射文件:首先得引入约束dtd <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 然后<hibernate-mapping></hibernate-mapping>映射标签 <

表关系(一对一,一对多,多对多)

可以在数据库图表中的表之间创建关系,以显示一个表中的列与另一个表中的列是如何相链接的. 在一个关系型数据库中,利用关系可以避免多余的数据.例如,如果设计一个可以跟踪图书信息的数据库,您需要创建一个名为 titles 的表,它用来存储有关每本书的信息,例如书名.出版日期和出版社.您也可能保存有关出版社的信息,诸如出版社的电话.地址和邮政编码.如果您打算在 titles 表中保存所有这些信息,那么对于某出版社出版的每本书都会重复该出版社的电话号码. 更好的方法是将有关出版社的信息在单独的表,publ

flask中一对一,一对多以及多对多关系的设定

一对多关系: class Grade(db.Model): id=db.Column(db.Integer,primary_key=True) name=db.Column(db.String(20),nullable=False) num = db.Column(db.Integer, default=0) time = db.Column(db.String(20), default='2018-01-01') students=db.relationship('Student',backr