全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-20 6 分钟 ✍️ juanwangdev

@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

📝 发现内容有误?点击此处直接编辑

← 上一篇 @Results 结果映射
下一篇 → @SelectProvider 动态 SQL
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库