MyBatis最经典的20道面试题,你都会了吗?

简介: MyBatis最经典的20道面试题,你都会了吗?

介绍MyBatis最经典的20道面试题,你都会了吗?

MyBatis是一款优秀的持久层框架,在Java开发中广受欢迎。下面是一些常见的MyBatis面试题,以及相应的案例分析,希望对你的学习和面试有所帮助。

1. 什么是MyBatis?

MyBatis是一款基于Java的持久层框架,它通过XML描述符或注解将对象与存储过程或SQL语句进行映射,实现了面向对象编程与关系数据库的映射。

2. MyBatis的优点是什么?

  • 简化了数据库访问过程,不需要编写繁琐的JDBC代码。
  • 提供了强大的动态SQL功能,可以根据条件拼接SQL语句。
  • 支持映射文件和注解两种方式配置SQL映射。
  • 支持延迟加载和缓存机制,提高查询性能。
  • 易于学习和使用,文档详尽。

3. MyBatis的执行流程是什么?

MyBatis的执行流程主要包括:

  1. 加载配置文件:加载MyBatis的配置文件,初始化配置信息。
  2. 创建SqlSessionFactory:根据配置信息,创建SqlSessionFactory对象。
  3. 获取SqlSession:通过SqlSessionFactory对象获取SqlSession。
  4. 执行SQL:在SqlSession中执行SQL语句。
  5. 返回结果:获取SQL执行的结果。

4. 什么是MyBatis的动态SQL?

动态SQL是MyBatis中的一项强大功能,它可以根据条件判断动态拼接SQL语句,避免硬编码。

例如,动态SQL可以在条件成立时插入WHERE子句:

<select id="getUserList" resultType="User">
    SELECT * FROM user
    <where>
        <if test="id != null">AND id = #{id}</if>
        <if test="name != null">AND name = #{name}</if>
    </where>
</select>

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

  • 一级缓存是SqlSession级别的缓存,它在同一个SqlSession中有效,当SqlSession关闭或提交时,缓存失效。
  • 二级缓存是Mapper级别的缓存,多个SqlSession可以共享二级缓存。在不同SqlSession中执行相同的SQL语句,可以共享查询结果。

6. MyBatis的映射文件中如何传递参数?

可以使用parameterType属性指定参数类型,使用#{}占位符引用参数。例如:

<select id="getUserById" resultType="User" parameterType="int">
    SELECT * FROM user WHERE id = #{id}
</select>

7. 如何在MyBatis中进行批量插入?

可以使用foreach标签进行批量插入。例如:

<insert id="batchInsert" parameterType="java.util.List">
    INSERT INTO user (name, age) VALUES
    <foreach collection="list" item="item" index="index" separator=",">
        (#{item.name}, #{item.age})
    </foreach>
</insert>

8. MyBatis的延迟加载是什么?

延迟加载是指在需要使用数据时才真正去查询数据库,而不是立即加载所有关联数据。通过配置lazyLoadingEnabled实现延迟加载。

9. MyBatis的乐观锁是怎么实现的?

MyBatis的乐观锁是通过版本号实现的,即在数据表中增加一个版本号字段。在更新时,比较版本号是否一致,如果一致才更新数据。

@Update("UPDATE user SET name = #{name}, version = #{version + 1} WHERE id = #{id} AND version = #{version}")
int updateUser(User user);

10. MyBatis中如何处理存储过程?

可以使用select标签调用存储过程,使用resultMap映射输出参数。

<select id="callProcedure" statementType="CALLABLE" parameterType="Map">
    {call my_procedure(
        #{inputParam, mode=IN, jdbcType=INTEGER},
        #{outputParam, mode=OUT, jdbcType=VARCHAR}
    )}
</select>

11. MyBatis中的#{}和${}有什么区别?

  • #{}用于预编译,会将参数进行安全的替换,防止SQL注入。
  • ${}是直接拼接参数,不进行预编译,慎用防止SQL注入。
<!-- 使用#{} -->
<select id="getUserById" resultType="User" parameterType="int">
    SELECT * FROM user WHERE id = #{id}
</select>
<!-- 使用${} -->
<select id="getUserByName" resultType="User" parameterType="String">
    SELECT * FROM user WHERE name = '${name}'
</select>

12. MyBatis的逆向工程是什么?

逆向工程是指通过数据库表结构自动生成MyBatis的实体类、映射文件以及DAO接口,减少手动编写的工作量。

使用逆向工程工具如MyBatis Generator,可以根据数据库表结构生成对应的Java代码。

13. MyBatis中的ResultMap是什么?

ResultMap是MyBatis中用于映射查询结果集的配置,通过ResultMap可以将查询结果映射成复杂的Java对象。

<resultMap id="userResultMap" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="age" column="age"/>
</resultMap>
<select id="getUserById" resultMap="userResultMap" parameterType="int">
    SELECT * FROM user WHERE id = #{id}
</select>

14. MyBatis的动态SQL中如何使用choose、when和otherwise?

<choose>用于分支选择,<when>表示条件满足时执行,<otherwise>表示所有条件都不满足时执行。

<select id="getUserByCondition" resultType="User">
    SELECT * FROM user
    <where>
        <choose>
            <when test="name != null">AND name = #{name}</when>
            <when test="age != null">AND age = #{age}</when>
            <otherwise>AND 1=1</otherwise>
        </choose>
    </where>
</select>

15. MyBatis中如何进行批量更新?

使用<foreach>标签可以方便地进行批量更新。

<update id="batchUpdate" parameterType="java.util.List">
    <foreach collection="list" item="item" separator=";">
        UPDATE user SET name = #{item.name}, age = #{item.age} WHERE id = #{item.id}
    </foreach>
</update>

16. MyBatis的懒加载是什么?

懒加载是指在需要使用关联数据时才去加载,而不是在查询主体数据时就将关联数据一并加载。

<resultMap id="userResultMap" type="User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="age" column="age"/>
    <collection property="orders" ofType="Order" column="user_id" select="getOrdersByUserId" lazyLoading="true"/>
</resultMap>

17. MyBatis中的动态SQL如何实现分页查询?

使用<if>标签判断是否需要拼接分页SQL。

<select id="getUserByPage" resultType="User" parameterType="Map">
    SELECT * FROM user
    <where>
        <if test="name != null">AND name = #{name}</if>
        <if test="age != null">AND age = #{age}</if>
    </where>
    LIMIT #{start}, #{pageSize}
</select>

18. MyBatis中如何处理返回多个结果集?

通过resultSets属性指定多个结果集。

<select id="getUserAndOrder" resultType="User" statementType="CALLABLE" parameterType="Map" resultSets="user,order">
    {call get_user_and_order(#{userId, mode=IN, jdbcType=INTEGER})}
</select>

19. MyBatis的缓存有哪几种?

MyBatis的缓存分为一级缓存和二级缓存,一级缓存是SqlSession级别的缓存,二级缓存是Mapper级别的缓存。

20. MyBatis中如何实现动态更新?

使用<set>标签可以方便地动态拼接更新字段。

<update id="dynamicUpdate" parameterType="User">
    UPDATE user
    <set>
        <if test="name != null">name = #{name},</if>
        <if test="age != null">age = #{age},</if>
    </set>
    WHERE id = #{id}
</update>

以上是MyBatis经典面试题20题,每个问题都附带有案例分析。希望这些内容对你的学习和面试有所帮助。

感谢阅读!

相关文章
|
6月前
|
缓存 Java 数据库连接
Mybatis缓存相关面试题有多卷
使用 MyBatis 缓存机制需要注意以下几点: 对于频繁更新和变动的数据,不适合使用缓存。 对于数据的一致性要求比较高的场景,不适合使用缓存。 如果配置了二级缓存,需要确保缓存的数据不会影响到其他业务模块的数据。 在使用缓存时,需要注意缓存的命中率和缓存的过期策略,避免缓存过期导致查询性能下降。
105 0
|
6月前
|
Java 关系型数据库 数据库连接
BATJ高频面试249道题:微服务+多线程+分布式+MyBatis +Spring
本文收集整理了各大厂常见面试题N道,你想要的这里都有内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈,希望大家都能找到适合自己的公司,开开心心的撸代码。
|
6月前
|
SQL 缓存 Java
Mybatis面试题
Mybatis面试题
|
4月前
|
SQL Java 数据库连接
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
Java面试题:简述ORM框架(如Hibernate、MyBatis)的工作原理及其优缺点。
77 0
|
6月前
|
存储 缓存 Java
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制
什么!?实战项目竟然撞到阿里面试的原题!???关于MyBatis Plus的缓存机制
|
6月前
|
SQL Java 数据库连接
MyBatis常见面试题总结2
MyBatis常见面试题总结
53 0
|
6月前
|
SQL Java 数据库连接
MyBatis常见面试题总结1
MyBatis常见面试题总结
64 0
|
6月前
|
SQL Java 数据库连接
答案很详细的MyBatis面试题(含示例代码)
MyBatis是一种优秀的持久层框架,它是一个轻量级的、优化的、功能强大的Java持久层框架,它的设计理念是贴近SQL、便于使用、高效并且功能丰富。通过MyBatis的使用,开发者能够更加专注于业务逻辑的实现,而不用过多关注底层的数据库操作。MyBatis通过XML或注解的方式配置SQL映射文件,并将Java的POJO(Plain Old Java Object,普通的Java对象)与数据库中的记录进行映射,使得开发人员能够以面向对象的方式来操作数据库,同时兼顾了SQL的灵活性和效率。灵活的SQL映射。
291 0
|
6月前
|
SQL Java 数据库连接
MyBatis常见面试题和答案(2020最新版)
MyBatis常见面试题和答案(2020最新版)
286 0
|
6月前
|
SQL 缓存 Java
程序员的30大Mybatis面试问题及答案
程序员的30大Mybatis面试问题及答案