Mybatis

本文围绕MyBatis展开,介绍了${}和#{}的区别、批量插入方法、插入后获取主键的方式等内容。还阐述了resultmap和resulttype的作用及区别、Executor执行器类型、一二级缓存机制、动态SQL常用标签和执行原理,以及延迟加载、分页插件原理和自定义插件编写方法。

1.Mybatis中${} 和#{}有什么区别? 

(1)#{}是预编译处理,${}是字符串替换

(2)Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PrepareStatement的set方法来复制。Mybatis在处理${}时,就是把${}替换成变量的值

(3)使用#{}可以有效的防止SQL注入,提高系统的安全性

(4)在低版本的mybatis中,如果方法的形参是简单类型,#{}获取参数值,#{}可以随便写。${}只能写value

2.Mybatis如何执行批量插入?

使用<foreach>标签遍历插入

<insert id="insertBatch" parameterType="java.util.List">
    insert into person ( <include refid="Base_Column_List" /> ) 
    values 
    <foreach collection="list" item="item" index="index" separator=",">
        (null,#{item.name},#{item.sex},#{item.address})
    </foreach>
</insert>

3.Mybatis如何在插⼊后获得主键 ?

在insert标签中设置三个属性

useGeneratedKeys="true" keyProperty="id" keyColumn="id"

插入完毕后,从插入的对象中就可以获取

4.Mybatis中resultmap是做什么的?

(1)对查询的结果进行自定义映射

(2)解决表字段名和实体类属性名不一致的问题

5.Mybatis中resulttype和resultmap区别?

(1)resultType主要针对的场景

返回结果是一个简单类型,比如String或者int,那么可以直接使用resultType

如果数据库表的字段名和实体对象的属性名一样时,那么也可以直接使用resultType返回结果。

(2)resultmap主要针对的场景

多表关联查询结果封装用resultMap

表字段名和实体类名的属性名不一样时,可以使用resultMap来解决,如果使用resultType的话需要给表字段起别名。

6.mybatis都有哪些 Executor 执行器?它们之间的区别是什么?

(1)SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。

(2)ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。简言之,就是重复使用Statement对象。

(3)BatchExecutor:执行update(没有select,JDBC批处理不支持select),将所有sql都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理。与JDBC批处理相同

7.mybatis⼀级缓存和二级缓存? 

为了提升查询效率,提高用户体验,MyBatis提供了数据缓存支持,依据数据缓存的有效范围默认定义了一级缓存和二级缓存

(1)一级缓存

该级缓存默认开启,不能关闭;

该级缓存为SqlSession级别的缓存

(2)二级缓存

该级缓存默认不开启,但如果使用二级缓存需要在每个XML映射文件中添加<cache></cache>以配置该级缓存(相应实体类要序列化)。

二级缓存可以通过在全局配置文件配置setting标签来关闭该级缓存

通过SqlSession查询数据,这些数据将会放到当前会话的一级缓存中;如果当前会话关闭(sqlSession.close),则一级缓存中的数据会被保存到二级缓存中,此后新的SqlSession将从二级缓存中查找数据;

select标签的useCache属性用于设置是否使用二级缓存,默认是true;
insert、update、delete或select标签均有flushCache属性,其中增删改默认true,即sql执行以后,会同时清空一级和二级缓存,查询默认false

8.动态sql的常⽤标签,动态sql的执⾏原理 ?

if

where 

set 

choose(when,otherwise)

sql  + include

foreach 

9.Mybatis是否支持延迟加载,延迟加载的原理是什么?

mybatis中的延迟加载,也称为懒加载,是指在进行关联查询的时候,按照设置的延迟规则推迟关联对象的select查询,mybatis延迟加载,需要借助resultMap标签中的association和collection子标签实现

原理:动态代理

通过延迟加载的方式查询的对象是代理对象,并且对对象中的方法进行增强

当我们调用代理对象的方法时候,发送sql查询关联对象

10.分页插件的原理是什么 & Mybatis如何编写一个自定义插件?

(1)原理是基于拦截器

首先,在MyBatis内部定义了一个拦截器接口,所有的插件都要实现该接口。

分页插件的原理就是使用MyBatis提供的插件接口,实现自定义插件,在插件的拦截方法内,拦截待执行的SQL,然后根据设置的dialect(方言),和设置的分页参数,重写SQL ,生成带有分页语句的SQL,执行重写后的SQL,从而实现分页

(2)编写自定义插件

只需要实现Mybatis提供的Interceptor这个接口即可,源码如下:

public interface Interceptor {
  //拦截的方法
  Object intercept(Invocation invocation) throws Throwable;
  //返回拦截器的代理对象
  Object plugin(Object target);
  //设置一些属性
  void setProperties(Properties properties);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值