mybatis面试题
1.MyBatis特性
1) MyBatis 是支持定制化SQL、存储过程以及高级映射的优秀的持久层框架
2) MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
3) MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录
4) MyBatis 是一个 半自动的ORM(Object Relation Mapping)框架
2.MyBatis和其它持久化层技术对比 ?
JDBC
SQL 夹杂在Java代码中耦合度高,导致硬编码内伤
维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见
代码冗长,开发效率低
Hibernate 和 JPA
操作简便,开发效率高
程序中的长难复杂 SQL 需要绕过框架
内部自动生产的 SQL,不容易做特殊优化
基于全映射的全自动框架,大量字段的 POJO 进行部分映射时比较困难。
反射操作太多,导致数据库性能下降
MyBatis
轻量级,性能出色
SQL 和 Java 编码分开,功能边界清晰。Java代码专注业务、SQL语句专注数据
开发效率稍逊于HIbernate,但是完全能够接受
3.#{}与${}的区别是什么?
#{}是预编译处理,${}是字符串替换
1.Mybatis处理#{}时,会将sql#{}转换为占位符?,然后使用PreparedStatement的set方法来赋值
2.使用#{}能有效预防sql注入,提高系统的安全性。
4.当实体类中的属性名与表中的字段名不一样,怎么办?
有两种方式:
1. 使用as 别名的方式让字段的别名与属性名一致。
2. 使用<resultMap>来映射字段名和实体类属性名的一一对应的关系
5.如何获取自动生成的(主)键值?
mapper.xml,需要使用属性useGenerateKeys="true",执行完insert方法后,会将插入到数据库的id自动设置到对象中。如果不加这个,那么执行完insert方法后,取到的id为null
<insert id="insertname" useGeneratedKeys="true" keyProperty="id">
insert into user(username,password) values (#{user.username},#{user.password})
</insert>
6.Mybatis加载mapper的方式有哪些?
4 种方式。 package、url、resource、class。 其中package的优先级最高
7.模糊查询like语句该怎么写?
<!--List<User> testMohu(@Param("mohu") String mohu);-->
<select id="testMohu" resultType="User">
<!--select * from t_user where username like '%${mohu}%'-->
<!--select * from t_user where username like concat('%',#{mohu},'%')-->
select * from t_user where username like "%"#{mohu}"%"
</select>
8.Mybatis是否支持延迟加载?
Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false
9.Xml映射文件中有哪些标签?
除了常见的select|insert|updae|delete标签之外,还有:
<resultMap>、<parameterMap>、<sql>、<include>、<selectKey>,加上动态sql的9个标签,其中<sql>为sql片段标签,通过<include>标签引入sql片段,<selectKey>为不支持自增的主键生成策略标签
10.Mybatis执行批量插入,能返回数据库主键列表吗?
这个是要看mybatis的版本的,在3.3.1之后的版本就加入了批量新增返回主键id的功能
当然对于支持的数据库就直接在insert标签后面加上useGenerateKeys和keyProperty
不支持的数据库就使用<selectKey>
11.不同的Xml映射文件,id是否可以重复?
不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复;毕竟namespace不是必须的,只是最佳实践而已
12.Mybatis全局配置文件中有哪些标签?
configuration 配置
properties 属性:可以加载
properties配置文件的信息
settings 设置:可以设置mybatis的全局属性
typeAliases 类型命名
typeHandlers 类型处理器
objectFactory 对象工厂
plugins 插件
environments 环境
environment 环境变量
transactionManager 事务管理器
dataSource 数据源
mappers 映射器
13.MyBatis的一级缓存
一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就
会从缓存中直接获取,不会从数据库重新访问
使一级缓存失效的四种情况:
1) 不同的SqlSession对应不同的一级缓存
2) 同一个SqlSession但是查询条件不同
3) 同一个SqlSession两次查询期间执行了任何一次增删改操作
4) 同一个SqlSession两次查询期间手动清空了缓存
14.MyBatis的二级缓存
二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被
缓存;此后若再次执行相同的查询语句,结果就会从缓存中获取
二级缓存开启的条件:
a>在核心配置文件中,设置全局配置属性cacheEnabled="true",默认为true,不需要设置
b>在映射文件中设置标签<cache/>
c>二级缓存必须在SqlSession关闭或提交之后有效
d>查询的数据所转换的实体类类型必须实现序列化的接口
使二级缓存失效的情况:
两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效
15.MyBatis缓存查询的顺序
先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。
如果二级缓存没有命中,再查询一级缓存
如果一级缓存也没有命中,则查询数据库
SqlSession关闭之后,一级缓存中的数据会写入二级缓存
16.MyBatis框架的缺点
SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写 SQL 语句的功底有一定要求。
SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
标签:缓存,复习,SqlSession,查询,MyBatis,二级缓存,SQL,mybatis,快速 From: https://www.cnblogs.com/zxyyds/p/16860537.html