MyBatis面试题

1. 什么是MyBatis

  1. MyBatis是一个半Orm框架,内部封装了JDBC,开发的时候只要关注SQL本身就行。
  2. MyBatis可以使用XML或注解来配置和映射原生信息,将POJO映射成数据库中的记录,避免了几乎所有的JDBC代码和手动设置参数来获取信息。
  3. 通过xml文件或者注解的方式将要执行的各种statement配置起来,并通过java对象和statement中的sql的动态参数配合起来映射来生成最终执行的sql语句,最后有mybatis框架执行sql并将结果映射为java对象返回,(从执行 sql 到返回 result 的过程)

2.MyBatis的优点是什么

  1. 基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,sql写在xml里,解除sql和程序耦合,便于统一管理;提供xml标签,支持动态编程,并可重用。
  2. 与JDBC相比,减少了50%以上的代码量,减少了大量的冗余。
  3. 很好的兼容数据库
  4. 能够与Spring很好的集成
  5. 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

3. MyBatis的框架缺点

1.sql编写工作量大,特别是字段多,关联表多时候,对开发人员编写sql语句的功底有一定要求。
2.sql语句依赖数据库,导致不能随意的更换数据库。

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

  • #{} 是预编译处理,${}是字符串替换
  • Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的set 方法来赋值;
  • #{}可以预防sql注入,提高系统安全性

5.当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

1.使用别名
2.通过来映射字段名和实体类属性名的一一对应的关系。

6.通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应,请问,这个 Dao 接口的工作原理是什么?Dao 接口里的方法,参数不同时,方法能重载吗

Dao接口即Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名就是映射文件中的Mapper的Statement的id值,接口内的参数,就是传递给sql的参数。
Mapper 接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符
串作为 key 值,可唯一定位一个 MapperStatement。在 Mybatis 中,每一个
、、、标签,都会被解析为一个MapperStatement 对象。

Mapper接口里的方法,是不能重载的,因为使用的全限名+方法名的保存和寻找策略,Mapper接口的工作原理是JDK动态代理。

7.Mybatis 是如何进行分页的?分页插件的原理是什么

MyBatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。

8.Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

1.第一种是使用ResultMap标签,逐一定义数据库列名和对象属性名之间的映射关系。
第二种是使用sql列的别名功能,将列的别名书写为对象属性名。

9.在 mapper 中如何传递多个参数?

1.使用Dao层的函数

public UserselectUser(String name,String area);
对应的 xml,#{0}代表接收的是 dao 层中的第一个参数,#{1}代表 dao 层中第二
参数,更多参数一致往后加即可。

<select id="selectUser"resultMap="BaseResultMap">
select * fromuser_user_t whereuser_name = #{0}
anduser_area=#{1}
</select>

2.使用@Param注解
3.多个参数封装成map传递

10.Mybatis 动态 sql 有什么用?执行原理?有哪些动态 sql?

Mybatis 提供了 9 种动态 sql 标签:trim | where | set | foreach | if | choose
| when | otherwise | bind。

11.Mybatis 的 Xml 映射文件中,不同的 Xml 映射文件,id 是否可以重复?

不同的xml映射文件,如果配置了namespace,那么id可以重复,否则不行

12.、为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?

  • Hibernate是全自动ORM映射工具,使用Hibernate查询相关联对象或者关联集合可以根据对象模型直接获取,所以他是全自动的。而MyBatis在查询关联对象或者关联集合对象时候,需要手动编写sql来完成,所以称为半自动ORM映射工具。

13.Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?

Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加载,association 指的就是一对一,collection 指的就是一对多查询。在 Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。
它的原理是,使用 CGLIB 创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用 a.getB().getName(),拦截器 invoke()方法发现 a.getB()是
null 值,那么就会单独发送事先保存好的查询关联 B 对象的 sql,把 B 查询上来,然后调用 a.setB(b),于是 a 的对象 b 属性就有值了,接着完成 a.getB().getName()方法的调用。这就是延迟加载的基本原理。
当然了,不光是 Mybatis,几乎所有的包括 Hibernate,支持延迟加载的原理都是一样的。

14.什么是 MyBatis 的接口绑定?有哪些实现方式?

接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上@Select、@Update 等注解,里面包含 Sql 语句来绑定;另外一种就是通过 xml里面写 SQL 来绑定, 在这种情况下,要指定 xml 映射文件里面的 namespace 必须为接口的全路径名。当 Sql 语句比较简单时候,用注解绑定, 当 SQL 语句比较复杂时候,用 xml 绑定,一般用 xml 绑定的比较多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值