Mybatis大全
Mybatis高级部分
添加订单表
Orders pojo对象
import java.util.Date;
public class Orders implements Serializable {
private Integer id;
private Integer userId;
private String number;
private Date ctime;
//get set方法
}
一对一查询
数据库查询结果
resultType查询
需要pojo类接收,查询结果orders表数据多,建立ordersCustom类,继承orders,添加mobileNumber和nickname属性
public class OrdersCustom extends Orders {
//添加用户信息
private String mobileNumber;
private String nickname;
public String getMobileNumber() {
return mobileNumber;
}
public void setMobileNumber(String mobileNumber) {
this.mobileNumber = mobileNumber;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
}
创建OrdersCustomMapper.xml和OrdersCustomMapper.java
resultMap
1.直接将上面的resultType别名映射
2.将订单信息直接映射在orders对象中,orders类中添加User属性,将关联查询出来的结果映射到orders对象的user属性中
public class Orders implements Serializable {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
修改OrdersCustomMapper.xml和OrdersCustomMapper.java
一对多查询
数据库查询结果
resultMap
User类中添加List属性
public class User implements Serializable {
private List<Orders> ordersList;
public List<Orders> getOrdersList() {
return ordersList;
}
public void setOrdersList(List<Orders> ordersList) {
this.ordersList = ordersList;
}
}
resultMap继承
一对多查询总结
- 使用resultMap将查询结果存储在list集合属性中
- 使用resultType查询,将结果存储在list对象中
多对多查询
参考上面 使用collection标签和association组合
延迟加载
- 什么是延迟加载?
resultMap可以实现高级映射(使用collection标签和association组合),association和collection具有延迟加载功能。先从单表查询,再需要时,查询关联表。 - 实现原理
resultType可以分成多个查询,组合。resultMap在association标签使用select和column属性
<!-- select就是延迟加载的查询关联的statementid 调用getUser()方法时开始延迟加载-->
<association property="user" javaType="com.shyb.bean.User" select="com.shyb.mapper.UserMapper.findUserById" column="userId"> column="">
sqlMapConfig.xml配置开关
<setting>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</setting>
查询缓存
- mybatis提供用于减轻数据库的压力,提高数据库的性能。
- Mybatis提供一级缓存和二级缓存。
- 操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(hashMap)存储缓存数据,不同sqlSession之间缓存数据区域互不影响(一级缓存)。
- 二级缓存是mapper级别缓存,多个sqlSession操作同一个Mapper的sql语句,数据会存储在二级缓存区域。
- 在执行sqlSession的commit操作(即增删改)时,会清空缓存
一级缓存
- mybatis默认支持一级缓存
在同一个sqlSession,查询同一条查询,查询语句一样,只会执行一次。
执行commit操作,清空了缓存,又执行一次查询。
正式开发中,是将mybatis和spring整合开发,事务控制在service中,一个service中包含多个mapper方法。
service开始执行是,开始事务,创建sqlSession对象,在方法内可以使用一级缓存,但如果执行两次service,就不执行一级缓存(service方法结束,sqlSession对象关闭,一级缓存就清空)
二级缓存
每个mapper都会有一个二级缓存(如UserMapper和OrdersMapper
按namespace区分,如果两个namespace相同,两个mapper执行同一个二级缓存)。
如果sqlSession执行相同mapper下的sql,执行commit操作,就会清空mapper下的二级缓存。
- 开启二级缓存(默认关闭)
不仅需要在sqlMapConfig.xml设置二级缓存的总开关,还需要在具体的mapper.xml中开启二级缓存。
<!-- sqlMapConfig.xml开启二级缓存 -->
<settings>
<!-- 开启二级缓存 注意:properties和settings配置放在配置文件最上面 -->
<setting name="cacheEnabled" value="true"/>
</settings>
在UserMapper.xml中开启二级缓存。
- pojo类实现序列化接口
为了将缓存数据取出执行反序列化操作,二级缓存存储介质多种多样。
insert后提交,发现又读取一次数据库(清除缓存)
- 刷新二级缓存
flushCache=“false”(默认true),一般commit操作都设置刷新(清除)缓存(避免脏读)
- 不使用二级缓存
select标签可以设置useCache=“false”,不使用缓存
mybatis整合ehcache
分布缓存
- 为了提高系统并发,一般采用分布式部署。
- mybatis二级缓存在不同服务器上单独存储,影响用户使用,因此采取分布式缓存(redis,ehcache,memcached)。
- mybatis无法实现分布式缓存。需要和其他分布式缓存数据进行处理。
- 整合方法:mybatis提供了cache接口。实现cache接口即可。mybatis有默认实现类(perpetualCache)。
<!--导入jar包-->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.1</version>
<type>pom</type>
</dependency>
整合ehcache
加入ehcache配置文件ehcache.xml
应用场景
- 访问多且对实时性要求不高
- 查询特别耗时的sql
实现方法: - 设置刷新频率(如30分钟,60分钟,24小时)
二级缓存局限性
对细粒度级别的缓存不好。(如修改一个商品价格,所有缓存全部清空)
spring和mybatis整合
整合思路
- 需要通过单例方式管理sqlSessionFactory。
spring和mybatis整合生成代理对象,使用sqlSessionFactory创建sqlSession(整合自动)
持久层的mapper交给spring管理 - 整合环境
<!-- 整合jar包-->
<!-- mybatis和spring整合jar包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!--druid数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.18</version>
</dependency>
- sqlSessionFactory配置
添加applicationContext.xml配置文件,配置sqlSessionFactory和数据源
- mapper代理
mybatis逆向工程
逆向工程