【详解】MyBatis执行流程

举报
皮牙子抓饭 发表于 2025/07/09 21:59:46 2025/07/09
【摘要】 MyBatis执行流程详解前言MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以通过简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects) 映射成数据库中的记录。本文将详细介绍 MyBati...

MyBatis执行流程详解

前言

MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以通过简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects) 映射成数据库中的记录。

本文将详细介绍 MyBatis 的执行流程,帮助开发者更好地理解其内部机制,从而更高效地使用 MyBatis 进行开发。

MyBatis 执行流程概览

MyBatis 的执行流程可以大致分为以下几个步骤:

  1. 读取配置文件:加载 MyBatis 的全局配置文件(​​mybatis-config.xml​​)。
  2. 构建 SqlSessionFactory:根据配置文件创建 ​​SqlSessionFactory​​ 对象。
  3. 创建 SqlSession:通过 ​​SqlSessionFactory​​ 创建 ​​SqlSession​​ 对象。
  4. 执行 SQL 操作:通过 ​​SqlSession​​ 对象执行 SQL 语句。
  5. 处理结果:处理 SQL 语句的执行结果。
  6. 关闭资源:关闭 ​​SqlSession​​ 和相关资源。

下面我们将详细探讨每个步骤的具体实现。

1. 读取配置文件

MyBatis 的配置文件通常命名为 ​​mybatis-config.xml​​,包含了数据库连接信息、事务管理器配置、类型别名、映射文件路径等。配置文件的示例如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

2. 构建 SqlSessionFactory

​SqlSessionFactory​​ 是 MyBatis 中的核心对象之一,负责创建 ​​SqlSession​​ 实例。​​SqlSessionFactory​​ 通常是单例的,并且在整个应用的生命周期中只创建一次。

String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

3. 创建 SqlSession

​SqlSession​​ 提供了操作数据库的方法,如 ​​selectList​​、​​insert​​、​​update​​ 和 ​​delete​​ 等。​​SqlSession​​ 是线程不安全的,因此每次使用时都需要重新创建。

try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
    // 使用 sqlSession 进行数据库操作
}

4. 执行 SQL 操作

通过 ​​SqlSession​​ 获取 Mapper 接口的实例,然后调用接口中的方法执行 SQL 语句。

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.selectAllUsers();

​UserMapper.xml​​ 文件中的 SQL 语句定义如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectAllUsers" resultType="com.example.model.User">
        SELECT * FROM user
    </select>
</mapper>

5. 处理结果

执行 SQL 语句后,MyBatis 会自动将结果集映射到指定的 Java 对象中。在上面的例子中,查询结果会被映射到 ​​List<User>​​ 类型的集合中。

6. 关闭资源

使用完 ​​SqlSession​​ 后,需要及时关闭以释放资源。通常使用 try-with-resources 语句来自动管理资源的关闭。

try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
    List<User> users = userMapper.selectAllUsers();
    // 处理查询结果
} catch (IOException e) {
    e.printStackTrace();
}

通过以上步骤,我们可以清晰地看到 MyBatis 的执行流程。从读取配置文件到执行 SQL 语句,再到处理结果和关闭资源,每一步都非常重要。理解这些流程有助于我们更好地使用 MyBatis,提高开发效率和代码质量。MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。下面我将通过一个简单的示例来展示 MyBatis 的基本执行流程。

1. 环境准备

首先,确保你的项目中已经引入了 MyBatis 和数据库驱动的依赖。如果你使用的是 Maven,可以在 ​​pom.xml​​ 中添加以下依赖:

<dependencies>
    <!-- MyBatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.7</version>
    </dependency>
    <!-- MySQL 驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.23</version>
    </dependency>
</dependencies>

2. 数据库表结构

假设我们有一个简单的用户表 ​​users​​,表结构如下:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL
);

3. 创建 MyBatis 配置文件

创建一个 ​​mybatis-config.xml​​ 文件,配置数据源和环境:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<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?useSSL=false&serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

4. 创建 Mapper 接口和 XML 文件

创建一个 ​​UserMapper​​ 接口和对应的 ​​UserMapper.xml​​ 文件。

UserMapper.java
public interface UserMapper {
    User selectUserById(int id);
    List<User> selectAllUsers();
    void insertUser(User user);
}
UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
    <resultMap id="UserResultMap" type="com.example.model.User">
        <id property="id" column="id"/>
        <result property="username" column="username"/>
        <result property="email" column="email"/>
    </resultMap>

    <select id="selectUserById" resultMap="UserResultMap">
        SELECT * FROM users WHERE id = #{id}
    </select>

    <select id="selectAllUsers" resultMap="UserResultMap">
        SELECT * FROM users
    </select>

    <insert id="insertUser">
        INSERT INTO users (username, email) VALUES (#{username}, #{email})
    </insert>
</mapper>

5. 创建实体类

创建一个 ​​User​​ 实体类:

public class User {
    private int id;
    private String username;
    private String email;

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

6. 编写测试代码

编写一个测试类来演示 MyBatis 的执行流程:

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisExample {
    public static void main(String[] args) {
        String resource = "mybatis-config.xml";
        InputStream inputStream;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession session = sqlSessionFactory.openSession();

            UserMapper userMapper = session.getMapper(UserMapper.class);

            // 插入一个用户
            User newUser = new User();
            newUser.setUsername("john_doe");
            newUser.setEmail("john@example.com");
            userMapper.insertUser(newUser);
            session.commit();

            // 查询所有用户
            List<User> users = userMapper.selectAllUsers();
            for (User user : users) {
                System.out.println("ID: " + user.getId() + ", Username: " + user.getUsername() + ", Email: " + user.getEmail());
            }

            // 查询单个用户
            User user = userMapper.selectUserById(1);
            System.out.println("ID: " + user.getId() + ", Username: " + user.getUsername() + ", Email: " + user.getEmail());

            session.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

7. 运行测试

运行上述测试类,你将看到以下输出:

ID: 1, Username: john_doe, Email: john@example.com
ID: 1, Username: john_doe, Email: john@example.com

以上示例展示了 MyBatis 的基本执行流程,包括配置文件的创建、Mapper 接口和 XML 文件的定义、实体类的创建以及测试代码的编写。通过这些步骤,你可以轻松地在项目中集成 MyBatis 并进行数据库操作。MyBatis 是一个优秀的持久层框架,它简化了 JDBC 的操作,使得开发者可以更方便地进行数据库操作。下面详细介绍 MyBatis 的执行流程中的关键代码部分。

1. 初始化配置

首先,需要加载 MyBatis 的配置文件 ​​mybatis-config.xml​​,这个文件中包含了数据库连接信息、事务管理器等配置。可以通过 ​​SqlSessionFactoryBuilder​​ 来创建 ​​SqlSessionFactory​​ 对象,这是整个 MyBatis 应用的入口点。

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

2. 创建 SqlSession

通过 ​​SqlSessionFactory​​ 可以获取到 ​​SqlSession​​ 对象,​​SqlSession​​ 提供了操作数据库的方法,如 ​​selectList​​、​​insert​​、​​update​​ 和 ​​delete​​ 等。

try (SqlSession session = sqlSessionFactory.openSession()) {
    // 使用 session 进行数据库操作
}

3. 映射 SQL

在 MyBatis 中,SQL 语句通常写在 XML 文件中,这些文件被称为映射文件(Mapper XML)。映射文件中定义了 SQL 语句以及如何将结果映射到 Java 对象上。

例如,一个简单的映射文件 ​​UserMapper.xml​​ 可能如下所示:

<mapper namespace="org.mybatis.example.UserMapper">
    <select id="selectUser" resultType="org.mybatis.example.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>

4. 执行 SQL

通过 ​​SqlSession​​ 获取 Mapper 接口的实例,然后调用接口中的方法来执行 SQL 语句。Mapper 接口是一个普通的 Java 接口,不需要实现,MyBatis 会动态生成实现类。

try (SqlSession session = sqlSessionFactory.openSession()) {
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = mapper.selectUser(100);
    System.out.println(user.getName());
}

5. 处理结果

执行完 SQL 后,MyBatis 会根据映射文件中的配置自动将结果集转换为 Java 对象或集合。如果需要处理复杂的结果集,可以在映射文件中使用 ​​<resultMap>​​ 标签来定义结果映射规则。

<resultMap id="userResultMap" type="org.mybatis.example.User">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="email" column="email"/>
</resultMap>

<select id="selectUser" resultMap="userResultMap">
    SELECT * FROM user WHERE id = #{id}
</select>

6. 提交或回滚事务

如果执行的是更新操作(如 ​​insert​​、​​update​​ 或 ​​delete​​),需要手动提交事务。如果发生异常,则可以回滚事务。

try (SqlSession session = sqlSessionFactory.openSession()) {
    UserMapper mapper = session.getMapper(UserMapper.class);
    mapper.insertUser(new User("John Doe", "john@example.com"));
    session.commit();
} catch (Exception e) {
    session.rollback();
    e.printStackTrace();
}

7. 关闭资源

在使用完 ​​SqlSession​​ 后,应该关闭它以释放资源。通常使用 try-with-resources 语句来确保资源被正确关闭。

总结

以上就是 MyBatis 执行流程中的主要代码部分。通过这些步骤,MyBatis 能够有效地管理数据库连接、执行 SQL 语句,并将结果映射到 Java 对象中。希望这些介绍对你有所帮助!如果有任何具体问题或需要进一步的解释,请随时告诉我。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。