UserMapper 接口定义
MyBatis 的增删改操作通常在 Mapper 接口中定义方法,通过注解或 XML 映射文件实现 SQL 绑定。以下是典型的增删改方法定义示例:
public interface UserMapper {
// 插入用户
@Insert("INSERT INTO user(name, age, email) VALUES(#{name}, #{age}, #{email})")
int insertUser(User user);
// 更新用户
@Update("UPDATE user SET name=#{name}, age=#{age}, email=#{email} WHERE id=#{id}")
int updateUser(User user);
// 删除用户
@Delete("DELETE FROM user WHERE id=#{id}")
int deleteUserById(Long id);
}
单元测试实现
单元测试用于验证 Mapper 方法的正确性,通常使用 Spring Boot 的 @SpringBootTest
或 MyBatis 原生测试工具。以下是基于 JUnit 5 的测试示例:
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
@Transactional // 测试后自动回滚
void testInsertUser() {
User user = new User(null, "Alice", 25, "alice@example.com");
int result = userMapper.insertUser(user);
assertEquals(1, result); // 验证影响行数
assertNotNull(user.getId()); // 验证自增ID回填
}
@Test
@Transactional
void testUpdateUser() {
User user = new User(1L, "Bob", 30, "bob@example.com");
int result = userMapper.updateUser(user);
assertEquals(1, result);
}
@Test
@Transactional
void testDeleteUser() {
int result = userMapper.deleteUserById(1L);
assertEquals(1, result);
}
}
XML 映射方式
若使用 XML 配置代替注解,需在 resources/mapper/UserMapper.xml
中定义:
<mapper namespace="com.example.mapper.UserMapper">
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user(name, age, email) VALUES(#{name}, #{age}, #{email})
</insert>
<update id="updateUser">
UPDATE user SET name=#{name}, age=#{age}, email=#{email} WHERE id=#{id}
</update>
<delete id="deleteUserById">
DELETE FROM user WHERE id=#{id}
</delete>
</mapper>
参数传递说明
- 插入操作:
useGeneratedKeys="true"
表示启用自增主键回填,keyProperty
指定回填到实体类的字段名。 - 更新/删除操作:通常通过实体类或
@Param
注解传递参数,如deleteUserById(@Param("id") Long id)
。
事务控制建议
- 测试类添加
@Transactional
注解使操作在测试后自动回滚,避免污染数据库。 - 生产环境需在 Service 层使用
@Transactional
管理事务。
日志调试技巧
在 application.properties
中开启 MyBatis 日志可查看实际执行的 SQL:
logging.level.com.example.mapper=debug