MyBatis常见面试题

作者: 莫问以 | 来源:发表于2019-02-17 23:06 被阅读134次

    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
    

    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对缓存提供支持,但是在没有配置的默认情况下,它只开启一级缓存。一级缓存在操作数据库时需要构造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>  
    

    参考:https://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标签之外,还有哪些标签?

    trim|where|set|foreach|if|choose|when|otherwise|bind等,其中为sql片段标签,通过标签引入sql片段,为不支持自增的主键生成策略标签。

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

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

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

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

    相关文章

      网友评论

        本文标题:MyBatis常见面试题

        本文链接:https://www.haomeiwen.com/subject/abfneqtx.html