回顾mysql
- 动态sql
<where> <if test="">
<set> <if test="">
<foreach collection="集合" item="临时变量名" open="(" close=")" separater=",">
- ${} #{}
区别
- ${} 直接拼接字符串, #{}只是将值替换为?
- ${} 有注入攻击问题
- ${} 可以代替sql中的任意部分, #{} 只能代替值
- ${} 里可以做简单运算, #{} 不能运算
map.put("page", 1);
map.put("rows", 5);
<select id="" parameterType="map">
select * from student limit ${(page-1)*rows}, ${rows}
</select>
- xml 如果存在特殊字符
- 转义: < 要转为 <
- CDATA块
<![CDATA[ 内容 ]]>
- 接口方式的映射
- 首先定义 mapper 接口
- 在 mapper 接口的抽象方法上添加相关注解:@Insert(“sql”) @Update(“sql”) @Delete(“sql”) @Select(“sql”)
- sqlSession.getMapper(接口.class) 返回接口 mapper
- 底层实现使用了
jdk 动态代理技术
, 在运行期间生成了 mapper 接口的实现类 - 接口 mapper 的限制
- 复杂的sql用接口mapper不容易实现,可以将复杂sql写在 xml mapper 当中
- mapper 接口中的方法不能重载
- 默认情况下mapper 接口中方法参数只有一个,如果有多个 a. map集合中存储多个参数 b. @Param 注解加在每个方法参数上
mybatis-config.xml
<mapper resources="xml mapper 的路径 "/>
<mapper class="接口 mapper的 包名.类名"/>
1. 复杂sql映射
除了使用 xml mapper 以外,还可以利用 @DeleteProvider @InsertProvider @SelectProvider @UpdateProvider
生成复杂sql
2. 高级映射
表列 与 属性名 不一致 ==> 给列起别名
3. 缓存
select * from student where id = 1001 student
select * from student where id = 1001
- sqlsession 自带缓存功能,缓存没有才查库,缓存中有,直接返回缓存的结果,称为一级缓存
- 在sqlsession创建时建立,sqlsession.close 时清空
- 每个sqlsession有自己独立的缓存
二级缓存
需要额外设置,但可以允许多个 sqlsession 共享缓存数据,二级缓存中的对象需要实现序列化接口
好处: 可以较大提升查询效率, 但是增删改频繁的情况下,不适合开启二级缓存
xml mapper 二级缓存的配置: 在 xml 映射文件中添加<cache/>
标签即可
接口 mapper 二级缓存的配置: 在接口上添加 @CacheNamespace 注解
4. 学习资料
- 官方文档,偏向基础 http://www.mybatis.org/mybatis-3/zh/index.html
- 阅读源码
- 在应用上更近一步 mybatis-plus 是mybatis的扩展
https://mp.baomidou.com/