转载请注明出处:https://oldnoop.tech/c/127.html
介绍
mybatis是对jdbc的封装,是一个dao层的框架
将面向sql的操作转变成面向对象的操作
核心类
SqlSessionFactory, SqlSession, Mapper接口类
与spring集成使用 SqlSessionFactoryBean, MapperScannerConfigurer
配置文件
配置文件和映射文件
配置文件引入映射文件
映射文件定义sql
Sql语句使用sql,select,insert,update,delete等标签,引入sql使用include 标签
sql的输入参数类型使用pamaterType,parameterMap
返回结果类型使用resultType,resultMap
动态sql
使用 where,set 可以动态处理and,或者逗号的拼接逻辑
使用if,choose,when,otherwise进行判断
连接查询
使用association关联一对一,多对一,
使用 collection 关联一对多
特殊字符
处理特殊字符,使用<![CDATA[ ]]> 包起来,也可以使用转义字符
可以使用生成器生成实体类,映射文件,Mapper接口类
获得自增长的主键
Mysql使用SELECT LAST_INSERT_ID()
Oracle 使用 select 序列.NEXTVAL from dual
与ibatis不同,
ibatis的插入方法返回值是生成的id,
mybatis 插入方法返回值是插入的数据条数,生成的id封装在插入的参数实体类对象中
分页
直接在sql语句中进行分页,分页参数 通过Mapper接口类参数传递进来
Mysql:
使用limit分页
Oracle:
使用rownum
like
Mysql:
like concat('%',${ }, '%')
oracle:
like '%'||${ }||'%'
${}和#{}的区别
${}是变量占位符,相当于是简单的字符串替换,也就是简单的字符串拼接
#{}是预编译sql语句的参数占位符,会将参数的值传进来
是否支持一对一,一对多查询
通过association配置一对一,collection配置一对多
mybatis优化
- 尽量减少 if, choose when otherwise等判断语句的使用
会造成sql中大量的空格,增加请求数据库的数据量
也会影响数据库对sql的解析速度
- 尽量使用#{},避免使用${}
会导致数据库的数据类型的解析,降低执行的速度
因为${}相当于简单的字符串拼接,比如字符串字段,拼接后sql语句中就成为数字,数据库解析sql的时候,会尝试做类型转换
- 批量插入,使用mybatis的批量插入,
主要使用foreach 标签,传入list对象
延迟加载
Mybatis仅支持association关联对象和collection关联集合对象的延迟加载
association指的就是一对一,collection指的就是一对多查询。
在Mybatis配置文件中,可以配置是否启用延迟加载
lazyLoadingEnabled=true|false
批量插入
mybatis支持批量查询,可以提高插入的速度
Mysql配置
<insert id="" useGeneratedKeys="true" parameterType="java.util.List">
<selectKey resultType="long" keyProperty="id" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey>
insert into 表名 (字段1,字段2,...字段n)
values
<foreach collection="list" item="item" index="index" separator="," >
(#{},#{},...,#{item.flag})
</foreach>
</insert>
Oracle配置
<insert id="" parameterType="java.util.List">
insert into 表名 (字段1,字段2,...,字段n)
<foreach close=")" collection="list" item="item" index="index" open="(" separator="union">
select
#{,jdbcType=VARCHAR},
#{,jdbcType=VARCHAR},
#{,jdbcType=VARCHAR}
from dual
</foreach>
</insert>
mybatis缓存
Mybatis的一级缓存是指SqlSession。一级缓存的作用域是一个SqlSession。Mybatis默认开启一级缓存。
在同一个SqlSession中,执行相同的查询SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL时两次查询中间发生了增删改操作,则SqlSession的缓存清空。
Mybatis的二级缓存是指mapper映射文件。二级缓存的作用域是同一个namespace下的mapper映射文件内容,多个SqlSession共享。Mybatis需要手动设置启动二级缓存。
在同一个namespace下的mapper文件中,执行相同的查询SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL时两次查询中间发生了增删改操作,则二级缓存清空。