MyBatis-动态SQL

动态 SQL MyBatis 强大特性之一。极大的简化我们拼装 SQL 的操作。
动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。
MyBatis 采用功能强大的基于 OGNL 的表达式来简化操作。
if
choose (when, otherwise)
trim (where, set)
foreach

if

Mybatis_整合笔记02

choose (when, otherwise)

Mybatis_整合笔记02

trim (where, set)

where

Mybatis_整合笔记02

set

Mybatis_整合笔记02

trim

Mybatis_整合笔记02

foreach

动态 SQL 的另外一个常用的必要操作是需要对一个集合进行遍历,通常是在构建 IN 条件语句的时候

Mybatis_整合笔记02

当迭代列表、集合等可迭代对象或者数组
index 是当前 迭代的次数 item 的值是本次 迭代获取的 元素
当使用字典(或者 Map.Entry 对象的集合)
index item

bind

bind 元素可以从 OGNL 表达式中创建一个变量并将其绑定到上下文。比如

Mybatis_整合笔记02

Multi-db vendor  support

若在 mybatis 配置文件中配置了 databaseIdProvider , 则可以使用 _ databaseId 量, 这样就可以根据不同的数据库厂商构建特定的语句

Mybatis_整合笔记02

Mybatis_整合笔记02

OGNL Object Graph Navigation Language 对象图导航语言,这是一种强大

表达式语言,通过它可以非常方便的来操作对象属性。 类似于我们的ELSpEL

Mybatis_整合笔记02

访问集合伪属性:

类型

伪属性

伪属性对应的 Java 方法

ListSetMap

sizeisEmpty

List/Set/Map.size(),List/Set/Map.isEmpty()

ListSet

iterator

List.iterator()Set.iterator()

Map

keysvalues

Map.keySet()Map.values()

Iterator

nexthasNext

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 中配置

Mybatis_整合笔记02

一级缓存演示&失效情况

同一次会话期间只要查询过的数据都会保存在当前 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.jarmybatis-ehcache-1.0.3.jar

slf4j-api-1.6.1.jarslf4j-log4j12-1.6.2.jar

2 、编写 ehcache.xml 配置文件
3 、配置 cache 标签
<cache type= " org.mybatis.caches.ehcache.EhcacheCache "></cache>
参照缓存: 若想在命名空间中共享相同的缓存配置和实例。可以使用 cache-ref 元素来引用另外一个缓存。

 

Mybatis_整合笔记02

Mybatis_整合笔记02

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_整合笔记02

MyBatis-****

MyBatis Generator
简称 MBG ,是一个专门为 MyBatis 框架 使用者定制的 代码生成器 ,可以快速的根据表生成对应的映射文件,接口,以及 bean 类。支持基本的增删改查,以及 QBC 风格的条件查询。但是表连接、存储过程等这些复杂 sql 的定义需要我们手工编写
官方文档 地址

http://www.mybatis.org/generator/

官方工程 地址

https://github.com/mybatis/generator/releases

MBG使用

使用步骤:
1 )编写 MBG 的配置文件(重要几处配置)

1jdbcConnection配置数据库连接信息

  2javaModelGenerator配置javaBean的生成策略

  3sqlMapGenerator 配置sql映射文件生成策略

  4javaClientGenerator配置Mapper接口的生成策略

  5table 配置要逆向解析的数据表

  tableName:表名

  domainObjectName:对应的javaBean

2 )运行代码生成器生成 代码
注意:

Context标签

targetRuntime=“MyBatis3“可以生成带条件的增删改查

targetRuntime=“MyBatis3Simple“可以生成基本的增删改查

如果再次生成,建议将之前生成的数据删除,避免xml向后追加内容出现的问题。

MBG配置文件

Mybatis_整合笔记02

生成器代码

Mybatis_整合笔记02

测试查询:

  QBC风格的带条件查询

Mybatis_整合笔记02

扩展:MyBatis实用场景

PageHelper插件进行分

PageHelper MyBatis 中非常方便的第三方分页插件。
官方文档

https://github.com/pagehelper/Mybatis-PageHelper/blob/master/README_zh.md

我们可以对照官方文档的说明,快速的使用插件
 

使用步骤

1 、导入相关包 pagehelper-x.x.x.jar jsqlparser-0.9.5.jar
2 、在 MyBatis 全局配置文件中配置分页插件
Mybatis_整合笔记02
3 、使用 PageHelper 提供的方法进行分页
4 、可以使用更强大的 PageInfo 封装返回 结果

相关文章: