MyBatis常见面试题

1、#{}和${}的区别是什么?

${}是字符串替换,相当于直接显示数据,#{}是预编译处理,相当于对数据加上双引号

即#是将传入的值当做字符串的形式,先替换为?号,然后调用PreparedStatement的set方法来赋值,而$是将传入的数据直接显示生成sql语句

--Mybatis在处理#{}时
select id,name,age from student where id =#{id}
当前端把id值1传入到后台的时候,就相当于:
select id,name,age from student where id ='1'

--Mybatis在处理${}时
select id,name,age from student where id =${id}
当前端把id值1传入到后台的时候,就相当于:
select id,name,age from student where id = 1

云南11选5_[官网首页]PS:使用#{}可以有效的防止SQL注入,提高系统安全性(语句的拼接),如果使用在order by 中就需要使用 ${}。

最大区别在于:#{} 传入值时,sql解析参数是带引号的,而${}传入值时,sql解析参数是不带引号的。

2、如何理解Mybatis?(Mybatis是什么)

Mybatis内部封装了jdbc,开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。

mybatis通过xml或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。

(3)MyBatis 支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJO映射成数据库中的记录。

3、Mybatis 中一级缓存与二级缓存的区别?

缓存:合理使用缓存是优化中最常见的方法之一,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力,同时提高系统性能。

  • 一级缓存是SqlSession级别的缓存:
    Mybatis对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存。云南11选5_[官网首页]一级缓存在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据。不同的sqlSession之间的缓存数据区域是互相不影响的。也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的。
一级缓存工作原理.png
  • 二级缓存是mapper级别的缓存:
    MyBatis的二级缓存是mapper级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能。多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。
二级缓存工作原理.png

开启二级缓存:
A.mybatis.xml配置文件中加入:

<span style="font-size:18px;"><settings>    
   <!--开启二级缓存-->    
    <setting name="cacheEnabled" value="true"/>    
</settings> </span>  

B.在需要开启二级缓存的mapper.xml中加入caceh标签

<span style="font-size:18px;"><cache/></span>  

C.让使用二级缓存的POJO类实现Serializable接口

<span style="font-size:18px;">public class User implements Serializable {}</span>  

参考:http://www.cnblogs.com/yuluoxingkong/p/8205858.html

4、使用 MyBatis 的 mapper 接口调用时有哪些要求?

A. Mapper 接口方法名和 mapper.xml 中定义的每个 sql 的 id 相同
B. Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同
C. Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同
D. Mapper.xml 文件中的 namespace 即是 mapper 接口的类路径
(平常用会用,但是面试时,会想不起来,这个常考)

5、简述一下Mybatis 的编程步骤

A.创建 SqlSessionFactory
B.通过 SqlSessionFactory 创建 SqlSession
C.通过 sqlsession 执行数据库操作
D.调用 session.commit()提交事务
E.调用 session.close()关闭会话

6、MyBatis中接口绑定有几种实现方式,是怎么实现的?

A.通过注解绑定,在接口的方法上面加上 @Select@Update等注解里面包含Sql语句来绑定(Sql语句比较简单的时候,推荐注解绑定)
B.通过xml里面写SQL来绑定, 指定xml映射文件里面的namespace必须为接口的全路径名(SQL语句比较复杂的时候,推荐xml绑定)

7、MyBatis的Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?

云南11选5_[官网首页]trim|where|set|foreach|if|choose|when|otherwise|bind等,其中为sql片段标签,通过标签引入sql片段,为不支持自增的主键生成策略标签。

8、MyBatis实现一对多有几种方式,怎么操作的?

A.联合查询:几个表联合查询,只查询一次,通过在resultMap里面配置collection节点配置一对多的类就可以完成.
B.嵌套查询:是先查一个表,根据这个表里面的结果的外键id去另外一个表里面查询数据,也是通过配置collection,但另外一个表的查询通过select节点配置。

链接:http://www.cnblogs.com/xdp-gacl/p/4264440.html

推荐一本书:《MyBatis从入门到精通__刘增辉(著).pdf》
链接:http://pan.baidu.com/s/1wm8o4ZQxiycqW5H9Vj_kuA 提取码:8i68

推荐阅读更多精彩内容