mybatis实现对象之间的关系(一对一、一对多、多对多)以及mybatis的缓存机制

一、业务需求中对象之间的关系

在实际的开发当中,不仅要对表与表之间的关系进行的详细分析,也要针对在业务意义上对象之间的关系,通常的关系为:一对一、一对多、多对多;

二、针对使用mybatis处理这三种关系

1、业务模型说明

这里用用用户表、订单表、订单详情表、商品表着四张表之间,说明对象这三种之间的关系:

mybatis实现对象之间的关系(一对一、一对多、多对多)以及mybatis的缓存机制_第1张图片

2、一对一的关系

2.1、用查询订单表的详情orders表,来说明一对一的关系(一个订单信息对应一个用户)

2.2、使用resultType和resultMap都可以实现一对一的关系的

2.21、使用resultType实现一对一的关系

resultType标签对应的结果映射到一个包装类上面,这个包装类包含着order表和user表的所有的属性信息;(很好理解啊,就是sql查询返回的数据要对应到java对象中,如果使用包装类型的设计方法就是用resultTpye,如果使用在两者中插入某一类的对象作为属性,就是用resultMap)

包装类:

public class OrdersCustom extends  Orders {
	
	//用户名称 
	private String username;
	//用户地址
	private String address;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	
	
}
映射文件.xml


	

对用的mapper接口

// 查询订单及用户信息
	public List findOrdersUserList() throws Exception;

2.22、使用resultMap来说明一对一的关系

(这里resultMap映射到orders对象后,但是里面又有user要映射,所以,相当于在orders对象映射之后又映射到user一次,相当于连续两次的映射,所以在是一对一的情况下,使用resultType)

映射到java对象

public class Orders {
	private int id;//订单id
	private int user_id;//用户id
	private String order_number;//订单号
	
	//用户信息
	private User user;

映射文件.xml


	
		
		
		
		


		
		
			
			
			
			
		




	



	

对用的mapper接口

// 查询订单及用户信息使用resultMap
	public List findOrdersUserListResultMap() throws Exception;


3、一对多的关系

完成的需求:根据订单orders查询到订单的明细orderdetail

resultMap将订单明细信息映射到Orders.java的属性中;

(实际上就是在orders的对象当中把orderdetail集合又映射了一遍)

映射的java对象中;

public class Orders {
	private int id;//订单id
	private int user_id;//用户id
	private String order_number;//订单号
	
	//用户信息
	private User user;
	
	//订单明细
	private List orderdetails;

映射文件.xml

注意,为了防止代码的可重用性,mybatis不止提供了sql片段,还提供了继承:


	
		


		
		
			
			
			
			
			


		



	
对应的mapper接口:

// 查询订单及订单明细信息
	public List findOrdersUserDetailList() throws Exception;

3、多对多关系

需求:查询所有订单信息及订单明细的商品信息

映射到的java对象:

public class Orders {
	private int id;//订单id
	private int user_id;//用户id
	private String order_number;//订单号
	
	//用户信息
	private User user;
	
	//订单明细
	private List orderdetails;
因为在   //订单明细 private List orderdetails;中有外键关联的item信息,所以这里可以使用在Orderdetail对象中设置Items的属性:

public class Orderdetail {
	private int id;//主键
	private int orders_id;//订单id
	private int item_id;//商品id
	private int item_num;//商品数量
	private Float item_price;//商品价格
	
	//商品信息
	private Items items;//明细对应的商品信息 

对应的mapper.xml


	
		
		
		
			
			
			
			
			




			
			
				
				
				
				
				
			
		
	



	

对应的mapper接口:

//查询订单及明细和商品信息
	public List findOrdersUserDetailItemList()throws Exception;

三、mybatis的缓存机制

将从数据库中查询出来的数据缓存起来,缓存介质:内存、磁盘,从缓存中取数据,而不从数据库查询,减少了数据库的操作,提高了数据处理性能。


1、mybatis的延迟加载

延迟加载意义:在需求允许的情况下,先查询单表,当需要关联其它表查询时,进行延迟加载,去关联查询;

达到目标:不需要关联信息时不查询,需要时再查询。好处:提高数据库的性能。

1.1、mybatis延迟加载的配置:

SqlMapConfig.xml中配置setting全局参数:

 

lazyLoadingEnabled:延迟加载的总开关,设置为true

aggressiveLazyLoading:设置为false,实现按需加载(将积极变为消极)


		
			
			
			
		


在mapper.xml的配置文件里配置延迟加载:(

需求:

查询订单信息,关联查询用户信息。

延迟加载需求:首次只查询订单信息,当需要关联查询用户信息时,再查询用户信息。


	
		
		
		
		
		
		

		

	

	
	

2、mybatis的一级缓存

Mybatis默认提供一级缓存,缓存范围是一个sqlSession。(也就是指的一条sql语句)

 

在同一个SqlSession中,两次执行相同的sql查询,第二次不再从数据库查询。


执行提交清除缓存测试:

如果第一次查询后,执行commit提交,mybatis会清除缓存,第二次查询从数据库查询。


一级缓存原理:

一级缓存采用Hashmap存储,mybatis执行查询时,从缓存中查询,如果缓存中没有从数据库查询。

如果该SqlSession执行commit()提交,清除缓存。


3、mybatis的二级缓存


缓存范围是跨SqlSession的,范围是mappernamespace,相同的namespace使用一个二级缓存结构。

 

需要进行参数配置让mybatis支持二级缓存

3.1、二级缓存的配置

在全局的配置文件sqlMapConfig.xml中配置:


		
			
			
		

在mapper.xml中的配置:




	
	 

3.11、使用二级缓存注意的事项

  • l实现序列化:

注意:将查询映射对象结果的pojo对象进行序列化实现 java.io.Serializable接口

  • l 如何清除缓存:

执行相同的statement,如果执行提交操作需要清除二级缓存。

 

如果想让statement执行后刷新缓存(清除缓存),在statement中设置flushCache="true" (默认值true

 

  • 设置statement是否开启二级缓存

如果让某个statement启用二级缓存,设置useCache=true(默认值为true


3.2、二级缓存原理

 

如果二缓存开启,首先从二级缓存查询数据,如果二级缓存有则从二级缓存中获取数据,如果二级缓存没有,从一级缓存找是否有缓存数据,如果一级缓存没有,查询数据库。

 


4、使用Ehcache进行二级缓存

Mybatis控制二级缓存策略,二级缓存缓存介质使用Ehcache

Ehcachemybatis进行整合。


实际上还是mybatis进行控制Ehcache,把缓存的数据存储在内存当中!

示例代码:https://github.com/libolibolibo/mybatis1217_22.git


这里附上mybatis的逆向工程(开发时可以使用该工程):https://github.com/libolibolibo/generatorSqlmapCustom



你可能感兴趣的:(mybatis,缓存,mybatis,缓存)