关于MyBatis的面试题

了解MyBatis

MyBatis 本是 Apache 的一个开源项目——iBatis,2010 年这个项目由 Apache Software Foundation 迁移到了 Google Code,并且改名为 MyBatis。

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。(来自百度百科)
常见的持久层框架还有Herbernate。

面试题:

  • Hibernate 和 MyBatis 的区别
    1)sql 优化方面
    Hibernate 不需要编写大量的 SQL,就可以完全映射,提供了日志、缓存、级联(级联比 MyBatis 强大)等特性,此外还提供 HQL(Hibernate Query Language)对 POJO 进行操作。但会多消耗性能。
    MyBatis 手动编写 SQL,支持动态 SQL、处理列表、动态生成表名、支持存储过程。工作量相对大些。
    2)开发方面
    MyBatis 是一个半自动映射的框架,因为 MyBatis 需要手动匹配 POJO、SQL 和映射关系。
    Hibernate 是一个全表映射的框架,只需提供 POJO 和映射关系即可。
    3)Hibernate 优势
    Hibernate 的 DAO 层开发比 MyBatis 简单,Mybatis 需要维护 SQL 和结果映射。
    Hibernate 对对象的维护和缓存要比 MyBatis 好,对增删改查的对象的维护要方便。
    Hibernate 数据库移植性很好,MyBatis 的数据库移植性不好,不同的数据库需要写不同 SQL。
    Hibernate 有更好的二级缓存机制,可以使用第三方缓存。MyBatis 本身提供的缓存机制不佳。
    4)Mybatis优势
    MyBatis 可以进行更为细致的 SQL 优化,可以减少查询字段。
    MyBatis 容易掌握,而 Hibernate 门槛较高。

    总的来说,MyBatis 是一个小巧、方便、高效、简单、直接、半自动化的持久层框架,Hibernate 是一个强大、方便、高效、复杂、间接、全自动化的持久层框架。

    所以对于性能要求不太苛刻的系统,比如管理系统、ERP 等推荐使用 Hibernate,而对于性能要求高、响应快、灵活的系统则推荐使用 MyBatis。

  • #{}和${}有什么区别
    动态 sql 是 mybatis 的主要特性之一,在 mapper 中定义的参数传到 xml 中之后,在查询之前 mybatis 会对其进行动态解析。mybatis 为我们提供了两种支持动态 sql 的语法:#{} 以及 ${}。
    #{} 表示预编译处理
    ${} 是一个占位符,直接替换字符串
    预处理编译的意思是把sql语句提前编译一下,防止sql注入(恶意输入特殊字符),俺去那行更高

  • 实体类中的属性名和表中的字段名不一样 ,怎么办 ?
    < resultMap >标签来映射属性名和表字段的关系,property是属性名,column是表中的字段名

  <resultMap type=”me.gacl.domain.order” id=”orderresultmap”>
        <!–用id属性来映射主键字段–>
        <id property=”id” column=”order_id”>
        <!–用result属性来映射非主键字段,property为实体类属性名,column为数据表中的属性–>
        <result property = “orderno” column =”order_no”/>
        <result property=”price” column=”order_price” />
    </reslutMap>
  • Mybatis中除了select update insert delete之外还有哪些标签
 //映射实体类属性和表中字段关系的
<resultMap>
<id></id>
<result></result>
</resultMap>

<if test="name!=null and name!=''"></if> //if标签常用来动态判断某个字段是否为空
<if test="name=='1'.toString()"></if> //比较字符串的时候
//mybatis是用OGNL表达式来解析的,在OGNL的表达式中'1'会被解析成字符,java是强类型的,char和一个string会导致不等,单个的字符要写到双引号里面或者使用.toString()才行

<sql id="selectParam"> //定义一些常用的sql语句,直接使用<include>调用
<include refid="selectParam"> //通常搭配<sql>使用的

<choose>
	<when>...</when>
	<when>...</when>
	<otherwise>...</otherwise>
</choose>
//这三个标签一般搭配使用,只选择一个when中的语句执行,如果when都不符合,执行otherwise标签

<trim prefix="SET" suffixOverrides=","></trim>
//trim标签可以代替set prefix是前缀

//配置关联关系的标签:
<assoiaction>一对一
<colleaction>一对多
  • date、datetime、timestamp的区别
    date的精确度只能到天
    datetime和timestamp的精确度可以达到秒,但是他们也有不同
    1、存储空间不同 datetime占8字节,timestamp占4字节
    2、范围不同 datetime1000年-9999年,timestamp是1970-2038
    3、创建索引的话速度不同 timestamp更小更轻量,索引性能更高

  • MyBatis的缓存机制
    对于任何一个持久层框架来说缓存是很重要的,MyBatis也有缓存机制,主要是为了提升查询效率的。
    MyBatis中定义了两种级别的缓存:

    • 一级缓存
      也叫本地缓存,属于sqlSession级别的,一级缓存是默认开启的。
      MyBatis在开启一次数据库会话时,会创建一个sqlSession对象,当会话结束时,sqlSesstion对象也会被释放掉。
      一次数据库连接,对应一次会话,也就是一级缓存保存数据的范围,查询到的数据会放到一级缓存中,方便取出,不用连接数据库了。

      sqlSession调用close()方法,关闭一级缓存不可使用;
      sqlSession调用clearCache()方法,清空一级缓存;
      sqlSession中执行了任一次(update、insert、delect)都会清空缓存。

    • 二级缓存
      一级缓存的范围只包括一次会话期间,比较小,所以还有一个二级缓存的概念。
      二级缓存也叫全局缓存,对应的是namespace级别的,也就是一个xml文件

      <mapper namespace="com.spring.mapper.StudentMapper"></mapper>
      

      SqlSessionFactory层面上的二级缓存默认是不开启的,二级缓存的开启需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的。 也就是要求实现Serializable接口,配置方法很简单,只需要在映射XML文件配置就可以开启缓存了,如果我们配置了二级缓存就意味着:

      映射语句文件中的所有select语句将会被缓存。
      映射语句文件中的所有的insert、update和delete语句会刷新缓存。

      开启二级缓存:

       <cache eviction="LRU" flushInterval="100000" readOnly="true" size="1024" type=" "/>
       <!--
              eviction:代表的是缓存回收策略,目前MyBatis提供以下策略。
              (1) LRU:最近最少使用的,一处最长时间不用的对象
              (2) FIFO:先进先出,按对象进入缓存的顺序来移除他们
              (3) SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象
              (4) WEAK:弱引用,更积极的移除基于垃圾收集器状态和弱引用规则的对象。这里采用的是LRU,
                      移除最长时间不用的对形象
      
              flushInterval:刷新间隔时间,多长久清空一次缓存,单位为毫秒,这里配置的是100秒刷新,如果你不配置它,那么当
              SQL被执行的时候才会去刷新缓存。
      
              size:引用数目,一个正整数,代表缓存最多可以存储多少个对象,不宜设置过大。设置过大会导致内存溢出。
              这里配置的是1024个对象
      
              readOnly:只读,意味着缓存数据只能读取而不能修改,这样设置的好处是我们可以快速读取缓存,缺点是我们没有
              办法修改缓存,他的默认值是false,不允许我们修改
          -->
      

查处的数据会默认先被放进一级缓存中,只有会话提交或者是关闭后,一级缓存中的数据会转移到二级缓存中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值