2025年MyBatis面试题大全(精选120题)

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的插件机制如何实现?

答案

  1. 实现Interceptor接口,重写intercept()方法。
  2. 使用@Intercepts@Signature注解标记拦截点(如Executor.update)。
  3. mybatis-config.xml中配置插件:
    <plugins>
        <plugin interceptor="com.example.MyPlugin"/>
    </plugins>
    
10. MyBatis如何实现分页?

答案

  • 逻辑分页:使用RowBounds(内存分页,数据量大时性能差)。
  • 物理分页:通过拦截器修改SQL(如PageHelper插件自动追加LIMIT)。
11. MyBatis的关联查询如何实现?

答案

  • 一对一:使用<association>(如用户与身份证)。
  • 一对多:使用<collection>(如订单与商品列表)。
  • 延迟加载:配置fetchType="lazy",按需加载关联数据。
12. MyBatis的二级缓存如何配置?

答案

  1. 在Mapper XML中添加<cache/>标签。
  2. 配置缓存参数(如过期时间、大小):
    <cache 
        eviction="FIFO" 
        flushInterval="60000" 
        size="512" 
        readOnly="true"/>
    
  3. 实体类实现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片段。
  • 执行流程:
    1. 解析XML中的动态标签(如<if>, <foreach>)。
    2. 根据参数值生成最终SQL语句。
    3. 通过Executor执行拼接后的SQL。
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. jdbcTypejavaType的区别是什么?

答案

  • jdbcType:数据库字段类型(如VARCHARINTEGER)。
  • javaType:Java对象属性类型(如StringInteger)。
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. StatementHandlerMappedStatement的区别是什么?

答案

  • StatementHandler:执行SQL并处理结果集。
  • MappedStatement:封装SQL映射信息(如ID、参数、结果映射)。
51. MyBatis常用的TypeHandler有哪些?

答案

  • EnumTypeHandler(枚举处理)、DateTypeHandler(日期处理)、ClobTypeHandler(大文本处理)。
52. MyBatis的执行流程是怎样的?

答案

  1. 加载配置文件(mybatis-config.xml)。
  2. 解析Mapper XML文件。
  3. 创建SqlSessionFactory
  4. 通过SqlSession执行SQL。
  5. 映射结果集到Java对象。
53. SqlSession是线程安全的吗?

答案

  • 不是,需每次获取新实例或使用SqlSessionTemplate(Spring集成)。
54. DefaultSqlSession为什么不是线程安全的?

答案

  • 内部状态(如数据库连接、事务)未同步,多线程共享会导致数据混乱。
55. SqlSessionTemplateSqlSessionManager的区别是什么?

答案

  • SqlSessionTemplate:Spring集成,线程安全,自动管理会话。
  • SqlSessionManager:手动管理会话,适用于非Spring环境。
56. MyBatis中Mapper接口的SQL语句能否重载?

答案

  • 不能,因Mapper接口方法与XML中SQL ID需唯一对应。
57. MyBatis的插件机制如何实现?有哪些应用场景?

答案

  • 实现方式
    1. 实现Interceptor接口,重写intercept()方法。
    2. 使用@Intercepts@Signature注解标记拦截点(如Executor.update)。
    3. 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())。
  • 配置方式
    1. mybatis-config.xml中启用全局延迟加载:
      <settings>
          <setting name="lazyLoadingEnabled" value="true"/>
          <setting name="aggressiveLazyLoading" value="false"/>
      </settings>
      
    2. <association><collection>中指定fetchType="lazy"
      <resultMap id="userMap" type="User">
          <association property="address" column="address_id" 
                       select="selectAddress" fetchType="lazy"/>
      </resultMap>
      
60. MyBatis与Spring Boot整合时需要注意哪些配置?

答案

  • 核心配置
    1. 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
      
    2. 启用@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)。

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);
    
    • beforefalse表示在插入后执行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共享二级缓存。
  • 示例:
    <cache-ref namespace="com.example.mapper.OtherMapper"/>
    
    使当前Mapper使用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的子类(如BindingExceptionTooManyResultsException)。
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接口,需自定义序列化逻辑(如提取关键配置)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值