MyBatis实战指南(三):常用注解及使用方法
字数 1745 2025-08-18 11:36:36
MyBatis注解全面指南
一、注解基础概念
1. 注解定义
注解(Annotation)是从JDK1.5开始引入的技术,是一种用于描述代码的元数据,可以被编译器、库和其他工具读取和使用。
2. 注解特性
- 格式:以
@注解名的方式实现,可带参数值,如@SuppressWarnings(value="unchecked") - 作用位置:package、class、method、field等
- 作用:为代码提供额外辅助信息,不是程序本身
3. 注解分类
-
元注解:
@Target:描述注解使用范围@Retention:描述注解生命周期@Documented:说明注解将被包含在javadoc中@Inherited:说明子类可继承父类中的该注解@Repeatable:可重复注解
-
内置注解:
@Override:重写检查@Deprecated:标记过时@SuppressWarnings:压制警告@FunctionalInterface:函数式接口
-
自定义注解:
public @interface MyAnno {}
二、MyBatis注解使用基础
1. 基本配置步骤
-
全局配置文件中配置映射:
<mappers> <mapper class="com.cy.mybatis.mapper.UserMapper"/> </mappers> -
在Mapper接口方法上添加注解:
@Select("select * from user where uid = #{uid}") public User findUserById(int uid); -
创建会话调用方法
三、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);
四、最佳实践建议
- 简单查询:优先使用注解方式,代码更简洁
- 复杂SQL:考虑使用XML配置方式,更易维护
- 结果映射:对于复杂对象关系,使用@Results和@ResultMap
- 动态SQL:使用Provider类实现复杂条件查询
- 缓存控制:合理使用@CacheNamespace和@Flush优化性能
五、总结
MyBatis注解提供了一种简洁高效的SQL映射方式,可以显著减少XML配置的工作量。掌握这些注解的使用方法,能够根据不同的业务场景选择最合适的实现方式,提高开发效率和代码可读性。