这个老师讲得很好,推荐学习。
02.SSM-mybatis-快速入门(上)_哔哩哔哩_bilibili
基础篇
第一章 mybatis-config.xml
<properties ...>
<setting ...>
<typeAliases ...>
<typeHandler ..>
<objectFactory>
<plugins>
<environments>
<mapper>
第二章 mapper.xml
2.1 一般查询
<select>
parameterType
简单类型
POJO
Map
离散类型 @Param
resultType
简单类型
POJO
Map
List 元素类型
resultMap
<id property column />
<result property column /> autoMapping
<association property javaType> 对一关联
<collection property ofType> 对多关联
分步查询 延迟加载
</select>
2.2 存储过程执行
<select statementType="CALLABLE" parameterType="map">
{ call procedure_name(
#{propertyName, mode=IN, jdbcType=VARCHAR},
#{propertyName, mode=OUT, jdbcType=INTEGER}
)
}
</select>
注意检查 procedure name必须与数据库一致。
2.3 插入/更新/删除
<insert/update/delete>
useGeneratedKeys property
selectKey before/after property
</insert/update/delete>
第三章 动态SQL
<if test=""> 条件满足时输出
</if>
<choose> 按照优先级次序多选一
<when test="">
</when>
<otherwise>
</otherwise>
</choose>
<foreach collection index item open seperator close> map时index做key
</foreach>
<trim prefix suffix prefixOverrides suffixOverrides>
</trim>
trim
标签是 MyBatis 动态 SQL 中的一个强大工具,用于动态拼接 SQL 语句,特别是在处理条件查询、更新操作时非常有用。以下是 trim
标签的详细解析和图解:
1. trim
标签的属性
trim
标签有四个主要属性:
-
prefix
:在生成的 SQL 语句前添加指定的内容。 -
suffix
:在生成的 SQL 语句后添加指定的内容。 -
prefixOverrides
:去除生成的 SQL 语句前不需要的内容。 -
suffixOverrides
:去除生成的 SQL 语句后不需要的内容。
2. 使用场景
trim
标签通常用于以下场景:
-
条件查询:动态生成
WHERE
子句。 -
更新操作:动态生成
SET
子句。 -
插入操作:动态生成
INSERT INTO (...) VALUES (...)
语句。
进阶篇
第四章 插件开发和分页插件
4.1 自定义插件
1)扩展点位置 (type,method, args)
MyBatis 允许你在映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
- ParameterHandler (getParameterObject, setParameters)
- ResultSetHandler (handleResultSets, handleOutputParameters)
- StatementHandler (prepare, parameterize, batch, update, query)
2) 实现Interceptor接口定义
// ExamplePlugin.java
@Intercepts({@Signature(
type= Executor.class,
method = "update",
args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
private Properties properties = new Properties();
@Override
public Object intercept(Invocation invocation) throws Throwable {
// implement pre processing if need
Object returnObject = invocation.proceed();
// implement post processing if need
return returnObject;
}
@Override
public void setProperties(Properties properties) {
this.properties = properties;
}
}
4.2 PageHelper插件使用
Mybatis-PageHelper/wikis/zh/HowToUse.md at master · pagehelper/Mybatis-PageHelper
1)mybatis-config.xml中引入插件配置
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
</plugin>
</plugins>
2)第一种用法PageHelper.startPage
@Test
public void testList() {
PageHelper.startPage(2, 2);
List<User> userList = userMapper.list();
PageInfo<User> pageInfo = new PageInfo<>(userList);
System.out.println(pageInfo);
}
PageHelper.startPage方法,把pageNum/pageSize存储在ThreadLocal对象中,通常情况下时线程安全的。
2)使用参数方式
想要使用参数方式,需要配置 supportMethodsArguments
参数为 true
,同时要配置 params
参数。 例如下面的配置:
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
<property name="supportMethodsArguments" value="true"/>
<property name="params" value="pageNum=pageNumKey;pageSize=pageSizeKey;"/>
</plugin>
</plugins>
在 MyBatis 方法中:
List<User> selectByPageNumSize(
@Param("user") User user,
@Param("pageNumKey") int pageNum,
@Param("pageSizeKey") int pageSize);
当调用这个方法时,由于同时发现了 pageNumKey
和 pageSizeKey
参数,这个方法就会被分页。params 提供的几个参数都可以这样使用。
除了上面这种方式外,如果 User 对象中包含这两个参数值,也可以有下面的方法:
List<User> selectByPageNumSize(User user);
当从 User 中同时发现了 pageNumKey
和 pageSizeKey
参数,这个方法就会被分页。
注意:pageNum
和 pageSize
两个属性同时存在才会触发分页操作,在这个前提下,其他的分页参数才会生效。
第五章 Mybatis cache
5.1 一级缓存和二级缓存
+-------------------+
| MyBatis 应用 |
+-------------------+
|
v
+-------------------+
| SqlSession | <---- 一级缓存(Session 级别缓存)
+-------------------+
|
v
+-------------------+
| Mapper | <---- 二级缓存(Mapper 级别缓存)
+-------------------+
一级缓存(Session 级别缓存)
-
作用范围:一级缓存是
SqlSession
级别的缓存,仅在当前SqlSession
的生命周期内有效。 -
存储位置:存储在
SqlSession
的内存中。 -
特点:
-
自动管理:MyBatis 自动维护一级缓存,无需手动配置。
-
生命周期:与
SqlSession
的生命周期一致,SqlSession
关闭后,一级缓存失效。 -
作用:减少对数据库的访问次数,提高查询效率。
-
二级缓存(Mapper 级别缓存)
-
作用范围:二级缓存是
Mapper
级别的缓存,作用于整个应用级别,多个SqlSession
可以共享二级缓存。 -
存储位置:存储在
Cache
接口的实现类中,可以是内存缓存、文件缓存或其他存储方式。 -
特点:
-
需要手动配置:需要在
Mapper
文件中配置<cache>
标签。 -
生命周期:与应用的生命周期一致,应用关闭后,二级缓存失效。
-
作用:进一步减少对数据库的访问次数,提高查询效率,适用于多用户共享的场景
-
5.2 二级cache启用条件
1)需要Cache的对象实现过java.io.Serializable接口。
2)需要在 Mapper
文件中配置 <cache>
标签。
3)需要sqlSession执行过commit() 操作。
参考文献:
尚硅谷 Mybatis3 学习视频:
02.SSM-mybatis-快速入门(上)_哔哩哔哩_bilibili
老师总结的学习笔记:
Typora-Study-Notes/MyBatis/01-MyBatis简介.md at master · JunXing-Tech/Typora-Study-Notes
Mybatis 3 官方材料: