MyBatis的工作流程是怎样的?

大家好,我是锋哥。今天分享关于【**MyBatis的工作流程是怎样的?】面试题。**希望对大家有帮助;

MyBatis的工作流程是怎样的?

MyBatis 的工作流程可以分为几个主要步骤:从配置、映射到执行 SQL,最终获取数据库结果并映射回 Java 对象。下面是 MyBatis 的典型工作流程:

1. 加载配置文件

MyBatis 的核心是 SqlSessionFactory,它负责创建 SqlSession 实例。SqlSessionFactory 通过读取配置文件来初始化 MyBatis。配置文件通常是 mybatis-config.xml,它包含了 MyBatis 的全局配置和一些其他配置信息(例如:数据库连接池、事务管理、缓存设置等)。

  • 步骤

    • 创建 SqlSessionFactoryBuilder
    • 通过 SqlSessionFactoryBuilder.build(inputStream) 加载 mybatis-config.xml 配置文件。
    • SqlSessionFactory 创建后,应用程序可以从中获取 SqlSession 实例。
    复制代码
      <!-- mybatis-config.xml -->
      <configuration>
          <environments default="development">
              <environment id="development">
                  <transactionManager type="JDBC"/>
                  <dataSource type="POOLED">
                      <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                      <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
                      <property name="username" value="root"/>
                      <property name="password" value="password"/>
                  </dataSource>
              </environment>
          </environments>
          <mappers>
              <mapper resource="com/example/mapper/UserMapper.xml"/>
          </mappers>
      </configuration>

2. 创建 SqlSession 实例

SqlSession 是 MyBatis 与数据库交互的核心接口,应用程序通过它执行 SQL 语句,获取查询结果,提交事务等。SqlSession 是通过 SqlSessionFactory 创建的。

  • 步骤

    • 调用 SqlSessionFactory.openSession() 创建 SqlSession 对象(可以指定自动提交事务的模式)。
    • 每次使用完 SqlSession 后,要调用 sqlSession.close() 来关闭连接。
    复制代码
      SqlSession session = sqlSessionFactory.openSession();

3. 执行 SQL 语句

MyBatis 通过 SqlSession 来执行 SQL 语句。SQL 语句通常是通过 XML 映射文件(如 UserMapper.xml)与 Java 接口(如 UserMapper.java)映射的。

  • 步骤

    • SqlSession 提供了方法来执行各种 SQL 操作,比如 selectOne(), selectList(), insert(), update(), delete() 等。
    • SqlSession 会根据传入的映射 ID 查找对应的 SQL 映射语句,然后执行 SQL。
    复制代码
      UserMapper mapper = session.getMapper(UserMapper.class);
      User user = mapper.selectUserById(1);

在上面的代码中,mapper.selectUserById(1) 会调用 UserMapper.xml 中的 selectUserById 映射方法,执行对应的 SQL 语句。

4. SQL 映射和动态 SQL

在 MyBatis 中,SQL 是通过 XML 映射文件(如 UserMapper.xml)与 Java 接口方法关联的。MyBatis 支持使用动态 SQL,根据传入参数动态生成 SQL 语句。

  • 静态 SQL 映射示例

    复制代码
    <mapper namespace="com.example.mapper.UserMapper">
        <select id="selectUserById" resultType="com.example.domain.User">
            SELECT id, name, email FROM users WHERE id = #{id}
        </select>
    </mapper>
  • 动态 SQL 示例

    复制代码
    <select id="selectUsersByCondition" resultType="com.example.domain.User">
        SELECT id, name, email FROM users
        WHERE 1=1
        <if test="name != null">AND name = #{name}</if>
        <if test="email != null">AND email = #{email}</if>
    </select>

在上面的例子中,selectUsersByCondition 根据传入的条件动态拼接 SQL 语句。

5. 获取查询结果并映射到 Java 对象

MyBatis 会将从数据库查询到的结果映射到 Java 对象中,过程是通过 resultMap 或简单的 resultType 配置来完成的。

  • 使用 resultType 映射结果:

    如果 SQL 查询的返回结果与 Java 类的字段直接对应,MyBatis 会自动将结果集映射到 Java 对象中。

    复制代码
    <select id="selectUserById" resultType="com.example.domain.User">
        SELECT id, name, email FROM users WHERE id = #{id}
    </select>
  • 使用 resultMap 映射复杂的查询结果:

    对于复杂的查询(例如一对多关系),可以使用 resultMap 映射更复杂的对象结构。

    复制代码
    <resultMap id="userResultMap" type="com.example.domain.User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="email" column="email"/>
        <collection property="orders" ofType="com.example.domain.Order" 
                    select="selectOrdersByUserId" column="id"/>
    </resultMap>

    这里,selectOrdersByUserId 是一个子查询,用于加载用户的订单信息。

6. 提交事务或回滚

MyBatis 支持事务管理。如果使用 SqlSessionFactory.openSession(true) 方法,SqlSession 会自动提交事务。如果没有启用自动提交,则需要手动提交事务。

  • 步骤
    • 如果执行了更新、插入或删除操作,需要调用 session.commit() 提交事务。

    • 如果操作失败,可以调用 session.rollback() 来回滚事务。

      session.commit(); // 提交事务
      session.rollback(); // 回滚事务

7. 关闭 SqlSession

使用完 SqlSession 后,必须关闭它,释放数据库连接。否则,可能会造成连接泄漏。

复制代码
session.close();  // 关闭 SqlSession

总结 MyBatis 工作流程

  1. 加载配置文件 :MyBatis 通过 SqlSessionFactoryBuilder 读取 mybatis-config.xml 文件并创建 SqlSessionFactory
  2. 创建 SqlSession :通过 SqlSessionFactory.openSession() 创建 SqlSession 实例,执行 SQL 操作。
  3. 执行 SQL 语句 :使用 SqlSession 调用映射的 SQL 语句(如 selectOne()selectList() 等)。
  4. 映射查询结果:MyBatis 将查询结果自动映射为 Java 对象,支持动态 SQL 和复杂映射。
  5. 事务处理:提交或回滚事务。
  6. 关闭 SqlSession :使用完 SqlSession 后,必须关闭它。

这个流程体现了 MyBatis 在执行 SQL 时的高灵活性和控制力,但也要求开发者对 SQL 和映射有更多的掌控。

相关推荐
没有bug.的程序员4 分钟前
JVM 运行时数据区详解:内存模型与对象生命周期全景解析
java·jvm·运行时数据区·内存模型·对象生命周期
老虎06278 分钟前
JavaWeb前端02(JavaScript)
开发语言·前端·javascript
一语长情20 分钟前
Netty流量整形:保障微服务通信稳定性的关键策略
java·后端·架构
Python私教28 分钟前
YggJS RLogin暗黑霓虹主题登录注册页面 版本:v0.1.1
开发语言·javascript·ecmascript
盖世英雄酱581361 小时前
第一个RAG项目遇到的问题
java·spring boot
carver w1 小时前
MFC,C++,海康SDK,回调,轮询
开发语言·c++·mfc
最初的↘那颗心1 小时前
Flink Stream API - 源码开发需求描述
java·大数据·hadoop·flink·实时计算
王廷胡_白嫖帝1 小时前
Qt猜数字游戏项目开发教程 - 从零开始构建趣味小游戏
开发语言·qt·游戏
XH华1 小时前
C语言第九章字符函数和字符串函数
c语言·开发语言
华仔啊1 小时前
别学23种了!Java项目中最常用的6个设计模式,附案例
java·后端·设计模式