MyBatis实战指南(三):常用注解及使用方法

YDYXCODE · · 299 次点击 · · 开始浏览    
在前面的两篇文章中,我们已经详细介绍了MyBatis的工作原理和基本使用。今天,我们将深入探讨MyBatis的一个重要特性——注解。如果你对MyBatis的注解还不熟悉,那么这篇文章将为你打开一扇新的大门。 ## 一、什么是注解(Annotation) 首先,我们需要明白什么是注解。注解 Annotation 是从JDK1.5开始引入的新技术。 在Java中,注解是一种用于描述代码的元数据,它可以被编译器、库和其他工具读取和使用。MyBatis的注解就是用来简化XML配置的,它们可以让你的代码更加简洁、易读。 **注解的作用:** - 不是程序本身,对程序作出解释 - 可以被其他程序读取到 **Annotation格式:** 注解是以@注解名的方式在代码中实现的,可以添加一些参数值 如:@SuppressWarnings(value=“unchecked”) **注解使用的位置:** package、class、method、field 等上面,相当于给他们添加了额外的辅助信息。 **注解的分类:** 1.元注解: - @Target:用于描述注解的使用范围 - @Retention:用于描述注解的生命周期 - @Documented:说明该注解将被包含在javadoc 中 - @Inherited:说明子类可以继承父类中的该注解 - @Repeatable:可重复注解 2.内置注解: - @Override: 重写检查 - @Deprecated:过时 - @SuppressWarnings: 压制警告 - @FunctionalInterface: 函数式接口 3.自定义注解: - public @interface MyAnno{} ## 二、Mybatis常用注解 首先介绍一下Mybatis注解的使用方法: 第一步,在全局配置文件里的配置映射 ``` <mappers> <mapper class="com.cy.mybatis.mapper.UserMapper"/> </mappers> ``` 第二步,在mapper接口的方法的上面添加注解 ``` @Select("select * from user where uid = #{uid}") public User findUserById(int uid); ``` 第三步,创建会话调用此方法。 接下来,我们来看看MyBatis中最常用的几个注解: #### (1)@Select 作用:标记查询语句。 @Select用于标记查询语句。该注解可以在接口方法上使用,也可以在XML文件中使用。使用@Select注解时,需要在注解中指定SQL语句。 示例: ``` @Select("SELECT * FROM users WHERE id = #{id}") User getUserById(@Param("id") Long id); ``` ####(2)@Insert 作用:标记插入语句。 @Insert用于标记插入语句。该注解可以在接口方法上使用,也可以在XML文件中使用。使用@Insert注解时,需要在注解中指定SQL语句。 示例: ``` @Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})") int addUser(User user); ``` #### (3)@Update 作用:标记更新语句。 @Update用于标记更新语句。该注解可以在接口方法上使用,也可以在XML文件中使用。使用@Update注解时,需要在注解中指定SQL语句。 示例: ``` @Update("UPDATE users SET name = #{name}, age = #{age} WHERE id = #{id}") int updateUser(User user); ``` #### (4)@Delete 作用:标记删除语句。 @Delete用于标记删除语句。该注解可以在接口方法上使用,也可以在XML文件中使用。使用@Delete注解时,需要在注解中指定SQL语句。 示例: ``` @Delete("DELETE FROM users WHERE id = #{id}") int deleteUserById(@Param("id") Long id); ``` #### (5)@Results 作用:用于指定多个@Result注解。 @Results用于标记结果集映射,该注解可以用于接口方法或XML文件中,通常与@Select注解一起使用。使用@Results注解时,需要指定映射规则。 示例: ``` @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); ``` #### (6)@Result 作用:用于指定查询结果集的映射关系。 @Result用于标记单个属性与结果集中的列之间的映射关系。该注解可以用于接口方法或XML文件中,通常与@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); ``` #### (7)@ResultMap 作用:用于指定查询结果集的映射关系。 @ResultMap用于标记结果集映射规则。该注解可以用于接口方法或XML文件中,通常与@Select注解一起使用。使用@ResultMap注解时,需要指定映射规则。 示例: ``` @Select("SELECT * FROM users WHERE id = #{id}") @ResultMap("userResultMap") User getUserById(@Param("id") Long id); ``` #### (8)@Options 作用:用于指定插入语句的选项。 @Options用于指定一些可选的配置项。该注解可以用于接口方法或XML文件中,通常与@Insert、@Update、@Delete等注解一起使用。使用@Options注解时,可以指定一些可选的配置项。 示例: ``` @Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})") @Options(useGeneratedKeys = true, keyProperty = "id") int insertUser(User user); ``` #### (9)@SelectKey 作用:用于指定查询语句的主键生成方式。 @SelectKey用于在执行INSERT语句后获取自动生成的主键值。该注解可以用于接口方法或XML文件中,通常与@Insert注解一起使用。使用@SelectKey注解时,需要指定生成主键的SQL语句和将主键值赋给Java对象的哪个属性。 示例: ``` @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); ``` #### (10)@Param 作用:用于指定方法参数名称。 @Param用于为SQL语句中的参数指定参数名称。该注解可以用于接口方法或XML文件中,通常与@Select、@Insert、@Update、@Delete等注解一起使用。使用@Param注解时,需要指定参数名称。 示例: ``` @Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}") List<User> getUsersByNameAndAge(@Param("name") String name, @Param("age") Integer age); ``` #### (11)@One 作用:用于指定一对一关联关系。 @One用于在一对一关联查询中指定查询结果的映射方式。该注解可以用于XML文件中,通常与和标签一起使用。使用@One注解时,需要指定查询结果映射的Java对象类型和查询结果映射的属性。 ``` <resultMap id="userResultMap" type="User"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="age" property="age"/> <association property="department" resultMap="departmentResultMap"/> </resultMap> <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> ``` 上述代码中,@One注解用于指定查询结果的映射方式,这里使用了嵌套的<resultMap>标签实现了一对一关联查询。在departmentResultMap中,使用@One注解指定了查询结果映射的Java对象类型为User,查询结果映射的属性为manager,resultMap参数指定了查询结果映射的结果集映射规则为userResultMap。 除了使用@One注解之外,还可以使用@Many注解来指定一对多关联查询的映射方式。 总之,@One注解是MyBatis中用于在一对一关联查询中指定查询结果的映射方式的注解之一,可以方便地实现一对一关联查询的结果映射。 #### (12)@Many 作用:用于指定一对多关联关系。 @Many用于在一对多关联查询中指定查询结果的映射方式。该注解可以用于XML文件中,通常与和标签一起使用。使用@Many注解时,需要指定查询结果映射的Java对象类型和查询结果映射的属性。 示例: ``` <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> <resultMap id="userResultMap" type="User"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="age" property="age"/> </resultMap> ``` 上述代码中,@Many注解用于指定查询结果的映射方式,这里使用了嵌套的<resultMap>标签实现了一对多关联查询。在departmentResultMap中,使用@Many注解指定了查询结果映射的Java对象类型为User,查询结果映射的属性为members,ofType参数指定了集合中元素的类型为User,resultMap参数指定了查询结果映射的结果集映射规则为userResultMap。 除了使用@Many注解之外,还可以使用@One注解来指定一对一关联查询的映射方式。 总之,@Many注解是MyBatis中用于在一对多关联查询中指定查询结果的映射方式的注解之一,可以方便地实现一对多关联查询的结果映射。 >在这里给大家分享一下【云端源想】学习平台,无论你是初学者还是有经验的开发者,这里都有你需要的一切。包含课程视频、知识库、微实战、云实验室、一对一咨询等等,现在功能全部是免费的,[点击这里,立即开始你的学习之旅!](https://ydcode.cn/memberIndex?sourceId=612) #### (13)@ResultType 作用:用于指定查询结果集的类型。 @ResultType用于指定查询结果的类型。该注解可以用于接口方法或XML文件中,通常与@Select、@Insert、@Update、@Delete等注解一起使用。使用@ResultType注解时,需要指定查询结果的类型。 示例: ``` @Select("SELECT name, age FROM users WHERE id = #{id}") @ResultType(User.class) User getUserById(Long id); ``` #### (14)@TypeDiscriminator 作用:用于指定类型鉴别器,用于根据查询结果集的不同类型映射到不同的Java对象。 @TypeDiscriminator用于在自动映射时指定不同子类型的映射方式。该注解可以用于XML文件中,通常与和标签一起使用。使用@TypeDiscriminator注解时,需要指定类型列的名称和不同子类型的映射方式。 示例: ``` <resultMap id="vehicleResultMap" type="Vehicle"> <id column="id" property="id"/> <result column="name" property="name"/> <result column="type" property="type"/> <discriminator javaType="String" column="type"> <case value="car" resultMap="carResultMap"/> <case value="truck" resultMap="truckResultMap"/> <case value="bus" resultMap="busResultMap"/> </discriminator> </resultMap> <resultMap id="carResultMap" type="Car"> <result column="engine" property="engine"/> <result column="seats" property="seats"/> </resultMap> <resultMap id="truckResultMap" type="Truck"> <result column="load" property="load"/> </resultMap> <resultMap id="busResultMap" type="Bus"> <result column="capacity" property="capacity"/> </resultMap> ``` 上述代码中,@TypeDiscriminator注解用于指定不同子类型的映射方式。在vehicleResultMap中,使用@TypeDiscriminator注解指定了类型列的名称为type,javaType参数指定了类型列的Java类型为String,<case>标签中的value属性分别对应不同的子类型(car、truck、bus),resultMap属性用于指定不同子类型的结果集映射规则。 除了使用@TypeDiscriminator注解之外,还可以使用<discriminator>标签来指定不同子类型的映射方式。 总之,@TypeDiscriminator注解是MyBatis中用于在自动映射时指定不同子类型的映射方式的注解之一,可以方便地实现自动映射不同子类型的结果集映射规则。 #### (15)@ConstructorArgs 作用:用于指定Java对象的构造方法参数。 @ConstructorArgs用于指定查询结果映射到Java对象时使用的构造函数和构造函数参数。该注解可以用于XML文件中,通常与标签一起使用。使用@ConstructorArgs注解时,需要指定构造函数参数的映射关系。 示例: ``` <resultMap id="userResultMap" type="User"> <id column="id" property="id"/> <constructor> <arg column="name" javaType="String"/> <arg column="age" javaType="int"/> </constructor> </resultMap> ``` #### (16)@Arg 作用:用于指定Java对象的构造方法参数。 @Arg用于指定查询结果映射到Java对象时构造函数或工厂方法的参数映射关系。该注解可以用于接口方法或XML文件中,通常与@Select、@Insert、@Update、@Delete等注解一起使用。使用@Arg注解时,需要指定参数的映射关系。 示例: ``` @Select("SELECT name, age FROM users WHERE id = #{id}") User getUserById(@Arg("name") String name, @Arg("age") int age); ``` #### (17)@Discriminator 作用:用于指定类型鉴别器的查询结果。 @Discriminator用于在自动映射时指定不同子类型的映射方式。该注解可以用于接口方法或XML文件中,通常与@Select、@Insert、@Update、@Delete等注解一起使用。使用@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); ``` #### (18)@CacheNamespace 作用:用于指定缓存的命名空间。 @CacheNamespace用于指定Mapper接口中的查询结果是否进行缓存。该注解可以用于Mapper接口上,用于指定Mapper接口中所有方法默认的缓存配置。使用@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); // ... } ``` #### (19)@Flush 作用:用于在插入、更新或删除操作之后自动清空缓存。 @Flush是用于在Mapper接口中指定在执行方法前或方法后刷新缓存。该注解可以用于Mapper接口方法上,通常与@Select、@Insert、@Update、@Delete等注解一起使用。使用@Flush注解时,需要指定刷新缓存的时机。 示例: ``` @Select("SELECT * FROM users WHERE id = #{id}") @Flush(flushCache = FetchType.AFTER) User getUserById(Long id); ``` #### (20)@MappedJdbcTypes 作用:用于指定Java对象属性与数据库列的映射关系。 @MappedJdbcTypes用于将Java类型映射到JDBC类型。该注解可以用于JavaBean属性或ResultMap中,用于指定Java类型对应的JDBC类型。使用@MappedJdbcTypes注解时,需要指定Java类型和对应的JDBC类型。 示例: ``` public class User { private Long id; @MappedJdbcTypes(JdbcType.VARCHAR) private String name; private Integer age; // ... } ``` #### (21)@MappedTypes 作用:用于指定Java对象与数据库类型的映射关系。 @MappedTypes用于将Java类型映射到JDBC类型。该注解可以用于JavaBean属性或ResultMap中,用于指定Java类型对应的JDBC类型。使用@MappedTypes注解时,需要指定Java类型。 示例: ``` @MappedTypes(User.class) public interface UserMapper { @Select("SELECT * FROM users WHERE id = #{id}") User getUserById(Long id); // ... } ``` #### (22)@SelectProvider 作用:用于指定动态生成SQL语句的提供者。 @SelectProvider是用于在Mapper接口中动态生成查询SQL语句。该注解可以用于Mapper接口方法上,用于指定一个提供SQL语句的Provider类。使用@SelectProvider注解时,需要指定Provider类和Provider方法。 示例: ``` @SelectProvider(type = UserSqlProvider.class, method = "getUserByIdSql") User getUserById(Long id); ``` #### (23)@InsertProvider 作用:用于指定动态生成SQL语句的提供者。 @InsertProvider用于在Mapper接口中动态生成插入SQL语句。该注解可以用于Mapper接口方法上,用于指定一个提供SQL语句的Provider类。使用@InsertProvider注解时,需要指定Provider类和Provider方法。 示例: ``` @InsertProvider(type = UserSqlProvider.class, method = "insertUserSql") int insertUser(User user); ``` #### (24)@UpdateProvider 作用:用于指定动态生成SQL语句的提供者。 @UpdateProvider用于在Mapper接口中动态生成更新SQL语句。该注解可以用于Mapper接口方法上,用于指定一个提供SQL语句的Provider类。使用@UpdateProvider注解时,需要指定Provider类和Provider方法。 示例: ``` @UpdateProvider(type = UserSqlProvider.class, method = "updateUserSql") int updateUser(User user); ``` #### (25)@DeleteProvider 作用:用于指定动态生成SQL语句的提供者。 @DeleteProvider用于在Mapper接口中动态生成删除SQL语句。该注解可以用于Mapper接口方法上,用于指定一个提供SQL语句的Provider类。使用@DeleteProvider注解时,需要指定Provider类和Provider方法。 示例: ``` @DeleteProvider(type = UserSqlProvider.class, method = "deleteUserSql") int deleteUser(Long id); ``` 以上就是MyBatis的相关注解及使用示例了,实际开发中不一定每个都能用到,但是可以收藏起来,有备无患嘛! 总的来说,MyBatis的注解是一个非常强大的工具,它可以帮助你减少XML配置的工作量,让你的代码更加简洁、易读。但是,它也有一定的学习成本,你需要花一些时间去理解和掌握它。希望这篇文章能帮助你更好地理解和使用MyBatis的注解。
299 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传