Java面试-MyBatis篇

1. 什么是MyBatis

  1. Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动,创建连接,创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制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标签,支持编写动态SQL语句,并可重用
- 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
- 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)
- 能够与Spring很好的集成
- 提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护
  1. 缺点
- SQL语句的编写工作量较大,尤其当字段多,关联表多时。
- SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库

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

1. #{}时预编译处理,${}是字符串替换
2. Mybatis在处理#{}时,会将sql种的#{}替换为?号,调用PreparedStatement的set方法来赋值
3. Mybatis在处理${}时,就是把${}替换成变量的值
4. 使用#{}可以有效地防止SQL注入,提高系统安全性

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

1. 第一种:通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致
2. 第二种:通过来映射字段名和实体类属性名的一一对应关系

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

  1. Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接拼写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页,比如:MySQL数据的时候,在原有SQL后面拼写limit
  2. 分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数

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

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

有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

7. 如何执行批量插入?

首先:创建一个简单的insert语句:然后在Java代码种像下面这样执行批处理插入

8. XML映射文件中,除了常见的select|insert|update|delete标签外,还有那些标签?

加上动态sql的9个标签,其中为sql片段标签,通过标签引入sql片段,为不支持自增的主键生成策略标签。

  1. if 语句 (简单的条件判断)
  2. choose (when,otherwize) ,相当于java 语言中的 switch ,与 jstl 中的choose 很类似.
  3. trim (对包含的内容加上 prefix,或者 suffix 等,前缀,后缀)
  4. where (主要是用来简化sql语句中where条件判断的,能智能的处理 and or ,不必担心多余导致语法错误)
  5. set (主要用于更新时)
  6. foreach (在实现 mybatis in 语句查询时特别有用)

9. MyBatis实现一对一有几种方式?具体是怎么操作的?

  • 有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,通过在resultMap里面配置association节点配置一对一的类就可以完成;
  • 嵌套查询是先查一个表,根据这个表里面的结果的外键id,再去另一个表里面查询数据,也是通过association配置,但另一个表的查询通过select属性配置

10.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,支持延迟加载的原理都是一样的

11.说说Mybatis的缓存机制

Mybatis

13. Mybatis中见过什么设计模式?

在这里插入图片描述

14. MyBatis中比如UserMapper.java是接口,为什么没有实现类还能调用?

使用JDK动态代理+MapperProxy。本质上调用的是MapperProxy的invoke方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值