MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

在面试中Mybatis非常重要【面经】

2024-12-05 12:40 huorong 精选文章 12 ℃ 0 评论

MyBatis 是一个常用的持久层框架,广泛应用于 Java 项目中进行数据库操作。MyBatis 提供了比 JPA 和 Hibernate 更灵活的 SQL 映射机制,在面试中经常被问到。下面是一些常见的 MyBatis 面试问题及其答案,帮助你准备相关的面试。


1.什么是 MyBatis?它与 Hibernate 有什么区别?

答:

MyBatis 是一个半自动化的持久层框架,它允许开发者使用自定义的 SQL 查询语句。MyBatis 通过 XML 或注解的方式将 Java 对象与 SQL 语句进行映射,支持较为复杂的 SQL 语句,具有灵活性和高可定制性。

与 Hibernate 的区别

  • 灵活性:MyBatis 需要开发者手写 SQL,开发者可以完全控制查询的细节;而 Hibernate 采用 HQL(Hibernate Query Language),不需要编写 SQL,能够自动生成 SQL,但灵活性较差。
  • 缓存:MyBatis 自带一级缓存和二级缓存,并且支持自定义缓存;Hibernate 也有缓存机制,但配置较为复杂。
  • 性能:由于 MyBatis 允许直接编写 SQL,因此在处理复杂查询时可能性能更好;Hibernate 在简单的 CRUD 操作上性能较优,但对于复杂查询可能会有性能瓶颈。
  • 学习曲线:MyBatis 相对较简单,开发者只需要掌握 SQL 的编写;Hibernate 需要理解对象关系映射(ORM)模型。

2.MyBatis 中的SqlSessionFactory是做什么的?

答:

SqlSessionFactory 是 MyBatis 的核心组件之一,它用于创建 SqlSession 对象。SqlSession 提供了操作数据库的 API,包括执行 SQL 语句、事务管理等。SqlSessionFactory 通过读取 MyBatis 的配置文件(如 mybatis-config.xml)并根据配置构建 SqlSession。

工作流程

  1. SqlSessionFactory 从 MyBatis 配置文件(mybatis-config.xml)中读取配置信息。
  2. 它使用这些配置来生成对应的数据库连接池。
  3. 在执行数据库操作时,通过 SqlSessionFactory 获取 SqlSession 实例。

3.MyBatis 的映射文件(Mapper)是什么?

答:

MyBatis 映射文件(Mapper)用于将 SQL 语句与 Java 方法进行映射,通常这些文件是 XML 格式的,包含了 SQL 语句、输入输出参数映射等信息。每个 Mapper 文件都有一个唯一的接口,接口中的方法与 XML 文件中的 SQL 语句一一对应。

基本结构

  1. Mapper 接口:定义 SQL 操作方法,例如 insert(), update(), select(), delete() 等。
  2. Mapper XML 文件:在 XML 文件中,使用 <select>, <insert>, <update>, <delete> 等标签定义 SQL 语句。

示例

public interface UserMapper {
    User selectUserById(int id);
}
<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectUserById" resultType="com.example.model.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

4.MyBatis 中的ResultMap是什么?

答:

ResultMap 是 MyBatis 中用于映射查询结果的机制,它定义了 SQL 查询结果与 Java 对象之间的映射关系。在查询时,ResultMap 将数据库中的字段值转换为 Java 对象的属性值。

  • resultMap 可以配置字段到属性的映射规则,例如字段名与属性名不一致时可以通过 <result> 标签来手动配置。
  • 它支持复杂的对象映射,可以进行一对一、一对多、多对多等复杂映射。

示例

<resultMap id="userMap" type="com.example.model.User">
    <result property="id" column="user_id"/>
    <result property="username" column="user_name"/>
    <result property="password" column="user_password"/>
</resultMap>

<select id="selectUserById" resultMap="userMap">
    SELECT user_id, user_name, user_password FROM users WHERE user_id = #{id}
</select>

5.MyBatis 中的TypeHandler是做什么的?

答:

TypeHandler 是 MyBatis 中用来处理 Java 类型与 JDBC 类型之间转换的机制。它通常用于处理一些特殊类型的转换(例如枚举类型、日期格式等)。默认情况下,MyBatis 会自动进行类型转换,但如果你需要自定义转换逻辑,就可以实现 TypeHandler 接口。

常见使用场景

  • 处理枚举类型。
  • 处理自定义的类型映射。
  • 处理数据库字段与 Java 类型不完全匹配的情况。

示例

public class MyEnumTypeHandler extends BaseTypeHandler<MyEnum> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, MyEnum parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, parameter.getCode());
    }

    @Override
    public MyEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String code = rs.getString(columnName);
        return MyEnum.fromCode(code);
    }

    @Override
    public MyEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String code = rs.getString(columnIndex);
        return MyEnum.fromCode(code);
    }

    @Override
    public MyEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String code = cs.getString(columnIndex);
        return MyEnum.fromCode(code);
    }
}

查看全部

然后在 XML 文件中配置:

<typeHandlers>
    <typeHandler handler="com.example.MyEnumTypeHandler"/>
</typeHandlers>

6.MyBatis 中的一级缓存和二级缓存有什么区别?

答:

  • 一级缓存(Local Cache)
    • 作用范围:SqlSession 级别的缓存,缓存只在当前 SqlSession 内部有效。
    • 默认开启:MyBatis 默认启用了一级缓存。每次执行查询时,查询结果会被缓存到 SqlSession 中,直到 SqlSession 关闭或者执行 clearCache()。
    • 优势:减少数据库访问,提高性能。
    • 局限性:只能在同一 SqlSession 中共享。
  • 二级缓存(Global Cache)
    • 作用范围:SqlSessionFactory 级别的缓存,跨 SqlSession 共享。
    • 需要显式开启:需要在 mybatis-config.xml 配置文件中配置并且每个 Mapper 都需要启用二级缓存。
    • 可以配置自定义缓存实现类(如 Ehcache、Redis 等)。
    • 优势:跨多个 SqlSession 使用缓存,适合读多写少的场景。

启用二级缓存的步骤

  1. 在 mybatis-config.xml 中启用二级缓存:
  2. <configuration> <settings> <setting name="cacheEnabled" value="true"/> </settings> </configuration>
  3. 在 Mapper 文件中启用缓存:
  4. <mapper namespace="com.example.mapper.UserMapper"> <cache/> <select id="selectUserById" resultType="com.example.model.User"> SELECT * FROM users WHERE id = #{id} </select> </mapper>

7.MyBatis 支持哪些类型的映射?

答:

MyBatis 支持多种类型的映射,包括:

  1. 一对一映射:一个查询返回一个对象。
  2. 一对多映射:一个查询返回多个对象(例如,通过嵌套查询)。
  3. 多对多映射:通过嵌套查询实现多对多映射。
  4. 集合映射:将查询结果映射为一个集合,如 List 或 Set。

示例(查询一对多关系)

<resultMap id="orderMap" type="com.example.model.Order">
    <id property="id" column="order_id"/>
    <result property="total" column="total"/>
    <collection property="items" ofType="com.example.model.Item">
        <id property="id" column="item_id"/>
        <result property="name" column="item_name"/>
    </collection>
</resultMap>

<select id="selectOrderById" resultMap="orderMap">
    SELECT * FROM orders o
    LEFT JOIN items i ON o.id = i.order_id
    WHERE o.id = #{id}
</select>

这些问题涵盖了 MyBatis 的核心概念、配置和特性,掌握这些问题将帮助你在面试中展示你对 MyBatis 的理解。

Tags:mybatis collection

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言