面经集合


MyBatis

[TOC]

15.  Mybatis

15.1. 

15.1.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 对象并返回。

15.1.2.  mybatis的优缺点

优点:

1.  基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在 XML 里,解除 sql 与程序代码的耦合,便于统一管理;提供 XML 标签,支持编写动态 SQL 语句,并可重用。

2.  与 JDBC 相比,减少了 50%以上的代码量,消除了 JDBC 大量冗余的代码,不需要手动开关连接;

3.  很好的与各种数据库兼容(因为 MyBatis 使用 JDBC 来连接数据库,所以只要 JDBC 支持的数据库 MyBatis 都支持)。

4.  能够与 Spring 很好的集成;

5.  提供映射标签,支持对象与数据库的 ORM 字段关系映射;提供对象关系映射标签,支持对象关系组件维护。

缺点:

1.  SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写 SQL 语句的功底有一定要求。

2.  SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库

15.1.3.  mybatis的适用场合

1.  MyBatis 专注于 SQL 本身,是一个足够灵活的 DAO 层解决方案。

2.  对性能的要求很高,或者需求变化较多的项目,如互联网项目。

15.1.4.  #{}与${}的区别

{}是预编译处理,${}是字符串替换。

Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set 方法来赋值;

Mybatis 在处理${}时,就是把${}替换成变量的值。使用#{}可以有效的防止 SQL 注入,提高系统安全性

15.1.5.  实体类中的属性名和表中字段名不一样怎么办

1.  通过在查询的 sql 语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。

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

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

15.1.6.  模糊查询like语句

在sql语句中添加通配符。

15.1.7.  xml文件对应dao的工作原理

Dao 接口即 Mapper 接口。接口的全限名,就是映射文件中的 namespace 的 值;接口的方法名,就是映射文件中 Mapper 的 Statement 的 id 值;接口方法内的参数,就是传递给 sql 的参数。

Mapper 接口是没有实现类的,当调用接口方法时,接口名+方法名拼接字符串作为 key值,可唯一定位一个 sql 语句。在 Mybatis 中,每一个标签,都会被解析为一个 MapperStatement 对象。

15.1.8.  dao接口参数不同时能重载吗?

是不能重载的,因为是使用 全限名+方法名 的保存和寻找策略。

15.1.9.  mybatis分页机制

Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而

非物理分页

15.1.10.  mybatis分页插件的原理

分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql,根据 dialect 方言,添加对应的物理分页语句和物理分页参数。

15.1.11.  如何执行批量插入

foreach循环

15.1.12.  如何获取自动生成的主键值

insert 方法总是返回一个 int 值 ,这个值代表的是插入的行数。

如果采用自增长策略,自动生成的键值在 insert 方法执行完后可以被设置到传入的参数对象中

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

1.  在mapper接口上添加多个参数

2.  把参数封装到map中,传递参数的时候使用map

15.1.14.  mybatis动态sql的作用、执行原理、有哪些

动态 sql 可以在 Xml 映射文件内,以标签的形式编写动态 sql,执行原理是根据表达式的值完成逻辑判断并动态拼接 sql 的功能。

foreach、if、set、choose、when等

15.1.15.  xml文件常见标签

15.1.16.  为什么说mybatis是半自动ORM映射工具,和全自动的区别

15.1.17.  一对一、一对多的关联查询

15.1.18.  mybatis实现一对一的方式

1.  联合查询,通过几个表联合查询,只查询一次得到全部结果,配置的是association

2.  嵌套查询,先查询一个表,根据其返回结果去查询另一个表

15.1.19.  mybatis实现一对多的方式

1.  联合查询,通过几个表联合查询,只查询一次得到全部结果,配置的是collection

2.  嵌套查询,先查询一个表,根据其返回结果去查询另一个表

15.1.20.  mybatis是否支持延迟加载

15.1.21.  mybatis的一二级缓存

15.1.22.  mybatis的接口绑定

接口绑定,就是在 MyBatis 中任意定义接口,然后把接口里面的方法和 SQL 语句绑定, 我们直接调用接口方法就可以。

接口绑定有两种实现方式:

1.  一种是通过注解绑定,就是在接口的方法上面加上@Select、@Update 等注解,里面包含 Sql 语句来绑定;

2.  另外一种就是通过 xml 里面写 SQL 来绑定, 在这种情况下,要指定 xml 映射文件里面的 namespace 必须为接口的全路径名

15.1.23.  mybatis的mapper接口调用的要求

1.  Mapper 接口方法名和 mapper.xml 中定义的每个 sql 的 id 相同;

⚫ Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 

的类型相同;

⚫ Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类

型相同;

⚫ Mapper.xml 文件中的 namespace 即是 mapper 接口的类路径

15.1.24.  mapper编写的方式

15.1.25.  简述mybati的插件运行原理

15.1.26.  w

页面列表

ITEM_HTML