Mybatis基础学习—关系映射

Posted ✈✈✈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis基础学习—关系映射相关的知识,希望对你有一定的参考价值。

一、模型分析

image

user和orders

user---->orders

一个用户可以创建多个订单,一对多。

orders--->user

一个订单只由一个用户创建,一对一。

 

orders和orderdetail

orders--->orderdetail

一个订单可以包括多个订单明细,因为一个订单可以购买多个商品,每个商品的购买信息在orderdetail记录,一对多关系。

orderdetail---> orders

一个订单明细只能包括在一个订单中,一对一。

 

orderdetail和items

orderdetail--->itesms

一个订单明细只对应一个商品信息,一对一。

items---> orderdetail

一个商品可以包括在多个订单明细 ,一对多。

 

二、一对一查询

1.使用resultType

     复杂查询时,单表对应的po类已不能满足输出结果集的映射。所以要根据需求建立一个扩展类来作为resultType的类型。

 

User.java

public class User implements Serializable{

	private int id;

	private String username;// 用户姓名

	private String sex;// 性别

	private Date birthday;// 生日

	private String address;// 地址

	public User(){
	}

	public User(String username,String sex,Date birthday,String address){
		this.username = username;
		this.sex = sex;
		this.birthday = birthday;
		this.address = address;
	}

	//get、set.....
}

 

Orders.java

public class Orders implements Serializable{
	
    private Integer id;

    private Integer userId;

    private String number;

    private Date createtime;

    private String note;
 
    //get、set.....
 } 

 

我们要执行如下语句:

image

 

(1)编写PO类

public class OrdersExt extends Orders{

	private String username;

	private String sex;

	private String address;

	//get、set......
}

 

(2)编写mapper接口 

public interface OrdersMapper{

	public List<OrdersExt> findOrderAndUser();
}

 

(3)编写映射文件

image

 

Test.java

	@Test
	public void testFindUsersByNameAndSex(){
		
		SqlSession sqlSession = sqlSessionFactory.openSession();
		
		OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
		
		List<OrdersExt> list = mapper.findOrderAndUser();
		
		for(OrdersExt orderExt : list){
			
			System.out.println(orderExt);
		}
		
		sqlSession.close();
	}

 

2.使用resultMap

(1)修改PO类,添加User对象

image

 

(2)编写mapper接口

image

 

(3)编写映射文件

image

image

 

一对一查询

resultType: 使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。

如果没有查询结果的特殊要求建议使用resultType。

resultMap: 需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的对象属性中。

resultMap可以实现延迟加载,resultType无法实现延迟加载。

 

三、一对多映射

(1)需求

     查询订单信息及订单明细和用户信息。

 

(2)Sql语句

确定主查询表: 订单表

确定关联查询表: 订单明细表、用户表

在一对一查询基础上添加订单明细关联表即可。

image

 

(3)修改PO类

image

 

(4)编写mapper接口

image

 

(5)编写mapper配置文件

image

collection: 定义一个一对多关系。

ofType: 指定该集合参数所映射的类型。

 

四、多对多

(1)需求

查询用户信息及用户购买的商品信息,要求将关联信息映射到主pojo的pojo属性中。

 

(2)Sql语句

查询主表: user

查询关联表: orders、orderdetail、items

image

 

(3)映射思路

将用户信息映射到user中。

在user类中添加订单列表属性List<Orders> orders,将用户创建的订单映射到orders。

在Orders中添加订单明细列表属性List<Orderdetail> detailList,将订单的明细映射到detailList。

在Orderdetail中添加Items属性,将订单明细所对应的商品映射到Items。

 

(4)修改PO类

image

 

(5)编写mapper接口

image

 

(6)编写mapper配置文件

image

image

以上是关于Mybatis基础学习—关系映射的主要内容,如果未能解决你的问题,请参考以下文章

mybatis基础系列——关联查询延迟加载一级缓存与二级缓存

mybatis基础系列——mybatis入门

Hibernate基础学习—对象-关系映射(上)

myBatis深入学习

转MyBatis学习总结——MyBatis快速入门

myBatis基础知识点