2025年MyBatis面试题大全(精选120题)1~30题
1. 什么是MyBatis?它的核心组件有哪些?
答案:
MyBatis是一个半自动化的Java持久层框架,通过XML或注解配置SQL,将Java对象与数据库记录映射。核心组件包括:
- SqlSessionFactory:创建SqlSession的工厂,单例模式。
- SqlSession:执行SQL、管理事务的会话对象。
- Mapper接口:定义数据操作方法,与XML映射文件绑定。
- Configuration:存储全局配置和映射文件信息。
2. MyBatis与JDBC相比有哪些优势?
答案:
- 简化代码:避免手动处理连接、Statement、结果集解析。
- SQL与代码分离:通过XML或注解管理SQL,易于维护。
- 动态SQL:支持
<if>,<foreach>等标签灵活生成SQL。 - 缓存机制:内置一级(会话级)和二级(应用级)缓存。
- 集成Spring:通过
SqlSessionTemplate实现线程安全。
3. MyBatis的一级缓存和二级缓存有什么区别?
答案:
| 特性 | 一级缓存 | 二级缓存 |
|---|---|---|
| 作用域 | SqlSession级别 | SqlSessionFactory级别 |
| 生命周期 | 随会话创建/销毁 | 手动开启,应用全局生效 |
| 存储位置 | 内存(HashMap) | 可自定义(如Ehcache) |
| 默认状态 | 始终开启 | 需配置<cache>标签启用 |
4. #{}和${}的区别是什么?
答案:
#{}:预编译处理,防止SQL注入(如WHERE name = #{name})。${}:直接字符串替换,存在注入风险(如动态表名${tableName})。
5. 如何解决实体类属性与数据库字段名不一致的问题?
答案:
- 方式1:SQL中定义别名(如
SELECT user_name AS userName)。 - 方式2:使用
<resultMap>映射(如<result column="user_name" property="userName"/>)。
6. MyBatis的动态SQL有哪些标签?分别适用什么场景?
答案:
<if>:条件判断(如WHERE name = #{name} if name != null)。<choose>/<when>/<otherwise>:多条件分支(类似switch-case)。<foreach>:遍历集合(如IN (#{item})批量插入)。<trim>/<where>/<set>:自动处理SQL片段(如去除多余AND/OR)。
7. MyBatis如何执行批量插入?
答案:
- 方式1:使用
ExecutorType.BATCH模式:SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); try { UserMapper mapper = sqlSession.getMapper(UserMapper.class); for (User user : userList) { mapper.insert(user); } sqlSession.commit(); } finally { sqlSession.close(); } - 方式2:XML中通过
<foreach>拼接SQL(需数据库支持批量语法)。
8. MyBatis-Spring模块的作用是什么?
答案:
- 集成Spring事务管理(如
@Transactional)。 - 通过
SqlSessionTemplate解决线程安全问题。 - 支持注解方式注入Mapper(如
@Autowired private UserMapper userMapper;)。
9. MyBatis的插件机制如何实现?
答案:
- 实现
Interceptor接口,重写intercept()方法。 - 使用
@Intercepts和@Signature注解标记拦截点(如Executor.update)。 - 在
mybatis-config.xml中配置插件:<plugins> <plugin interceptor="com.example.MyPlugin"/> </plugins>
10. MyBatis如何实现分页?
答案:
- 逻辑分页:使用
RowBounds(内存分页,数据量大时性能差)。 - 物理分页:通过拦截器修改SQL(如PageHelper插件自动追加
LIMIT)。
11. MyBatis的关联查询如何实现?
答案:
- 一对一:使用
<association>(如用户与身份证)。 - 一对多:使用
<collection>(如订单与商品列表)。 - 延迟加载:配置
fetchType="lazy",按需加载关联数据。
12. MyBatis的二级缓存如何配置?
答案:
- 在Mapper XML中添加
<cache/>标签。 - 配置缓存参数(如过期时间、大小):
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/> - 实体类实现
Serializable接口(若需分布式缓存)。
13. MyBatis的SqlSessionFactory为何是单例的?
答案:
- SqlSessionFactory是线程安全的,创建成本高(需解析配置文件)。
- 单例模式可避免重复加载配置,提升性能。
14. MyBatis如何防止SQL注入?
答案:
- 优先使用
#{}预编译参数。 - 避免直接拼接
${},若必须使用需严格校验参数(如白名单过滤)。
15. MyBatis的ResultMap可以配置哪些属性?
答案:
column:数据库字段名。property:Java对象属性名。javaType:属性类型(如java.util.Date)。jdbcType:JDBC类型(如VARCHAR)。typeHandler:自定义类型处理器。
16. MyBatis的Executor类型有哪些?如何选择?
答案:
- SIMPLE:默认执行器,每次操作创建新PreparedStatement。
- REUSE:复用PreparedStatement,减少编译开销。
- BATCH:批量执行SQL,适合导入数据场景。
17. MyBatis的日志集成方式有哪些?
答案:
- 在
mybatis-config.xml中配置日志实现:<settings> <setting name="logImpl" value="SLF4J"/> </settings> - 支持Log4j、Log4j2、JDK Logging等。
18. MyBatis的二级缓存为何默认关闭?
答案:
- 避免脏数据:多会话操作时,缓存一致性难以保证。
- 灵活性:开发者可根据场景选择Ehcache、Redis等第三方缓存。
19. MyBatis如何映射枚举类型?
答案:
- 使用
typeHandler(如EnumOrdinalTypeHandler按序号映射)。 - 自定义枚举处理器:
public class EnumNameTypeHandler extends BaseTypeHandler<StatusEnum> { // 实现setNonNullParameter、getNullableResult方法 }
20. MyBatis的XML映射文件能否跨命名空间调用?
答案:
- 可以,通过
<include refid="其他文件.sql片段ID"/>复用SQL片段。
21. MyBatis的延迟加载原理是什么?
答案:
- 基于CGLIB或Javassist动态生成代理对象。
- 首次访问关联属性时触发查询(需配置
lazyLoadingEnabled=true)。
22. MyBatis如何处理数据库方言?
答案:
- 通过
<databaseIdProvider>配置多数据库支持:<databaseIdProvider type="DB_VENDOR"> <property name="MySQL" value="mysql"/> <property name="Oracle" value="oracle"/> </databaseIdProvider> - 在SQL中通过
databaseId属性区分(如<select id="..." databaseId="mysql">)。
23. MyBatis的插件可以拦截哪些接口?
答案:
Executor(执行SQL)。ParameterHandler(处理参数)。ResultSetHandler(处理结果集)。StatementHandler(操作Statement)。
24. MyBatis的批量操作如何获取主键?
答案:
- 在插入语句中配置
useGeneratedKeys="true"和keyProperty="id":<insert id="batchInsert" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user (name) VALUES <foreach collection="list" item="item" separator=","> (#{item.name}) </foreach> </insert>
25. MyBatis的ResultMap与自动映射冲突如何解决?
答案:
- 设置
<setting name="autoMappingBehavior" value="PARTIAL"/>,或显式关闭自动映射:<resultMap id="userMap" autoMapping="false"> <!-- 手动映射字段 --> </resultMap>
26. MyBatis的缓存淘汰策略有哪些?
答案:
- LRU(默认):最近最少使用。
- FIFO:先进先出。
- SOFT:基于软引用(内存敏感时回收)。
- WEAK:基于弱引用(GC时回收)。
27. MyBatis的XML映射文件是否支持继承?
答案:
- 支持,通过
<extends>继承其他ResultMap:<resultMap id="detailMap" extends="baseMap"> <!-- 扩展字段映射 --> </resultMap>
28. MyBatis如何优化大数据量查询?
答案:
- 使用分页插件(如PageHelper)。
- 避免
SELECT *,按需查询字段。 - 开启二级缓存减少数据库访问。
29. MyBatis的Mapper接口是否需要实现类?
答案:
- 不需要,MyBatis通过JDK动态代理生成接口实现类。
30. MyBatis的连接池如何配置?
答案:
- 在
mybatis-config.xml中配置<dataSource>:<dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/db"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> - 支持的类型:
POOLED(内置连接池)、UNPOOLED(无连接池)、JNDI(应用服务器管理)。
以上题目覆盖了MyBatis的核心概念、高级特性及常见问题,适合面试前系统复习。
2025年MyBatis面试题大全(精选120题)31~60题
31. MyBatis如何支持枚举类型映射?
答案:
- 通过
typeHandler实现,例如:- 内置处理器:
EnumOrdinalTypeHandler(按枚举序号映射)或EnumNameTypeHandler(按枚举名称映射)。 - 自定义处理器:实现
TypeHandler接口,处理枚举与数据库值的转换。
<resultMap id="userMap" type="User"> <result column="status" property="status" typeHandler="com.example.EnumNameTypeHandler"/> </resultMap> - 内置处理器:
32. MyBatis的动态SQL执行原理是什么?
答案:
- 基于OGNL表达式解析参数,动态拼接SQL片段。
- 执行流程:
- 解析XML中的动态标签(如
<if>,<foreach>)。 - 根据参数值生成最终SQL语句。
- 通过
Executor执行拼接后的SQL。
- 解析XML中的动态标签(如
33. trim标签的作用是什么?
答案:
- 去除多余前缀/后缀(如
AND/OR),常与where/set结合使用。<trim prefix="WHERE" prefixOverrides="AND |OR"> <if test="name != null">AND name = #{name}</if> </trim>
34. where标签的作用是什么?
答案:
- 自动添加
WHERE关键字,并去除首个条件前的AND,避免语法错误。<where> <if test="age > 0">AND age > #{age}</if> </where>
35. MyBatis如何实现分页?
答案:
- 物理分页:通过分页插件(如PageHelper)拦截SQL并追加
LIMIT。PageHelper.startPage(1, 10); List<User> users = userMapper.selectAll();
36. 分页插件的原理是什么?
答案:
- 拦截
Executor接口的query方法,重写SQL语句为分页查询(如SELECT * FROM table LIMIT 0,10)。
37. 逻辑分页与物理分页的区别是什么?
答案:
- 逻辑分页:在内存中分页(如
RowBounds),数据量大时性能差。 - 物理分页:数据库层面分页(如
LIMIT),高效但需数据库支持。
38. MyBatis的流式查询有什么用途?
答案:
- 处理大数据量查询,逐行读取结果集,避免内存溢出。
try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); List<User> users = mapper.streamQuery(); users.forEach(System.out::println); }
39. MyBatis中模糊查询的LIKE语句如何编写?
答案:
- 使用
CONCAT函数或${}拼接(需防注入):<select id="selectByKeyword" resultType="User"> SELECT * FROM user WHERE name LIKE CONCAT('%', #{keyword}, '%') </select>
40. MyBatis如何防止SQL注入?
答案:
- 优先使用
#{}预编译参数,避免${}直接拼接字符串。 - 对必须使用
${}的场景(如动态表名),需严格校验参数合法性。
41. MyBatis如何获取自动生成的主键?
答案:
- 全局配置:在
mybatis-config.xml中设置useGeneratedKeys="true"。 - 局部配置:在
<insert>标签中指定keyProperty:<insert id="insertUser" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user (name) VALUES (#{name}) </insert>
42. jdbcType与javaType的区别是什么?
答案:
jdbcType:数据库字段类型(如VARCHAR、INTEGER)。javaType:Java对象属性类型(如String、Integer)。
43. 必须指定jdbcType的场景有哪些?
答案:
- 当参数为
null时,需明确指定jdbcType以避免类型推断错误:<result column="age" property="age" jdbcType="INTEGER"/>
44. MyBatis是否支持预编译?如何实现?
答案:
- 默认启用预编译,通过
PreparedStatement优化SQL性能。 - 配置
<setting name="defaultExecutorType" value="REUSE"/>可复用Statement。
45. MyBatis的事务管理方式有哪些?
答案:
- JDBC事务:手动提交(
sqlSession.commit())。 - 集成Spring:通过
@Transactional注解声明式管理。
46. 如何显式开启MyBatis事务?
答案:
- 关闭自动提交并手动提交:
SqlSession session = sqlSessionFactory.openSession(false); try { userMapper.insert(user); session.commit(); } finally { session.close(); }
47. MyBatis事务与Spring事务的区别是什么?
答案:
- MyBatis事务:基于JDBC,需手动管理。
- Spring事务:提供声明式事务(AOP),支持传播行为与隔离级别。
48. MyBatis中使用了哪些设计模式?
答案:
- 代理模式:Mapper接口动态代理。
- 工厂模式:
SqlSessionFactory创建SqlSession。 - 单例模式:
SqlSessionFactory全局唯一。
49. JPA与MyBatis的主要区别是什么?
答案:
- JPA:标准ORM框架,自动生成SQL,适合简单CRUD。
- MyBatis:半自动框架,手动编写SQL,灵活但需更多代码。
50. StatementHandler与MappedStatement的区别是什么?
答案:
StatementHandler:执行SQL并处理结果集。MappedStatement:封装SQL映射信息(如ID、参数、结果映射)。
51. MyBatis常用的TypeHandler有哪些?
答案:
EnumTypeHandler(枚举处理)、DateTypeHandler(日期处理)、ClobTypeHandler(大文本处理)。
52. MyBatis的执行流程是怎样的?
答案:
- 加载配置文件(
mybatis-config.xml)。 - 解析Mapper XML文件。
- 创建
SqlSessionFactory。 - 通过
SqlSession执行SQL。 - 映射结果集到Java对象。
53. SqlSession是线程安全的吗?
答案:
- 不是,需每次获取新实例或使用
SqlSessionTemplate(Spring集成)。
54. DefaultSqlSession为什么不是线程安全的?
答案:
- 内部状态(如数据库连接、事务)未同步,多线程共享会导致数据混乱。
55. SqlSessionTemplate与SqlSessionManager的区别是什么?
答案:
SqlSessionTemplate:Spring集成,线程安全,自动管理会话。SqlSessionManager:手动管理会话,适用于非Spring环境。
56. MyBatis中Mapper接口的SQL语句能否重载?
答案:
- 不能,因Mapper接口方法与XML中SQL ID需唯一对应。
57. MyBatis的插件机制如何实现?有哪些应用场景?
答案:
- 实现方式:
- 实现
Interceptor接口,重写intercept()方法。 - 使用
@Intercepts和@Signature注解标记拦截点(如Executor.update)。 - 在
mybatis-config.xml中配置插件:<plugins> <plugin interceptor="com.example.MyPlugin"/> </plugins>
- 实现
- 应用场景:
- SQL性能监控(记录执行时间)。
- 修改SQL语句(如自动添加分页逻辑)。
- 参数加密(如敏感字段脱敏)。
58. MyBatis如何支持数据库事务的隔离级别?
答案:
- 全局配置:在
mybatis-config.xml中设置默认隔离级别:<settings> <setting name="defaultTransactionIsolationLevel" value="READ_COMMITTED"/> </settings> - 局部配置:通过
@Transactional注解指定(需Spring集成):@Transactional(isolation = Isolation.REPEATABLE_READ) public void updateData() { // 业务逻辑 } - JDBC原生方式:在获取连接时设置:
Connection conn = dataSource.getConnection(); conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
59. MyBatis的延迟加载(Lazy Loading)原理是什么?如何配置?
答案:
- 原理:
- 基于CGLIB或Javassist动态生成代理对象。
- 首次访问关联属性时触发查询(如
user.getOrders())。
- 配置方式:
- 在
mybatis-config.xml中启用全局延迟加载:<settings> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/> </settings> - 在
<association>或<collection>中指定fetchType="lazy":<resultMap id="userMap" type="User"> <association property="address" column="address_id" select="selectAddress" fetchType="lazy"/> </resultMap>
- 在
60. MyBatis与Spring Boot整合时需要注意哪些配置?
答案:
- 核心配置:
- 在
application.yml中配置数据源和MyBatis路径:spring: datasource: url: jdbc:mysql://localhost:3306/db username: root password: 123456 mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.entity - 启用
@MapperScan扫描Mapper接口:@SpringBootApplication @MapperScan("com.example.mapper") public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
- 在
- 常见问题:
- 确保Mapper XML文件在类路径下(如
resources/mapper)。 - 检查实体类包路径与
type-aliases-package是否一致。 - 避免同时使用
@Autowired和@Resource注入Mapper(优先使用@Autowired)。
- 确保Mapper XML文件在类路径下(如
2025年MyBatis面试题大全(精选120题)61~90题
61. MyBatis的@SelectKey注解有什么作用?
答案:
- 用于在插入数据后获取自动生成的主键(如数据库自增ID)。
- 示例:
@Insert("INSERT INTO user (name) VALUES (#{name})") @SelectKey(statement = "SELECT LAST_INSERT_ID()", keyProperty = "id", resultType = Long.class, before = false) void insertUser(User user);before为false表示在插入后执行SELECT LAST_INSERT_ID()。
62. MyBatis中如何处理数据库字段与Java对象属性的命名差异?
答案:
- 方式1:XML中使用
<resultMap>显式映射:<resultMap id="userMap" type="User"> <result column="user_name" property="userName"/> </resultMap> - 方式2:配置全局
mapUnderscoreToCamelCase:
自动将<settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>user_name映射到userName。
63. MyBatis的<cache-ref>标签有什么用途?
答案:
- 跨Mapper共享二级缓存。
- 示例:
使当前Mapper使用<cache-ref namespace="com.example.mapper.OtherMapper"/>OtherMapper的缓存配置。
64. MyBatis的<bind>标签有什么作用?
答案:
- 在动态SQL中定义变量,避免重复代码。
- 示例:
<select id="search" resultType="User"> <bind name="pattern" value="'%' + keyword + '%'"/> SELECT * FROM user WHERE name LIKE #{pattern} </select>
65. MyBatis的<script>标签有什么用途?
答案:
- 在注解方式中编写复杂SQL(如动态SQL)。
- 示例:
@Select({"<script>", "SELECT * FROM user", "<where>", "<if test='name != null'>AND name = #{name}</if>", "</where>", "</script>"}) List<User> searchUsers(@Param("name") String name);
66. MyBatis的<choose>标签如何实现多条件分支?
答案:
- 类似
switch-case,按顺序匹配第一个条件:<select id="findUser" resultType="User"> SELECT * FROM user <where> <choose> <when test="id != null">AND id = #{id}</when> <when test="name != null">AND name = #{name}</when> <otherwise>AND 1=0</otherwise> </choose> </where> </select>
67. MyBatis的<foreach>标签能否嵌套使用?
答案:
- 可以,但需注意SQL语法正确性。
- 示例(批量插入多表关联数据):
<insert id="batchInsert"> INSERT INTO order_item (order_id, product_id) VALUES <foreach collection="items" item="item" separator=","> (#{orderId}, #{item.productId}) </foreach> </insert>
68. MyBatis的<include>标签如何复用SQL片段?
答案:
- 定义可复用的SQL片段:
<sql id="Base_Column_List"> id, name, age, email </sql> - 在其他语句中引用:
<select id="selectAll" resultType="User"> SELECT <include refid="Base_Column_List"/> FROM user </select>
69. MyBatis的<discriminator>标签有什么用途?
答案:
- 根据字段值动态选择不同的结果映射(类似策略模式)。
- 示例:
<resultMap id="vehicleMap" type="Vehicle"> <discriminator javaType="int" column="type"> <case value="1" resultType="Car"> <result property="doorCount" column="door_count"/> </case> <case value="2" resultType="Bike"> <result property="wheelSize" column="wheel_size"/> </case> </discriminator> </resultMap>
70. MyBatis的<resultMap>中autoMapping属性的作用是什么?
答案:
- 控制是否自动映射字段到属性(默认
PARTIAL)。 - 设置为
false时,仅映射<resultMap>中显式声明的字段。
71. MyBatis的<constructor>标签有什么用途?
答案:
- 通过构造函数注入结果集,避免依赖setter方法。
- 示例:
<resultMap id="userMap" type="User"> <constructor> <arg column="id" javaType="Long"/> <arg column="name" javaType="String"/> </constructor> </resultMap>
72. MyBatis的<parameterMap>标签是否已过时?
答案:
- 是的,MyBatis 3.4+已弃用
<parameterMap>,推荐使用@Param注解或Map参数。
73. MyBatis的<cache>标签能否配置多个缓存实例?
答案:
- 不能,每个Mapper XML只能配置一个
<cache>,但可通过<cache-ref>共享其他Mapper的缓存。
74. MyBatis的<transactionManager>配置有什么作用?
答案:
- 定义事务管理方式(如JDBC或MANAGED)。
- 示例:
<transactionManager type="JDBC"/>
75. MyBatis的<dataSource>配置有哪些类型?
答案:
- POOLED:内置连接池(默认)。
- UNPOOLED:无连接池,每次请求新建连接。
- JNDI:从应用服务器获取数据源。
76. MyBatis的<properties>标签如何引用外部配置文件?
答案:
- 在
mybatis-config.xml中引入:<properties resource="db.properties"/> - 在配置中通过
${property.name}引用:<dataSource url="${jdbc.url}"/>
77. MyBatis的<typeAliases>标签有什么用途?
答案:
- 为Java类定义别名,简化XML中的类型声明。
- 示例:
<typeAliases> <typeAlias type="com.example.User" alias="User"/> </typeAliases> - 后续可直接使用
User代替全限定类名。
78. MyBatis的<mappers>标签如何加载Mapper XML?
答案:
- 方式1:通过
<mapper resource="com/example/mapper/UserMapper.xml"/>。 - 方式2:通过
<package name="com.example.mapper"/>自动扫描。 - 方式3:使用
<mapper class="com.example.mapper.UserMapper"/>(需接口与XML同名同路径)。
79. MyBatis的<configuration>标签有哪些核心配置项?
答案:
settings(全局配置)、typeAliases(类型别名)、mappers(Mapper加载)、environments(数据源与事务管理器)。
80. MyBatis的<environment>标签如何配置多数据源?
答案:
- 定义多个
<environment>并通过default属性指定默认环境:<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <!-- 开发环境配置 --> </dataSource> </environment> <environment id="production"> <transactionManager type="JDBC"/> <dataSource type="JNDI"> <!-- 生产环境配置 --> </dataSource> </environment> </environments>
81. MyBatis的<settings>标签中哪些配置需要重点关注?
答案:
mapUnderscoreToCamelCase(字段名映射)、cacheEnabled(全局缓存开关)、lazyLoadingEnabled(延迟加载)、logImpl(日志实现)。
82. MyBatis的<plugins>标签如何配置拦截器链?
答案:
- 按顺序声明多个拦截器:
<plugins> <plugin interceptor="com.example.Plugin1"/> <plugin interceptor="com.example.Plugin2"/> </plugins> - 拦截器按声明顺序执行(先配置的先拦截)。
83. MyBatis的<databaseIdProvider>标签如何支持多数据库方言?
答案:
- 根据数据库厂商选择不同的SQL实现:
<databaseIdProvider type="DB_VENDOR"> <property name="MySQL" value="mysql"/> <property name="Oracle" value="oracle"/> </databaseIdProvider> - 在Mapper XML中通过
databaseId属性区分:<select id="select" databaseId="mysql">SELECT * FROM user</select> <select id="select" databaseId="oracle">SELECT * FROM users</select>
84. MyBatis的<objectFactory>标签有什么用途?
答案:
- 自定义对象创建逻辑(如依赖注入),默认使用
DefaultObjectFactory。
85. MyBatis的<objectWrapperFactory>标签有什么用途?
答案:
- 自定义对象包装逻辑(如处理嵌套属性),默认使用
DefaultObjectWrapperFactory。
86. MyBatis的<reflectorFactory>标签有什么用途?
答案:
- 自定义反射工厂(如优化反射性能),默认使用
DefaultReflectorFactory。
87. MyBatis的<vfs>标签有什么用途?
答案:
- 配置虚拟文件系统(如处理类路径资源),默认使用
VFS实现。
88. MyBatis的<typeHandlers>标签如何注册自定义类型处理器?
答案:
- 全局注册:
<typeHandlers> <typeHandler handler="com.example.EnumNameTypeHandler"/> </typeHandlers> - 局部注册(在
<resultMap>或<parameterMap>中指定)。
89. MyBatis的<environments>标签能否配置多个环境?
答案:
- 可以,通过
<environment>定义多个环境,并通过default属性指定默认环境。
90. MyBatis的<configuration>标签能否配置多个数据源?
答案:
- 不能直接配置,需通过
<environments>定义多个环境,每个环境对应一个数据源,并在代码中切换环境:SqlSessionFactory factory = new SqlSessionFactoryBuilder() .build(reader, "production"); // 指定环境ID
2025年MyBatis面试题大全(精选120题)91~120题
91. MyBatis的<resultMap>中extends属性的作用是什么?
答案:
- 实现ResultMap的继承,复用公共字段映射。
- 示例:
<resultMap id="BaseResultMap" type="User"> <id column="id" property="id"/> <result column="name" property="name"/> </resultMap> <resultMap id="DetailResultMap" type="User" extends="BaseResultMap"> <result column="email" property="email"/> </resultMap>
92. MyBatis的<discriminator>标签如何实现多态结果映射?
答案:
- 根据数据库字段值动态选择不同的结果映射。
- 示例:
<resultMap id="vehicleMap" type="Vehicle"> <id column="id" property="id"/> <discriminator javaType="int" column="type"> <case value="1" resultType="Car"> <result property="doorCount" column="door_count"/> </case> <case value="2" resultType="Bike"> <result property="wheelSize" column="wheel_size"/> </case> </discriminator> </resultMap>
93. MyBatis的<cache>标签中eviction属性有哪些可选值?
答案:
- LRU(默认):最近最少使用。
- FIFO:先进先出。
- SOFT:基于软引用(内存敏感时回收)。
- WEAK:基于弱引用(GC时回收)。
94. MyBatis的<cache>标签中flushInterval属性的作用是什么?
答案:
- 设置缓存自动刷新间隔(毫秒),0表示不自动刷新。
- 示例:
<cache flushInterval="60000"/> <!-- 每60秒刷新 -->
95. MyBatis的<cache>标签中readOnly属性的作用是什么?
答案:
- 若为
true,缓存对象不可修改(性能更高);若为false,返回对象副本(线程安全)。
96. MyBatis的<cache>标签中size属性的作用是什么?
答案:
- 设置缓存最大对象数,超过时根据淘汰策略移除旧对象。
97. MyBatis的<cache>标签中blocking属性的作用是什么?
答案:
- 若为
true,当缓存未命中时,阻塞线程直到数据加载完成(避免缓存穿透)。
98. MyBatis的<cache>标签能否配置多个缓存实例?
答案:
- 不能,每个Mapper XML只能配置一个
<cache>,但可通过<cache-ref>共享其他Mapper的缓存。
99. MyBatis的<transactionManager>标签中type属性的可选值有哪些?
答案:
- JDBC:使用JDBC事务(默认)。
- MANAGED:由容器管理事务(如JTA)。
100. MyBatis的<dataSource>标签中type属性的可选值有哪些?
答案:
- POOLED:内置连接池(默认)。
- UNPOOLED:无连接池,每次请求新建连接。
- JNDI:从应用服务器获取数据源。
101. MyBatis的日志集成方式有哪些?
答案:
- 在
mybatis-config.xml中配置日志实现:<settings> <setting name="logImpl" value="SLF4J"/> <!-- 或LOG4J、LOG4J2、JDK_LOGGING --> </settings>
102. MyBatis的日志输出包含哪些内容?
答案:
- 执行的SQL语句、参数、影响行数、执行时间等。
103. MyBatis的<logging>标签有什么用途?
答案:
- 配置特定Mapper或语句的日志级别(需日志框架支持)。
104. MyBatis的异常处理机制是怎样的?
答案:
- 抛出
PersistenceException的子类(如BindingException、TooManyResultsException)。
105. MyBatis的SqlSession如何关闭?
答案:
- 显式调用
close()方法,或使用try-with-resources(Java 7+):try (SqlSession session = sqlSessionFactory.openSession()) { // 业务逻辑 }
106. MyBatis的SqlSessionFactory如何销毁?
答案:
- 无需手动销毁,应用关闭时由JVM垃圾回收。
107. MyBatis的Configuration对象能否修改?
答案:
- 可以,但需谨慎(如动态注册Mapper)。
108. MyBatis的MappedStatement对象如何获取?
答案:
- 通过
Configuration对象:MappedStatement ms = configuration.getMappedStatement("com.example.UserMapper.selectUser");
109. MyBatis的BoundSql对象有什么用途?
答案:
- 表示最终执行的SQL语句和参数(动态SQL解析后的结果)。
110. MyBatis的Executor接口有哪些实现类?
答案:
- SimpleExecutor:默认执行器,每次操作创建新PreparedStatement。
- ReuseExecutor:复用PreparedStatement。
- BatchExecutor:批量执行SQL。
- CachingExecutor:二级缓存执行器(包装其他Executor)。
111. MyBatis的ParameterHandler接口有什么用途?
答案:
- 设置SQL参数(如处理
#{}和${})。
112. MyBatis的ResultSetHandler接口有什么用途?
答案:
- 处理查询结果集,映射到Java对象。
113. MyBatis的StatementHandler接口有什么用途?
答案:
- 创建Statement对象,设置参数,执行SQL。
114. MyBatis的TypeHandlerRegistry有什么用途?
答案:
- 注册和管理
TypeHandler,处理类型转换。
115. MyBatis的MetaObject有什么用途?
答案:
- 反射工具类,用于操作对象属性(如设置/获取值)。
116. MyBatis的ScriptingDriver有什么用途?
答案:
- 解析动态SQL(如OGNL表达式)。
117. MyBatis的XMLMapperBuilder有什么用途?
答案:
- 解析Mapper XML文件,构建
MappedStatement等对象。
118. MyBatis的MapperProxyFactory有什么用途?
答案:
- 生成Mapper接口的动态代理对象。
119. MyBatis的MapperRegistry有什么用途?
答案:
- 注册和获取Mapper接口的代理对象。
120. MyBatis的Configuration对象如何序列化?
答案:
- MyBatis的
Configuration对象未实现Serializable接口,需自定义序列化逻辑(如提取关键配置)。
2万+

被折叠的 条评论
为什么被折叠?



