【mybatis学习】关于mybatis映射方式定义以及优势

在 MyBatis 中,定义映射(Mapper)主要有 XML 映射文件注解方式 两种方式。以下是详细的定义方法:


1. XML 映射文件方式(推荐)

(1) 创建 Mapper 接口

// UserMapper.java
public interface UserMapper {
    User getUserById(Long id);
    List<User> getAllUsers();
    void insertUser(User user);
    void updateUser(User user);
    void deleteUser(Long id);
}

(2) 创建 XML 映射文件(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">

<!-- namespace 必须对应 Mapper 接口的全限定名 -->
<mapper namespace="com.example.mapper.UserMapper">

    <!-- 定义结果映射(如果数据库字段和 Java 属性不一致) -->
    <resultMap id="userResultMap" type="com.example.entity.User">
        <id property="id" column="id" />
        <result property="username" column="user_name" />
        <result property="email" column="email" />
    </resultMap>

    <!-- 查询单个用户 -->
    <select id="getUserById" resultMap="userResultMap">
        SELECT * FROM users WHERE id = #{id}
    </select>

    <!-- 查询所有用户 -->
    <select id="getAllUsers" resultType="com.example.entity.User">
        SELECT * FROM users
    </select>

    <!-- 插入用户 -->
    <insert id="insertUser" parameterType="com.example.entity.User">
        INSERT INTO users (user_name, email) 
        VALUES (#{username}, #{email})
    </insert>

    <!-- 更新用户 -->
    <update id="updateUser" parameterType="com.example.entity.User">
        UPDATE users 
        SET user_name = #{username}, email = #{email}
        WHERE id = #{id}
    </update>

    <!-- 删除用户 -->
    <delete id="deleteUser">
        DELETE FROM users WHERE id = #{id}
    </delete>
</mapper>

(3) 在 MyBatis 配置文件中注册 Mapper

<!-- mybatis-config.xml -->
<mappers>
    <mapper resource="com/example/mapper/UserMapper.xml" />
</mappers>

或者扫描整个包:

<mappers>
    <package name="com.example.mapper" />
</mappers>

2. 注解方式(适用于简单 SQL)

如果 SQL 较简单,可以直接在 Mapper 接口上使用注解:

public interface UserMapper {

    @Select("SELECT * FROM users WHERE id = #{id}")
    @Results({
        @Result(property = "username", column = "user_name"),
        @Result(property = "email", column = "email")
    })
    User getUserById(Long id);

    @Select("SELECT * FROM users")
    List<User> getAllUsers();

    @Insert("INSERT INTO users (user_name, email) VALUES (#{username}, #{email})")
    void insertUser(User user);

    @Update("UPDATE users SET user_name = #{username}, email = #{email} WHERE id = #{id}")
    void updateUser(User user);

    @Delete("DELETE FROM users WHERE id = #{id}")
    void deleteUser(Long id);
}

3. 动态 SQL(XML 方式)

MyBatis 支持动态 SQL,如 ifforeachchoose 等:

<select id="findUsers" resultType="User">
    SELECT * FROM users
    <where>
        <if test="username != null">
            AND user_name = #{username}
        </if>
        <if test="email != null">
            AND email = #{email}
        </if>
    </where>
</select>

4. 关联查询(1对1、1对多)

(1) 1对1 关联(association)

<resultMap id="orderResultMap" type="Order">
    <id property="id" column="order_id" />
    <result property="orderNo" column="order_no" />
    <association property="user" javaType="User">
        <id property="id" column="user_id" />
        <result property="username" column="user_name" />
    </association>
</resultMap>

<select id="getOrderWithUser" resultMap="orderResultMap">
    SELECT o.id as order_id, o.order_no, u.id as user_id, u.user_name
    FROM orders o
    LEFT JOIN users u ON o.user_id = u.id
    WHERE o.id = #{id}
</select>

(2) 1对多 关联(collection)

<resultMap id="userWithOrdersMap" type="User">
    <id property="id" column="id" />
    <result property="username" column="user_name" />
    <collection property="orders" ofType="Order">
        <id property="id" column="order_id" />
        <result property="orderNo" column="order_no" />
    </collection>
</resultMap>

<select id="getUserWithOrders" resultMap="userWithOrdersMap">
    SELECT u.id, u.user_name, o.id as order_id, o.order_no
    FROM users u
    LEFT JOIN orders o ON u.id = o.user_id
    WHERE u.id = #{id}
</select>

总结

方式适用场景优点缺点
XML 映射复杂 SQL、动态 SQL可读性好,维护方便需要额外 XML 文件
注解方式简单 SQL代码简洁复杂 SQL 难以维护
动态 SQL条件查询灵活仅 XML 方式支持

推荐:

  • 简单查询 → 注解方式
  • 复杂查询、动态 SQL → XML 方式

希望这个指南能帮助你正确配置 MyBatis 映射! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值