4.3 Mapper API
Mapper API 用 Java 接口组织数据访问层。它不是单一的某种写法,而是一组 API 的统称:同一个 Mapper 接口可以混合使用方法注解、BaseMapper 通用 CRUD 和 Mapper 文件。
先选写法
| 你的情况 | 推荐写法 | 说明 |
|---|---|---|
| SQL 短,放在接口旁边最清楚 | 方法注解 | @Query/@Insert/@Update/@Delete 声明 SQL |
| 单表 CRUD,不想写 SQL | BaseMapper | 继承 BaseMapper<T> 获得零 SQL 的增删改查 |
| 条件组合复杂,但希望挂在 Mapper 接口上 | BaseMapper 切换 | mapper.query() 进入构造器 API |
| SQL 长或需要集中维护 | Mapper 文件 | XML 集中管理 SQL,接口方法引用文件中的语句 |
三种常见写法
方法注解
@SimpleMapper
public interface UserMapper {
@Query("select * from users where id = #{id}")
User selectById(@Param("id") long id);
@Insert("insert into users (name, age) values (#{name}, #{age})")
int insertUser(User user);
}
适合 SQL 短小的场景。详细用法:方法注解
BaseMapper(通用 CRUD)
@SimpleMapper
public interface UserMapper extends BaseMapper<User> {
// 继承后直接获得 insert / update / delete / selectById / pageBySample 等方法
}
UserMapper mapper = session.createMapper(UserMapper.class);
// 零 SQL 的 CRUD
mapper.insert(user);
User u = mapper.selectById(1L);
List<User> users = mapper.listBySample(sample);
// 条件复杂时切换到构造器 API
List<User> result = mapper.query()
.likeRight(User::getName, "A")
.ge(User::getAge, 18)
.queryForList();
适合单表 CRUD 为主的场景。详细用法:BaseMapper 通用 CRUD
Mapper 文件
@RefMapper("/mapper/userMapper.xml")
public interface UserMapper {
List<User> listUsers(@Param("status") String status, @Param("name") String name);
}
userMapper.xml
<mapper namespace="com.example.UserMapper">
<select id="listUsers" resultType="com.example.User">
select * from users
@{and, status = :status}
@{and, name like concat(:name, '%')}
</select>
</mapper>