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 和映射有更多的掌控。

相关推荐
饼干,3 小时前
第23天python内容
开发语言·python
这周也會开心3 小时前
SpringMVC整理
java·springmvc
東雪木3 小时前
Spring Boot 2.x 集成 Knife4j (OpenAPI 3) 完整操作指南
java·spring boot·后端·swagger·knife4j·java异常处理
数学难3 小时前
Java面试题2:Java线程池原理
java·开发语言
Charles_go3 小时前
C#8、有哪些访问修饰符
java·前端·c#
qwer12321ck763 小时前
srcType instanceof Class 及泛型 vs 普通类
java
咸鱼求放生3 小时前
Java 8 Stream API
java·开发语言
盒马盒马3 小时前
Rust:Trait 抽象接口 & 特征约束
开发语言·rust
天使街23号3 小时前
go-dongle v1.2.0 发布,新增 SM2 非对称椭圆曲线加密算法支持
开发语言·后端·golang
ThreeYear_s4 小时前
【FPGA+DSP系列】——MATLAB simulink仿真三相桥式全控整流电路
开发语言·matlab·fpga开发