**

MyBatis面试题

**

1、什么是MyBatis?

MyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。

(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、Mybaits的优点:

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

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

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

(4)能够与Spring很好的集成;

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

3、MyBatis框架的缺点:

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

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

4、MyBatis框架适用场合:

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

(2)对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。

5、ORM是什么?

ORM(Object Relational Mapping),对象关系映射,是一种为了解决关系型数据库数据与简单Java对象(POJO)的映射关系的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。

6、MyBatis与Hibernate有哪些不同?

Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。

而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

(1)Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句。

(2)Mybatis直接编写原生态sql,可以严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需求变化频繁,一但需求变化要求迅速输出成果。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件,则需要自定义多套sql映射文件,工作量大。

(3)Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用hibernate开发可以节省很多代码,提高效率。

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

7、MyBatis编程步骤

1、 创建SqlSessionFactory

2、 通过SqlSessionFactory创建SqlSession

3、 通过sqlsession执行数据库操作

4、 调用sessionmit()提交事务

5、 调用session.close()关闭会话

8、MyBatis的缓存

MyBatis的缓存分为一级缓存和二级缓存,一级缓存放在session里面,默认就有,不可控制,同一SqlSession范围内的操作共享该缓存,增删改后将清空缓存;二级缓存放在它的命名空间里,默认是不打开的,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置

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

Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复? 不同的Xml映射文件,如果配置了namespace,那么id 可以重复;如果没有配置 namespace,那么id 不能重复;

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

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

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

3)Mybatis在处理 时 , 就 是 把 {}时,就是把 {}替换成变量的值。

4)使用#{}可以有效的防止SQL注入,提高系统安全性。

11、模糊查询like语句该怎么写?

第1种:在Java代码中添加sql通配符。

string wildcardname = “%smi%”;
list<name> names = mapper.selectlike(wildcardname);

<select id=”selectlike”>
 select * from foo where bar like #{value}
</select>

第2种:在sql语句中拼接通配符,会引起sql注入

string wildcardname = “smi”;
list<name> names = mapper.selectlike(wildcardname);

<select id=”selectlike”>
     select * from foo where bar like "%"${value}"%"
</select>

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

1)Mybatis使用RowBounds对象进行分页,也可以直接编写sql实现分页,也可以使用Mybatis的分页插件。

2)分页插件的原理:实现Mybatis提供的接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql。

举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10

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

第一种是使用标签,逐一定义数据库列名和对象属性名之间的映射关系。

第二种是使用sql列的别名功能,将列的别名书写为对象属性名。

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

14、使用MyBatis的mapper接口调用时有哪些要求?

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

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

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

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

15、 MyBatis内置类型别名有

16、Mybatis动态sql标签有哪些?

1)if:
适用于动态的包含where字句的一部分
if的特点是:
当if的判断条件满足时,添加if标签中的字句
当if的判断条件不满足时,什么都不添加

2)choose:
适用于:
当判断的条件为true时,执行一个语句
当判断的条件为false时,执行另一个语句

3) where的作用:
1、当where标签中的语句不为空时,会在语句之前拼接上“where”关键字
2、假如where标签中的语句是以“and”或者“or”开头,那么这个“and”或者“or”会被省略掉

4) set的作用:
1、假如set标签中的语句不为空,那么会在开头拼接“set”关键字
2、假如set标签中的语句是以“,”结尾,那么这个“,”会被去掉

5)Trim:
prefix:前缀,在赶回的字符串之前添加什么内容
suffix:后缀,在返回的字符串之后添加什么内容
prefixoverrides:当字符串以其中的内容开头时,该内容会被覆盖
suffixoverrides:当字符串以其中的内容结尾时,该内容会被覆盖

6)Foreach:
注意:当接口中方法的参数为数组或者集合时,mybatis会自动的把该参数封装成一个map
map的key为参数类型,首字母小写
默认:数组的key为“array”,集合的key为“list”,map的key为“map”
collection:参数在封装成的map中的key值
open:表示字符串以什么开始
close:表示字符串以什么结束
item:给集合中的每一个元素起的别名
separator:集合中元素的分隔符

17、MyBatis两种事务处理器类型是

在 MyBatis 中有两种事务管理器类型(也就是 type=”[JDBC|MANAGED]”):

JDBC – 这个配置直接简单使用了 JDBC 的提交和回滚设置。 它依赖于从数据源得 到的连接来管理事务范围。

MANAGED – 这个配置几乎没做什么。它从来不提交或回滚一个连接。而它会让 容器来管理事务的整个生命周期(比如 Spring 或 JEE 应用服务器的上下文) 默认 情况下它会关闭连接。 然而一些容器并不希望这样, 因此如果你需要从连接中停止 它,将 closeConnection 属性设置为 false。

18、设置实体类的别名

第一种方法,给单独的某个实体类配置别名,如同下面的形式

第二种方法,批量为某个包下的所有实体类设置别名,配置形式如下

19、 MyBatis全局配置文件中的标签

properties:属性配置
settings:设置
typeAliases:类型命名
typeHandlers:类型处理器
objectFactory:对象工厂
plugins:插件
environments:环境
enviroment:环境变量
transactionManager:事务管理器
dataSource:数据源
databaseIdProvider:数据库厂商标识
mappers:映射器
1、properties:引入外部properties配置文件的内容

2、settings:设置项,可以影响mybatis运行的行为

3、typeAliases:为java类型取一个别名

另外,我们也可以用@Alias(“名字”)注解,直接在java文件中为类取别名。注意:别名不区分大小写。

4、typeHandlers:java数据类型和数据库数据类型的桥梁。

5、plugins:拦截sql语句执行的一些步骤。

20、 如何获取自动生成的(主)键值?

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

21、Mybatis动态sql有什么用?执行原理?

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

22、在mapper中如何传递多个参数?

1)直接在方法中传递参数,xml文件用#{0} #{1}来获取

2)使用 @param 注解:这样可以直接在xml文件中通过#{name}来获取

23、MyBatis在核心处理类叫什么?

MyBatis里面的核心处理类叫做SqlSession。

24、MyBatis实现多对1的关 联

在 MyBatis 中,配置结果映射时,使用( association )标签实现多对1的关 联,标签属性用javaType

25、MyBatis实现1对多的关 联

在 MyBatis 中,配置结果映射时,使用( collection )标签实现1对多的关 联,标签属性用ofType

更多推荐

MyBatis面试题(2020)