MyBatis

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

1.#{}是预编译处理, $ { }是字符串替换(#include 等,.$用于变量)

2.处理方式

Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值;(可以防止Sql注入)
Mybatis 在处理 时,就是把 {}时,就是把 时,就是把{}替换成变量的值;

3.接参方式

如果是简单类型(基本数据类型,包装类型,String,Date…)

#{}获取参数值#{}中可以随便写。
${}只能写value

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

1.批量插入的sql语句

insert into table ([列名],[列名])
VALUES
([列值],[列值]),
([列值],[列值]),
([列值],[列值]);

2.MyBatis 层面批量插入数据到数据库

	interface PersonMapper {
 public void insertBatch(@Param("list")List<Person> persion);

}

insert into person ( )
values

(null,#{item.name},#{item.sex},#{item.address})

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

在mapper xml文件中写,插入完毕后,从插入的对象中就可以获取,在insert标签中设置三个属性

useGeneratedKeys=“true”
keyProperty=“id”
keyColumn=“id”

四.Mybatis中resultmap是做什么的?

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

主要解决2方面问题

1:1和1:m查询
查询的结果集字段名称和类中属性名称不一致

五.Mybatis中resulttype和resultmap区别?

resultType主要针对的场景

如果查询结果只是返回一个简单类型,比如返回String或int,那么可以使用resultType
如果数据库表的字段名和实体对象的属性名一样时,那么也可以直接使用resultType返回结果。

resultmap主要针对的场景

1:1 1:m多表关联查询结果封装
如果数据库表的字段名和实体对象的属性名不一样时,可以使用resultmap;
如果使用resultType,需要给表字段起别名

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

SimpleExecutor:

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

ReuseExecutor:

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

BatchExecutor:

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

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

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

一级缓存

该级缓存默认开启,不能关闭;
该级缓存为SqlSession(会话)级别的缓存
以下情况将会导致该级缓存失效
在不同SqlSession中查询数据
相同SqlSession中查询数据,但查询条件不同
相同SqlSession中查询数据,但两次查询之间执行了增删改操作
同SqlSession中查询数据,但第二次查询前,程序调用SqlSession对象clearCache()方法手动清除了一级缓存

二级缓存

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

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

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

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

八.mybatis怎么调用【存储过程】?

1.在mysql中创建存储过程

DROP PROCEDURE IF EXISTS add;
DELIMITER $
CREATE PROCEDURE add(IN a INT,IN b INT,OUT c INT)
BEGIN
SELECT a+b INTO c;
END;
$

2.在mybatis中调用

@Select(“call add(#{map.a,mode=IN,jdbcType=INTEGER},#{map.b,mode=IN,jdbcType=INTEGER},#{map.d,mode=OUT,jdbcType=INTEGER})”)

@Options(statementType=StatementType.CALLABLE)
void callProcedure(@Param(“map”)Map map);
void callProcedure2(Map map);

<mapper namespace="com.example.demo.dao.CallMapper" >

    <select id="callProcedure2" statementType="CALLABLE" parameterMap="paraMap" resultType="java.lang.Integer">
        call add(?,?,?)
    </select>

    <parameterMap type="java.util.Map" id="paraMap">
        <parameter property="a" mode="IN" jdbcType="INTEGER"/>
        <parameter property="b" mode="IN" jdbcType="INTEGER"/>
        <parameter property="c" mode="OUT" jdbcType="INTEGER"/>
    </parameterMap>

</mapper>

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

if
where
set
choose(when,otherwise)
sql + include
foreach

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

支持

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

延迟加载规则

侵入式懒加载:执行对主数据的查询时,不会查询关联的对象,当访问主数据的某个属性是,就会马上执行关联对象的select查询
非入式懒加载:执行对主数据的查询时,不会查询关联的对象,当访问主数据的某个属性是,不会查询关联的对象。只有真正访问关联对象的属性时,才会执行关联对象的select查询

原理:动态代理
通过延迟加载的方式查询的对象是代理对象,并且对对象中的方法进行增强
当我们调用代理对象的方法时候,发送sql查询关联对象

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

创建PageInterceptor分页参数拦截器

就是在创建组件的时候生成代理对象( Plugin ),执行组件方法的时候拦截即可,通过暴力反射的方式增强
通过拦截器将SQL执行语句拦截,然后拼接上分页语句,之后执行拼接完整的SQL语句即可,

@Intercepts :标注在实现类上,表示这个类是一个插件的实现类。
@Signature :作为@Intercepts 的属性,表示需要增强Mybatis的某些组件中的某些方法(可以指定多个)

然后,我们只需要在配置类中注入这个Bean 即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值