在 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,如 if
、foreach
、choose
等:
<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 映射! 🚀