1. 动态sql
<where> <if test="">
<set> <if test="">
<foreach collection="集合" item="临时变量名" open="(" close=")" separater=",">
  1. ${} #{}
    区别
  • ${} 直接拼接字符串, #{}只是将值替换为?
  • ${} 有注入攻击问题
  • ${} 可以代替sql中的任意部分, #{} 只能代替值
  • ${} 里可以做简单运算, #{} 不能运算
map.put("page", 1);
map.put("rows", 5);
<select id="" parameterType="map">
select * from student limit ${(page-1)*rows}, ${rows}
</select>
  1. xml 如果存在特殊字符
  • 转义: < 要转为 <
  • CDATA块 <![CDATA[ 内容 ]]>
  1. 接口方式的映射
  • 首先定义 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. 学习资料