《Mybatis 手撸专栏》第4章:Mapper XML的解析和注册使用

259 阅读4分钟

Mybatis 手撸专栏

第4章:Mapper XML的解析和注册使用

欢迎来到《Mybatis 手撸专栏》的第4章!在本章中,我们将深入探讨 Mybatis 中 Mapper XML 的解析和注册使用。Mapper XML 是 Mybatis 配置文件中负责定义 SQL 语句和结果映射的部分,它的灵活性和易用性是 Mybatis 的核心优势之一。

在本文中,我将向您展示如何解析和注册 Mapper XML,并提供详细代码示例以供参考。让我们开始吧!

1. Mapper XML 的基本结构

在 Mybatis 中,Mapper XML 是一个独立的文件,用于定义 SQL 语句和结果映射。它的基本结构如下:

<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
    <!-- SQL 语句和结果映射定义 -->
</mapper>

在上述示例中,我们使用 <mapper> 标签来定义 Mapper XML 的命名空间,并在其中编写 SQL 语句和结果映射的定义。下面我们将详细介绍如何定义 SQL 语句和结果映射。

2. 定义 SQL 语句

通过 Mapper XML,我们可以方便地定义和组织 SQL 语句,以便在 Java 代码中进行使用。下面是一些常用的 SQL 语句定义示例:

2.1 查询语句

通过 <select> 标签可以定义查询语句,并使用 <resultMap> 标签定义结果映射。下面是一个查询单个用户信息的示例:

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

<resultMap id="userResultMap" type="com.example.model.User">
    <id column="id" property="id"/>
    <result column="name" property="name"/>
</resultMap>

在上述示例中,我们使用 <select> 标签定义了一个查询语句,通过 resultMap 属性指定了结果映射。<resultMap> 标签用于定义结果映射,通过 <id><result> 标签可以指定数据库列和 Java 对象属性之间的映射关系。

2.2 插入语句

通过 <insert> 标签可以定义插入语句,并使用 <selectKey> 标签定义主键生成策略。下面是一个插入用户信息的示例:

<insert id="insertUser">
    <selectKey keyProperty="id" resultType="int" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
    INSERT INTO user (name) VALUES (#{name})
</insert>

在上述示例中,我们使用 <insert> 标签定义了一个插入语句。通过 <selectKey> 标签可以指定主键生成策略,并将生成的主键值设置到 Java 对象的属性中。

2.3 更新语句

通过 <update> 标签可以定义更新语句。下面是一个更新用户信息的示例:

<update id="updateUser">
    UPDATE user SET name = #{name} WHERE id = #{id}
</update>

在上述示例中,我们使用 <update> 标签定义了一个更新语句,通过占位符 #{name}#{id} 来表示参数值。

2.4 删除语句

通过 <delete> 标签可以定义删除语句。下面是一个删除用户信息的示例:

<delete id="deleteUser">
    DELETE FROM user WHERE id = #{id}
</delete>

在上述示例中,我们使用 <delete> 标签定义了一个删除语句,通过占位符 #{id} 来表示参数值。

3. 注册 Mapper XML

在使用 Mapper XML 之前,我们需要将其注册到 Mybatis 的配置中,以便让 Mybatis 知道我们要使用哪个 Mapper XML。下面是注册 Mapper XML 的示例:

<!-- MybatisConfig.xml -->
<configuration>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
    </mappers>
</configuration>

在上述示例中,我们使用 <mappers> 标签来定义要注册的 Mapper XML。通过 <mapper> 标签的 resource 属性指定了 Mapper XML 文件的路径。

在 Java 代码中,我们加载 Mybatis 配置文件,并使用 SqlSessionFactoryBuilder 构建 SqlSessionFactory 对象。然后,通过 SqlSessionFactory 创建 SqlSession 对象,以便进行数据库操作。

public class MybatisApp {
    public static void main(String[] args) throws IOException {
        // 加载 Mybatis 配置文件
        InputStream inputStream = Resources.getResourceAsStream("MybatisConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 创建 SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 使用 SqlSession 进行数据库操作

        // 提交事务并关闭 SqlSession
        sqlSession.commit();
        sqlSession.close();
    }
}

在上述示例中,我们通过加载配置文件和创建 SqlSessionFactory 对象,得到了一个可用的 SqlSession 实例用于操作数据库。

4. 使用 Mapper XML

通过映射器的代理对象,我们可以方便地使用 Mapper XML 定义的 SQL 语句和结果映射。下面是一些示例代码:

public interface UserMapper {
    User getUserById(int id);

    void insertUser(User user);

    void updateUser(User user);

    void deleteUser(int id);
}

在上述示例中,我们定义了一些映射器接口,并在接口中定义了对应的数据库操作方法。接下来,我们通过映射器的代理对象来使用这些方法。

public class MybatisApp {
    public static void main(String[] args) throws IOException {
        // 加载 Mybatis 配置文件
        InputStream inputStream = Resources.getResourceAsStream("MybatisConfig.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 创建 SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();

        // 获取映射器代理对象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        // 使用映射器方法进行数据库操作
        User user = userMapper.getUserById(1);
        System.out.println(user);

        User newUser = new User("John Doe");
        userMapper.insertUser(newUser);

        newUser.setName("Jane Doe");
        userMapper.updateUser(newUser);

        userMapper.deleteUser(1);

        // 提交事务并关闭 SqlSession
        sqlSession.commit();
        sqlSession.close();
    }
}

在上述示例中,我们通过 SqlSession 对象的 getMapper() 方法获取了映射器的代理对象。这样,我们就可以直接调用映射器的方法进行数据库操作了。

5. 总结

通过本章的学习,我们了解了 Mybatis 中 Mapper XML 的解析和注册使用方法。我们学习了如何定义 SQL 语句和结果映射,并展示了如何注册和使用 Mapper XML。最后,我们演示了如何通过映射器的代理对象来调用 Mapper XML 中定义的 SQL 语句。

希望本章的内容对您理解和使用 Mapper XML 有所帮助。下一章,我们将继续探讨 Mybatis 的更多重要功能,敬请期待!