mybatis

125. mybatis 中 #{}和 ${}的区别是什么?

#{}是预编译处理,对应的是jdbc中的preparedStatement
${}是sql拼接的方式,对应的是jdbc中的statement
以上两种方式主要差异在于:

  • 是否可以预防sql注入:的预编译的方式可以提交交给数据库预编译,#{}里面的值只作为参数,不会作为sql语句的一部分,所以不会有sql注入的风险;而非预编译的方式仅仅是字符串拼接的方式,就会存在sql注入。
  • 效率问题:preparedStatement的方式会先初始化sql,提交sql给数据库预编译,同一条sql多次执行效率更高;如果没有预编译的statment,每次要初始化并编译执行等操作,效率不高。

126. mybatis 有几种分页方式?

  • 数组分页
  • sql分页
  • 拦截器分页
    一般个人喜欢使用sql进行分页,更加灵活可控

127. mybatis 逻辑分页和物理分页的区别是什么?

  • 逻辑分页就是一次取出所有数据,然后依据代码逻辑分页
  • 物理分页就是通过sql语句,直接查询出所需的那一页数据

128. mybatis 是否支持延迟加载?延迟加载的原理是什么?

关联查询时用到,本人在项目中从不用关联查询

130. 说一下 mybatis 的一级缓存和二级缓存?

131. mybatis 和 hibernate 的区别有哪些?

(1)Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。
(2)Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。
(3)Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。

132. mybatis 有哪些执行器(Executor)?

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批处理相同。

133. mybatis 分页插件的实现原理是什么?

分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

134. mybatis 如何编写一个自定义插件?

Mybatis自定义插件针对Mybatis四大对象(Executor、StatementHandler 、ParameterHandler 、ResultSetHandler )进行拦截,具体拦截方式为:
Executor:拦截执行器的方法(log记录)
StatementHandler :拦截Sql语法构建的处理
ParameterHandler :拦截参数的处理
ResultSetHandler :拦截结果集的处理
Mybatis自定义插件

你可能感兴趣的:(mybatis)