十三、Mybatis
125. mybatis 中 #{}和 ${}的区别是什么?
前者会将传入的数据当成字符串,在之前加入双引号,后者是直接将数据显示在sql中
前者会当做占位符,防sql注入,后者不能
126. mybatis 有几种分页方式?
两种,一种是内存分页,一种是物理分页
内存分页: 一次性查询出所有满足条件的数据,临时保存在集合中,通过List的subList的方式获取分页数据.
物理分页: 借助sql进行分页或者利用拦截器分页
127. RowBounds 是一次性查询全部结果吗?为什么?
不是,因为mybatis是对JDBC的封装,在JDBC的驱动中有一个Fetch Size的配置,它规定了每次最多从数据库查询多少条数据.这样做可以防止内存溢出.
128. mybatis 逻辑分页和物理分页的区别是什么?
逻辑分页一次性查询很多数据,然后再结果中检索分页的数据,消耗内存.
物理分页是从数据库查询指定条数的数据.
129. mybatis 是否支持延迟加载?延迟加载的原理是什么?
支持,在配置文件的<settings/>标签中设置<setting name=”lazyLoadingEnabled” value=”true”/>就可以激活
原理: 在调用的时候出发加载,而不是在初始化的时候加载信息.如a.getB().getName(),如果a.getB()的值为null,会触发保存好的关联B对象的sql语句查询出B,然后再调用getName().
130. 说一下 mybatis 的一级缓存和二级缓存?
- 一级缓存是SqlSession级别的,在一个sqlsession中,第一次查询缓存中是否有数据,没有就会查询数据库,并将数据保存在一级缓存中.第二次去查的时候会直接从缓存中查询.如果这中间sqlsession进行了commit操作则会清空缓存.
- 二级缓存是Mapper级别的,多个sqlsession共享,默认关闭.它基于Mapper文件的namespace,如果两个mapper的namespace相同,那么会共享缓存的数据.使用二级缓存要在配置文件中开启,并且序列化po类.
131. mybatis 和 hibernate 的区别有哪些?
mybatis灵活,可以写sql,hibernate学习困难
132. mybatis 有哪些执行器(Executor)?
- SimpleExecutor:每执行一次 update 或 select 就开启一个 Statement 对象,用完立刻关闭 Statement 对象
- ReuseExecutor:执行update或select以SQL作为key查找Statement对象,存在就使用,不存在就创建,用完后不关闭,可以重复使用
- BatchExecutor:执行update(没有select,jdbc批处理不支持select)时,将所有SQL都添加到批处理中(addBatch()),等待统一执行(executeBatch()),它缓存了多个Statement对象.
133. mybatis 分页插件的实现原理是什么?
分页插件的基本原理是使用 MyBatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的SQL,然后重写SQL,根据dialect方言,添加对应的物理分页语句和参数
134. mybatis 如何编写一个自定义插件?
只需实现Interceptor接口,并指定要拦截的方法签名
@Intercepts({
@Signature(
type=Executor.class,method="update",args={ MappedStatement.class,Object.class })})
public class ExamplePlugin implements Interceptor {
public Object intercept(Invocation invocation) throws Throwable {
//自定义实现
return invocation.proceed();
}
public Object plugin(Object target){
return Plugin.wrap(target,this)
}
public void setProperties(Properties properties){
//传入配置项
String size = properties.getProperty("size");
}
}
<!-- mybatis-config.xml -->
<plugins>
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<!-- 这里的配置项就传入setProperties方法中 -->
<property name="size" value="100">
</plugin>
</plugins>
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96999.html