MyBatis面试题集合

1、什么是Mybatis?

首先:它是一个框架
是什么框架呢?是一个半自动的对象关系映射持久层框架。
最简单话的回答:Mybatis是一个半自动的对象关系映射持久层框架。

对象关系映射Object Relation Mapping,缩写:ORM

那什么是叫半自动?什么叫对象关系映射?什么是持久层?

  • 半自动:需要手动写SQL语句 。Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。
  • 对象关系映射:这个要拆开来看,对象指的是Java对象关系指得是数据库中的关系模型,对象关系映射指的是Java对象和数据库关系模型之间建立一种对应关系。再用例子来解释一下:用一个Java的Car类,对应数据库中的一张Car表,并且类中的属性和表中的列一一对应(顺序一致)。那Car类就对应Car表,一个Car的实例就对应Car表的一行数据。
  • 持久层:可以理解成将数据保存在 数据库或者硬盘一类可以保存很长时间的设备里面。

2、Mybatis有什么特点?

  • 具有较高的SQL灵活性
  • 支持高级映射(一对一,一对多)
  • 动态SQL
  • 延迟加载和缓存

SQL灵活性:Mybatis内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建链接、创建statement等繁杂的过程,可以让程序员直接编写原生态sql语句,可以严格控制sql执行性能。
映射:Mybatis可以使用 XML注解 来配置映射原生信息,将POJO映射成数据库中的记录,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。通过XML或注解的方式将要执行的各种statement配置起来,并通过java对象和statement中sql的动态参数进行映射生成最终执行的sql语句,最后由Mybatis框架执行sql并将结果映射为java对象并返回。

3、MyBatis 的缓存有哪些?

Mybatis缓存分为一级缓存和二级缓存

  • 一级缓存:信息缓存在 session 里面,默认就有,
  • 二级缓存:信息缓存在它的命名空间,默认没有,需要自己设置。

一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,该Session中的所有Cache就将清空。

二级缓存:与一级缓存其机制相同 ,默认也是采用 PerpetualCache,HashMap存储 ,不同在于其存储作用域为Mapper(Namespace), 并且可自定义存储源,如 Ehcache。要开启二级缓存,你需要在你的 SQL 映射文件中添加一行:

使用二级缓存属性类需要实现 Serializable 序列化 接口(可用来保存对象的状态),可在它的映射文件中配置

对于缓存数据更新机制, 当某一个作用域 ( 一级缓存Session/二级缓存 Namespaces)的进行了 C/U/D 操作后, 默认该作用域下所有 select 中的缓存将被clear。

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

5、resultType与resultMap的用法与区别有哪些?

首相,MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap。

那什么时候用resultType,什么时候用resultMap?

通常,如果类里的属性名 和 表里的 字段名 一致时,可以自动的ORM
如果,表里字段的名字 和 类里属性的名字不一样时,resultType无法完成ORM,需要使用resultMap

resultType与resultMap都是用来设置返回类型

  1. resultType是直接表示返回类型
  2. resultMap则是对外部ResultMap的引用

ResultType
基本使用---- 类属性名 与 数据库字段 一一对应

 <!-- resultType的例子--通过id查找车的数据-->
<select id="getById" resultType="cn.lyh.pojo.Car">
   	select * from car where id = #{id}
</select>

ResultMap
基本使用---- 类属性名 和 数据库字段 不一样

属性描述
idresultMap的唯一标识
column库表的字段名
property实体类里的属性名
    <!--当字段名和属性名不一致时用resultMap
        属性id: 每个resultMap的唯一标识
        属性type: 要把结果ORM给哪个类的全路径
    -->
    <resultMap id="UserERM" type="cn.lyh.pojo.UserExtra">
        <!-- 描述特殊的字段,column描述表里的字段名  property描述类里的属性名  -->
        <result column="user_id" property="userId"></result>
    </resultMap>
    <select id="selectList" resultMap="UserERM">
        select * from user_extra
    </select>

注意

  1. MyBatis的每一个查询映射的返回类型都是ResultMap只是当提供的返回类型属性是resultType的时候,MyBatis会自动的给把对应的值赋给resultType所指定对象的属性,其中字段名对象属性名相同,且顺序也要相同
  2. resultType跟resultMap不能同时存在
  3. 其实在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。map<数据库字段名,值>

总结:

 - resultType:返回类型简单,如:String、int、Map,当然也可以是对象,但询出的字段在相应的pojo中必须有和它相同的字段一一对应。
 - resultMap: 适合使用返回值是自定义实体类的情况,使返回的内容更加多样化。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值