MyBatis实战指南(三):常用注解及使用方法
字数 1745 2025-08-18 11:36:36

MyBatis注解全面指南

一、注解基础概念

1. 注解定义

注解(Annotation)是从JDK1.5开始引入的技术,是一种用于描述代码的元数据,可以被编译器、库和其他工具读取和使用。

2. 注解特性

  • 格式:以@注解名的方式实现,可带参数值,如@SuppressWarnings(value="unchecked")
  • 作用位置:package、class、method、field等
  • 作用:为代码提供额外辅助信息,不是程序本身

3. 注解分类

  1. 元注解

    • @Target:描述注解使用范围
    • @Retention:描述注解生命周期
    • @Documented:说明注解将被包含在javadoc中
    • @Inherited:说明子类可继承父类中的该注解
    • @Repeatable:可重复注解
  2. 内置注解

    • @Override:重写检查
    • @Deprecated:标记过时
    • @SuppressWarnings:压制警告
    • @FunctionalInterface:函数式接口
  3. 自定义注解

    public @interface MyAnno {}
    

二、MyBatis注解使用基础

1. 基本配置步骤

  1. 全局配置文件中配置映射

    <mappers>
      <mapper class="com.cy.mybatis.mapper.UserMapper"/>
    </mappers>
    
  2. 在Mapper接口方法上添加注解

    @Select("select * from user where uid = #{uid}")
    public User findUserById(int uid);
    
  3. 创建会话调用方法

三、MyBatis核心注解详解

1. CRUD操作注解

@Select

  • 作用:标记查询语句
  • 示例
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(@Param("id") Long id);
    

@Insert

  • 作用:标记插入语句
  • 示例
    @Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
    int addUser(User user);
    

@Update

  • 作用:标记更新语句
  • 示例
    @Update("UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}")
    int updateUser(User user);
    

@Delete

  • 作用:标记删除语句
  • 示例
    @Delete("DELETE FROM users WHERE id = #{id}")
    int deleteUserById(@Param("id") Long id);
    

2. 结果映射注解

@Results

  • 作用:指定多个@Result注解
  • 示例
    @Select("SELECT * FROM users WHERE id = #{id}")
    @Results(id = "userResultMap", value = {
      @Result(property = "id", column = "id"),
      @Result(property = "name", column = "name"),
      @Result(property = "age", column = "age")
    })
    User getUserById(@Param("id") Long id);
    

@Result

  • 作用:指定单个属性与结果集列的映射关系
  • 使用场景:与@Results配合使用

@ResultMap

  • 作用:引用已定义的结果集映射
  • 示例
    @Select("SELECT * FROM users WHERE id = #{id}")
    @ResultMap("userResultMap")
    User getUserById(@Param("id") Long id);
    

3. 主键处理注解

@Options

  • 作用:指定插入语句选项
  • 常用参数
    • useGeneratedKeys:是否使用生成的主键
    • keyProperty:主键属性名
  • 示例
    @Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insertUser(User user);
    

@SelectKey

  • 作用:获取自动生成的主键值
  • 示例
    @Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")
    @SelectKey(statement = "SELECT LAST_INSERT_ID()", 
              keyProperty = "id", 
              before = false, 
              resultType = Long.class)
    int insertUser(User user);
    

4. 参数处理注解

@Param

  • 作用:指定方法参数名称
  • 示例
    @Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")
    List<User> getUsersByNameAndAge(@Param("name") String name, @Param("age") Integer age);
    

5. 关联关系注解

@One

  • 作用:指定一对一关联关系
  • XML示例
    <resultMap id="departmentResultMap" type="Department">
      <id column="id" property="id"/>
      <result column="name" property="name"/>
      <result column="description" property="description"/>
      <one property="manager" resultMap="userResultMap"/>
    </resultMap>
    

@Many

  • 作用:指定一对多关联关系
  • XML示例
    <resultMap id="departmentResultMap" type="Department">
      <id column="id" property="id"/>
      <result column="name" property="name"/>
      <result column="description" property="description"/>
      <collection property="members" ofType="User" resultMap="userResultMap"/>
    </resultMap>
    

6. 类型处理注解

@ResultType

  • 作用:指定查询结果集类型
  • 示例
    @Select("SELECT name, age FROM users WHERE id = #{id}")
    @ResultType(User.class)
    User getUserById(Long id);
    

@TypeDiscriminator

  • 作用:指定类型鉴别器
  • XML示例
    <resultMap id="vehicleResultMap" type="Vehicle">
      <discriminator javaType="String" column="type">
        <case value="car" resultMap="carResultMap"/>
        <case value="truck" resultMap="truckResultMap"/>
        <case value="bus" resultMap="busResultMap"/>
      </discriminator>
    </resultMap>
    

@Discriminator

  • 作用:指定类型鉴别器的查询结果
  • 示例
    @Select("SELECT * FROM vehicle WHERE type = #{type}")
    @Discriminator(column = "type", javaType = String.class, cases = {
      @Case(value = "car", type = Car.class),
      @Case(value = "truck", type = Truck.class),
      @Case(value = "bus", type = Bus.class)
    })
    List<Vehicle> getVehiclesByType(String type);
    

7. 构造方法注解

@ConstructorArgs

  • 作用:指定构造方法参数
  • XML示例
    <resultMap id="userResultMap" type="User">
      <constructor>
        <arg column="name" javaType="String"/>
        <arg column="age" javaType="int"/>
      </constructor>
    </resultMap>
    

@Arg

  • 作用:指定构造方法参数映射
  • 示例
    @Select("SELECT name, age FROM users WHERE id = #{id}")
    User getUserById(@Arg("name") String name, @Arg("age") int age);
    

8. 缓存相关注解

@CacheNamespace

  • 作用:指定缓存的命名空间
  • 示例
    @CacheNamespace(
      implementation = MyBatisRedisCache.class,
      eviction = MyBatisRedisCache.Eviction.LRU,
      flushInterval = 60000,
      size = 10000,
      readWrite = true,
      blocking = true)
    public interface UserMapper {
      @Select("SELECT * FROM users WHERE id = #{id}")
      User getUserById(Long id);
    }
    

@Flush

  • 作用:在执行方法前或后刷新缓存
  • 示例
    @Select("SELECT * FROM users WHERE id = #{id}")
    @Flush(flushCache = FetchType.AFTER)
    User getUserById(Long id);
    

9. 类型映射注解

@MappedJdbcTypes

  • 作用:指定Java类型对应的JDBC类型
  • 示例
    public class User {
      @MappedJdbcTypes(JdbcType.VARCHAR)
      private String name;
    }
    

@MappedTypes

  • 作用:指定Java类型
  • 示例
    @MappedTypes(User.class)
    public interface UserMapper {
      @Select("SELECT * FROM users WHERE id = #{id}")
      User getUserById(Long id);
    }
    

10. 动态SQL提供者注解

@SelectProvider

  • 作用:动态生成查询SQL
  • 示例
    @SelectProvider(type = UserSqlProvider.class, method = "getUserByIdSql")
    User getUserById(Long id);
    

@InsertProvider

  • 作用:动态生成插入SQL
  • 示例
    @InsertProvider(type = UserSqlProvider.class, method = "insertUserSql")
    int insertUser(User user);
    

@UpdateProvider

  • 作用:动态生成更新SQL
  • 示例
    @UpdateProvider(type = UserSqlProvider.class, method = "updateUserSql")
    int updateUser(User user);
    

@DeleteProvider

  • 作用:动态生成删除SQL
  • 示例
    @DeleteProvider(type = UserSqlProvider.class, method = "deleteUserSql")
    int deleteUser(Long id);
    

四、最佳实践建议

  1. 简单查询:优先使用注解方式,代码更简洁
  2. 复杂SQL:考虑使用XML配置方式,更易维护
  3. 结果映射:对于复杂对象关系,使用@Results和@ResultMap
  4. 动态SQL:使用Provider类实现复杂条件查询
  5. 缓存控制:合理使用@CacheNamespace和@Flush优化性能

五、总结

MyBatis注解提供了一种简洁高效的SQL映射方式,可以显著减少XML配置的工作量。掌握这些注解的使用方法,能够根据不同的业务场景选择最合适的实现方式,提高开发效率和代码可读性。

MyBatis注解全面指南 一、注解基础概念 1. 注解定义 注解(Annotation)是从JDK1.5开始引入的技术,是一种用于描述代码的元数据,可以被编译器、库和其他工具读取和使用。 2. 注解特性 格式 :以 @注解名 的方式实现,可带参数值,如 @SuppressWarnings(value="unchecked") 作用位置 :package、class、method、field等 作用 :为代码提供额外辅助信息,不是程序本身 3. 注解分类 元注解 : @Target :描述注解使用范围 @Retention :描述注解生命周期 @Documented :说明注解将被包含在javadoc中 @Inherited :说明子类可继承父类中的该注解 @Repeatable :可重复注解 内置注解 : @Override :重写检查 @Deprecated :标记过时 @SuppressWarnings :压制警告 @FunctionalInterface :函数式接口 自定义注解 : 二、MyBatis注解使用基础 1. 基本配置步骤 全局配置文件中配置映射 : 在Mapper接口方法上添加注解 : 创建会话调用方法 三、MyBatis核心注解详解 1. CRUD操作注解 @Select 作用 :标记查询语句 示例 : @Insert 作用 :标记插入语句 示例 : @Update 作用 :标记更新语句 示例 : @Delete 作用 :标记删除语句 示例 : 2. 结果映射注解 @Results 作用 :指定多个@Result注解 示例 : @Result 作用 :指定单个属性与结果集列的映射关系 使用场景 :与@Results配合使用 @ResultMap 作用 :引用已定义的结果集映射 示例 : 3. 主键处理注解 @Options 作用 :指定插入语句选项 常用参数 : useGeneratedKeys :是否使用生成的主键 keyProperty :主键属性名 示例 : @SelectKey 作用 :获取自动生成的主键值 示例 : 4. 参数处理注解 @Param 作用 :指定方法参数名称 示例 : 5. 关联关系注解 @One 作用 :指定一对一关联关系 XML示例 : @Many 作用 :指定一对多关联关系 XML示例 : 6. 类型处理注解 @ResultType 作用 :指定查询结果集类型 示例 : @TypeDiscriminator 作用 :指定类型鉴别器 XML示例 : @Discriminator 作用 :指定类型鉴别器的查询结果 示例 : 7. 构造方法注解 @ConstructorArgs 作用 :指定构造方法参数 XML示例 : @Arg 作用 :指定构造方法参数映射 示例 : 8. 缓存相关注解 @CacheNamespace 作用 :指定缓存的命名空间 示例 : @Flush 作用 :在执行方法前或后刷新缓存 示例 : 9. 类型映射注解 @MappedJdbcTypes 作用 :指定Java类型对应的JDBC类型 示例 : @MappedTypes 作用 :指定Java类型 示例 : 10. 动态SQL提供者注解 @SelectProvider 作用 :动态生成查询SQL 示例 : @InsertProvider 作用 :动态生成插入SQL 示例 : @UpdateProvider 作用 :动态生成更新SQL 示例 : @DeleteProvider 作用 :动态生成删除SQL 示例 : 四、最佳实践建议 简单查询 :优先使用注解方式,代码更简洁 复杂SQL :考虑使用XML配置方式,更易维护 结果映射 :对于复杂对象关系,使用@Results和@ResultMap 动态SQL :使用Provider类实现复杂条件查询 缓存控制 :合理使用@CacheNamespace和@Flush优化性能 五、总结 MyBatis注解提供了一种简洁高效的SQL映射方式,可以显著减少XML配置的工作量。掌握这些注解的使用方法,能够根据不同的业务场景选择最合适的实现方式,提高开发效率和代码可读性。