MyBatis-动态SQL
•
动态
SQL
是
MyBatis
强大特性之一。极大的简化我们拼装
SQL
的操作。
•
动态
SQL
元素和使用
JSTL
或其他类似基于
XML
的文本处理器相似。
•
MyBatis
采用功能强大的基于
OGNL
的表达式来简化操作。
–
if
–
choose (when, otherwise)
–
trim (where, set)
–
foreach
if
choose (when, otherwise)
trim (where, set)
where
set
trim
foreach
•
动态
SQL
的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建
IN
条件语句的时候
。
•
当迭代列表、集合等可迭代对象或者数组
时
–
index
是当前
迭代的次数
,
item
的值是本次
迭代获取的
元素
•
当使用字典(或者
Map.Entry
对象的集合)
时
–
index
是
键
,
item
是
值
bind
•bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。比如:
Multi-db vendor support
•
若在
mybatis
配置文件中配置了
databaseIdProvider
,
则可以使用
“
_
databaseId
”
变
量,
这样就可以根据不同的数据库厂商构建特定的语句
OGNL( Object Graph Navigation Language )对象图导航语言,这是一种强大的
表达式语言,通过它可以非常方便的来操作对象属性。 类似于我们的EL,SpEL等
访问集合伪属性:
类型 | 伪属性 | 伪属性对应的 Java 方法 |
List、Set、Map | size、isEmpty | List/Set/Map.size(),List/Set/Map.isEmpty() |
List、Set | iterator | List.iterator()、Set.iterator() |
Map | keys、values | Map.keySet()、Map.values() |
Iterator | next、hasNext | Iterator.next()、Iterator.hasNext() |
MyBatis-缓存机制
•
MyBatis
包含一个非常强大的查询缓存特性
,
它可以非常方便地配置和定制
。缓存
可以极大的提升查询效率
。
•
•
MyBatis
系统中默认定义了两级缓存
。
•
一级
缓存
和
二级缓存
。
–
1
、默认情况下,只有一级缓存(
SqlSession
级别的缓存,也称为本地缓存)开启。
–
2
、二级缓存需要手动开启和配置,他是基于
namespace
级别的缓存。
–
3
、为了提高扩展性。
MyBatis
定义了缓存接口
Cache
。我们可以通过实现
Cache
接口来自定义二级缓存
一级缓存
•
一级缓存
(local cache),
即
本地缓存
,
作用域默认
为
sqlSession
。当
Session flush
或
close
后
,
该
Session
中的所有
Cache
将被清空。
•
本地缓存不能被关闭
,
但可以调用
clearCache
()
来清空本地缓存
,
或者改变缓存的作用域
.
•
在
mybatis3.1
之后
,
可以配置本地缓存的作用域
.
在
mybatis.xml
中配置
一级缓存演示&失效情况
•
同一次会话期间只要查询过的数据都会保存在当前
SqlSession
的一个
Map
中
•
key:hashCode
+
查询的
SqlId
+
编写的
sql
查询语句
+
参数
•
•
一级缓存失效的四种情况
–
1
、不同
的
SqlSession
对应不同的一级缓存
–
2
、同一个
SqlSession
但是查询条件不同
–
3
、同一个
SqlSession
两次查询期间执行了任何一次增删改操作
–
4
、同一个
SqlSession
两次查询期间手动清空了
缓存
二级缓存
•
二级缓存
(second level cache)
,全局作用域缓存
•
二级缓存默认不开启,需要手动配置
•
MyBatis
提供二级缓存的接口以及实现,缓存实现要求
POJO
实现
Serializable
接口
•
二级缓存在
SqlSession
关闭或提交
之后才会
生效
•
•
使用步骤
–
1
、全局配置文件中开启
二级
缓存
•
<setting name=
"
cacheEnabled
" value="true"/>
–
2
、需要使用二级缓存的映射文件处使用
cache
配置缓存
•
<cache
/>
–
3
、注意:
POJO
需要实现
Serializable
接口
缓存相关属性
•
eviction=“
FIFO”
:
缓存回收策略:
•
LRU –
最近最少使用的:移除最长时间不被使用的对象。
•
FIFO –
先进先出:按对象进入缓存的顺序来移除它们。
•
SOFT –
软引用:移除基于垃圾回收器状态和软引用规则的对象。
•
WEAK –
弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。
•
默认的是
LRU
。
•
flushInterval
:
刷新间隔,单位毫秒
•
默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时
刷新
•
s
ize
:
引用数目,正整数
•
代表缓存最多可以存储多少个对象,太大容易导致内存溢出
•
readOnly
:
只读,
true/false
•
true
:只读缓存
;会
给所有调用者返回缓存对象的相同实例
。
因此这些对象不能被修改。这提供了很重要的性能
优势。
•
false
:读写缓存;
会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是
false
。
缓存有关设置
•
1
、全局
setting
的
cacheEnable
:
–
配置
二级缓存的开关。一级缓存一直是打开的
。
•
2
、
select
标签的
useCache
属性:
–
配置
这个
select
是否使用二级缓存。一级缓存一直是使用
的
•
3
、
sql
标签的
flushCache
属性:
–
增删
改默认
flushCache
=true
。
sql
执行以后,会同时清空一级和
二级
缓存。查询默认
flushCache
=false
。
•
4
、
sqlSession.
clearCache
()
:
–
只是
用来清除一级缓存
。
•
5
、
当在某一个作用域
(
一级缓存
Session/
二级缓存
Namespaces)
进行了
C/U/D
操作后,默认该作用域下
所有
select
中的缓存将被
clear
。
第三方缓存整合
•
EhCache
是一个纯
Java
的进程内缓存框架,具有快速、精干等特点
,是
Hibernate
中默认的
CacheProvider
。
•
MyBatis
定义了
Cache
接口方便我们进行自定义扩展。
•
步骤:
–
1
、导入
ehcache
包,以及整合包,日志包
ehcache-core-2.6.8.jar、mybatis-ehcache-1.0.3.jar
slf4j-api-1.6.1.jar、slf4j-log4j12-1.6.2.jar
–
2
、编写
ehcache.xml
配置文件
–
3
、配置
cache
标签
–
<cache type=
"
org.mybatis.caches.ehcache.EhcacheCache
"></cache>
•
参照缓存:
若想在命名空间中共享相同的缓存配置和实例。可以使用
cache-ref
元素来引用另外一个缓存。
MyBatis-Spring整合
1、查看不同MyBatis版本整合Spring时使用的适配包; http://www.mybatis.org/spring/
2、下载整合适配包
https://github.com/mybatis/spring/releases
MyBatis-Spring | MyBatis | Spring |
1.0.0 and 1.0.1 | 3.0.1 to 3.0.5 | 3.0.0 or higher |
1.0.2 | 3.0.6 | 3.0.0 or higher |
1.1.0 or higher | 3.1.0 or higher | 3.0.0 or higher |
1.3.0 or higher | 3.4.0 or higher | 3.0.0 or higher |
•
3
、官方整合示例,
jpetstore
https://github.com/mybatis/jpetstore-6
整合关键配置
MyBatis-逆向工程
•
MyBatis
Generator
:
•
简称
MBG
,是一个专门为
MyBatis
框架
使用者定制的
代码生成器
,可以快速的根据表生成对应的映射文件,接口,以及
bean
类。支持基本的增删改查,以及
QBC
风格的条件查询。但是表连接、存储过程等这些复杂
sql
的定义需要我们手工编写
•
官方文档
地址
http://www.mybatis.org/generator/
•
官方工程
地址
https://github.com/mybatis/generator/releases
MBG使用
•
使用步骤:
–
1
)编写
MBG
的配置文件(重要几处配置)
1)jdbcConnection配置数据库连接信息
2)javaModelGenerator配置javaBean的生成策略
3)sqlMapGenerator 配置sql映射文件生成策略
4)javaClientGenerator配置Mapper接口的生成策略
5)table 配置要逆向解析的数据表
tableName:表名
domainObjectName:对应的javaBean名
–
2
)运行代码生成器生成
代码
•
注意:
Context标签
targetRuntime=“MyBatis3“可以生成带条件的增删改查
targetRuntime=“MyBatis3Simple“可以生成基本的增删改查
如果再次生成,建议将之前生成的数据删除,避免xml向后追加内容出现的问题。
MBG配置文件
生成器代码
测试查询:
QBC风格的带条件查询
扩展:MyBatis实用场景
PageHelper插件进行分页
•
PageHelper
是
MyBatis
中非常方便的第三方分页插件。
•
官方文档
:
https://github.com/pagehelper/Mybatis-PageHelper/blob/master/README_zh.md
•
我们可以对照官方文档的说明,快速的使用插件
•使用步骤
•
2
、在
MyBatis
全局配置文件中配置分页插件
。
•
•
3
、使用
PageHelper
提供的方法进行分页
•
4
、可以使用更强大的
PageInfo
封装返回
结果