@Select 等基础注解
MyBatis 提供四个基础 CRUD 注解,将 SQL 直接写在 Mapper 接口方法上,无需编写对应的 XML Mapper 文件。
四大 CRUD 注解
| 注解 | 用途 | 返回值 |
|---|---|---|
@Select | 查询语句 | List<T> / T |
@Insert | 插入语句 | int(影响行数) |
@Update | 更新语句 | int(影响行数) |
@Delete | 删除语句 | int(影响行数) |
@Select 查询
基础查询
Java
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User getById(@Param("id") Long id);
@Select("SELECT * FROM users WHERE status = #{status}")
List<User> listByStatus(@Param("status") Integer status);
@Select("SELECT COUNT(*) FROM users")
int countAll();
}
多条件查询
Java
@Select("SELECT * FROM users WHERE name LIKE #{name} AND age >= #{age} AND dept_id = #{deptId}")
List<User> search(@Param("name") String name,
@Param("age") Integer age,
@Param("deptId") Long deptId);
单列值查询
Java
@Select("SELECT name FROM users WHERE id = #{id}")
String getNameById(@Param("id") Long id);
@Select("SELECT email FROM users WHERE id = #{id}")
String getEmailById(@Param("id") Long id);
@Insert 插入
基础插入
Java
@Insert("INSERT INTO users(name, email, age, dept_id) " +
"VALUES(#{name}, #{email}, #{age}, #{deptId})")
int insert(User user);
自增主键回填
Java
@Insert("INSERT INTO users(name, email, age) VALUES(#{name}, #{email}, #{age})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insertWithGeneratedKey(User user);
插入后通过
user.getId()获取自增主键,keyProperty指向实体字段名。
多行批量插入
Java
@Insert("<script>" +
"INSERT INTO users(name, email) VALUES " +
"<foreach collection='list' item='u' separator=','>" +
"(#{u.name}, #{u.email})" +
"</foreach>" +
"</script>")
int batchInsert(@Param("list") List<User> users);
批量插入使用
<script>标签包裹,内部可写 XML 动态 SQL。
@Update 更新
基础更新
Java
@Update("UPDATE users SET name = #{name}, email = #{email}, age = #{age} WHERE id = #{id}")
int update(User user);
单字段更新
Java
@Update("UPDATE users SET status = #{status} WHERE id = #{id}")
int updateStatus(@Param("id") Long id, @Param("status") Integer status);
@Update("UPDATE users SET login_time = NOW() WHERE id = #{id}")
int updateLoginTime(@Param("id") Long id);
@Delete 删除
基础删除
Java
@Delete("DELETE FROM users WHERE id = #{id}")
int deleteById(@Param("id") Long id);
@Delete("DELETE FROM users WHERE dept_id = #{deptId}")
int deleteByDeptId(@Param("deptId") Long deptId);
批量删除
Java
@Delete("<script>" +
"DELETE FROM users WHERE id IN " +
"<foreach collection='ids' item='id' open='(' separator=',' close=')'>" +
"#{id}" +
"</foreach>" +
"</script>")
int batchDelete(@Param("ids") List<Long> ids);
注解 vs XML 对比
| 维度 | 注解方式 | XML Mapper |
|---|---|---|
| SQL 位置 | 接口方法上 | 独立 XML 文件 |
| 简单 CRUD | 简洁直观 | 需写完整标签 |
| 动态 SQL | 需 <script> 包裹 | 原生支持 <if> <foreach> |
| 复杂查询 | 可读性下降 | 格式清晰,易维护 |
| 文件数量 | 零 XML 文件 | 每个 Mapper 一个 XML |
适用场景
适合用注解:
- 简单 CRUD 操作
- SQL 语句固定、无动态拼接
- 项目规模小,不想维护 XML
适合用 XML:
- 复杂动态 SQL(多条件组合)
- 长 SQL 语句(超过 3 行)
- 需要频繁修改 SQL 的场景
要点总结
@Select/@Insert/@Update/@Delete直接在接口方法上写 SQL,替代 XML Mapper@Options(useGeneratedKeys = true, keyProperty = "id")实现自增主键回填- 多行动态 SQL 使用
<script>标签包裹,内部写 XML 语法 - 简单 CRUD 推荐注解方式,复杂动态 SQL 推荐 XML 方式
- 两种方式可混用:部分方法用注解,部分方法走 XML
📝 发现内容有误?点击此处直接编辑