Mybatis框架学习指南-第六节内容(常用的注解)
注解
@Alias
基本概念
用来为 Java 对象指定一个别名的注解。
作用范围
用在类上。
作用
@Alias 注解用于为 Java 对象指定一个别名,以便在 MyBatis 的 XML 配置文件中使用。
使用方式
1、在需要指定别名的 Java 类上使用 @Alias 注解,并在注解中指定别名的值。例如:@Alias("User")。
2、如果不使用 @Alias 注解,默认情况下 MyBatis 会使用类的简单名称(不包含包名)作为别名。
示例
在上面的示例中,User 类被指定了别名为 "User"。
用途
1、在 MyBatis 的 XML 配置文件中,可以使用别名来引用 Java 类,比如在 <resultMap>、<typeAlias>、<parameterType> 等元素中指定别名。
2、当在查询结果映射配置中使用 Java 对象时,可以使用别名来引用该对象,使配置更加清晰简洁。
注意事项
1、别名在 MyBatis 配置文件中的作用范围是全局的,因此要确保别名的唯一性,避免出现冲突。
2、别名通常应该是简洁而具有描述性的,能够清晰地表达对应 Java 对象的用途或含义。
总结
总的来说,@Alias 注解是 MyBatis 提供的一种便捷方式,用于为 Java 对象指定别名,以便在 MyBatis 的 XML 配置文件中使用。通过合理使用别名,可以使配置文件更加清晰易懂,提高开发效率。
@Insert
插入 sql,和 xml insert sql 语法完全一样
@Select
查询 sql,和 xml select sql语法完全一样
@Update
更新 sql,和 xml update sql 语法完全一样
@Delete
删除sql,和xml delete sql 语法完全一样
@Param
基本概念
@Param 注解用于在接口方法中为参数指定名称,以便在 SQL 映射文件中引用这些参数。这对于在 SQL 语句中使用多个参数时尤其重要,确保参数正确传递和引用。
功能
为参数指定名称:
@Param 注解允许你为方法参数指定一个名称,这个名称可以在 SQL 映射文件中的 #{} 占位符中使用。这样即使接口方法有多个参数,你也可以清楚地引用它们。
属性
value
它指定了参数的名称。例如:@Param("id")。
示例
在这个示例中,@Param("id") 和 @Param("name") 注解指定了参数的名称。这样在 SQL 语句中,#{id} 和 #{name} 对应着方法的参数 userId 和 userName。
适用场景
1、多个参数的传递
当方法有多个参数时,@Param 注解提供了清晰的引用方式,而无需将参数打包成对象。
2、解决参数名称冲突
在 SQL 映射文件中引用参数时,可以使用注解提供的名称,避免了默认参数名称可能导致的冲突或混淆。
总结
@Param 注解在 MyBatis 中用于明确指定方法参数的名称,使得在 SQL 映射文件中可以准确地引用这些参数。它提高了代码的清晰度,并且在处理多个参数时提供了更好的灵活性。
@Results
结果的集合
@Result
结果
@MapKey
基本概念
用于指定查询结果中的某个字段作为 Map 的键。它通常与返回类型为 Map 的查询方法一起使用。具体来说,@MapKey 注解的作用是将查询结果中的某个字段的值作为 Map 的键,将整个查询结果对象作为对应的值,最终返回一个以该字段值为键的 Map 集合。
作用范围
在方法上使用
作用
1、@MapKey 注解用于标记一个方法返回的结果集中的哪个字段作为 Map 的键。
2、当方法返回类型为 Map 时,MyBatis 默认将查询结果集中的第一个列作为 Map 的键,而使用 @MapKey 注解可以自定义键的字段。
使用方式
1、在方法上使用 @MapKey 注解,并指定一个字段名作为 Map 的键,该字段必须是查询结果集中的一个字段。
2、@MapKey 注解通常与返回类型为 Map 的方法一起使用,以便明确指定 Map 中的键。
示例
在上面的示例中,getUsersMap() 方法返回一个 Map<Integer, User> 类型的结果集,其中键为 id 字段。
用途
1、当查询结果集中包含多条记录时,使用 @MapKey 注解可以将查询结果转换为 Map,方便通过指定的字段进行快速查找和访问。
2、常见的使用场景包括将数据库查询结果按照某个字段作为键构建成 Map,以便后续根据键快速获取对应的对象。
注意事项
1、使用 @MapKey 注解时,要确保指定的键字段在查询结果集中是唯一的,否则可能会导致键冲突或覆盖。
2、如果查询结果集中存在多个记录拥有相同的键值,则只会保留最后一个记录。
@MapperScan
基本概念
@MapperScan 是 MyBatis 与 Spring 或 Spring Boot 集成时使用的一个非常重要的注解,它的作用是扫描指定包中的 Mapper 接口,并将它们注册为 Spring Bean。这样做可以省去手动在配置文件中注册每个 Mapper 接口的步骤,从而简化了 MyBatis 的配置。
作用范围
写在类上
作用
指定要变成实现类的接口所在的包,然后包下面的所有接口在运行时期会生成相应的实现类,在Springboot启动类上面添加。
属性
basePackages
basePackages 是 @MapperScan 最常用的属性,它指定了要扫描的包或包路径。
用法:
这样 MyBatis 会扫描 com.example.mapper 包下的所有接口,自动为每个接口创建代理对象。
支持多包路径:
你也可以指定多个包路径,用逗号分隔:
代码示例
添加@MapperScan(“com.winter.dao”)注解以后,com.winter.dao包下面的接口类,在运行时期都会生成相应的实现类。
为什么使用 @MapperScan
1、简化配置:自动扫描指定包中的所有 Mapper 接口,避免了手动注册每个 Mapper 的步骤。
2、避免重复代码:减少了需要在每个 Mapper 接口上添加 @Mapper 注解的需求。
3、与 Spring 整合:与 Spring Boot 完美结合,支持自动注入 Mapper 接口,简化了数据库操作的开发。
说明
这个注解在mybatis-spring.jar包中
@Mapper
基本概念
@Mapper 注解用于标识一个接口是 MyBatis 的 Mapper 接口。Mapper 接口是用于映射 SQL 语句的 Java 接口,它定义了数据库操作的方法,而具体的 SQL 语句通过注解或者 XML 配置与这些方法进行绑定。
作用范围
一般在接口类上
作用
@Mapper 注解的主要作用是标记一个接口类,使其能够被 MyBatis 自动识别为 Mapper 接口,并将其与相关的 SQL 映射文件(或者使用注解方式的 SQL 语句)进行关联。Spring 或 Spring Boot 在启动时会扫描带有 @Mapper 注解的接口,并为其创建代理对象。
在接口类上添加@Mapper注解,在运气时期会生成相应的接口实现类,如果想要每个接口都要变成实现类,那么需要在每个接口类上加上@Mapper注解,比较麻烦,解决这个问题用@MapperScan。
说明
这个注解在mybatis.jar文件中。
@MappedTypes
基本概念
@MappedTypes是MyBatis框架中用于自定义TypeHandler(类型处理器)的注解,它指定该TypeHandler能够处理的Java类型。这个注解通常与@MappedJdbcTypes注解配合使用,共同完成Java类型与数据库类型之间的精确映射。
源码
作用域
在类上
属性
value
指定Java类型
作用
1、指定TypeHandler适用的Java类型
明确告诉MyBatis该TypeHandler可以处理哪些Java类型的对象
2、自动注册TypeHandler
让MyBatis在启动时自动发现并注册这些类型处理器
3、建立类型映射关系
帮助建立Java对象与数据库字段之间的转换规则
与@MappedJdbcTypes的关系
1、@MappedTypes:指定Java类型(代码到数据库方向)
2、@MappedJdbcTypes:指定JDBC类型(数据库到代码方向)
这两个注解通常配合使用,共同构成一个"双向通道":
注册方式对比
1、注解自动注册(推荐)
优点:简洁、直观、易于维护
2、XML配置注册
优点:集中管理、不需修改代码即可调整
3、代码注册
优点:灵活性高,可以动态注册
注意事项
1、类型明确性
(1)在@MappedTypes中明确指定处理的Java类型
(2)避免使用过于泛化的类型(如Object)
2、与泛型结合
(1)处理泛型类型时需特别注意类型擦除问题
(2)考虑在构造函数中传入具体类型信息
3、测试覆盖
(1)编写单元测试确保类型转换的正确性
(2)测试边界情况和NULL值处理
4、性能考虑
(1)复杂的类型处理可能影响性能
(2)对频繁使用的类型处理进行优化。
总结
@MappedTypes注解是MyBatis类型系统中的重要组成部分,它让开发者能够精确控制Java类型与数据库类型的映射关系。通过合理使用这个注解,可以大大简化数据访问层的代码,提高应用程序的可维护性和健壮性。
@MappedJdbcTypes
基本概念
@MappedJdbcTypes是MyBatis框架中的一个注解,主要用于自定义TypeHandler(类型处理器)时指定该处理器适用的JDBC类型。它帮助MyBatis在Java类型与数据库类型之间建立更精确的映射关系。
在MyBatis中,TypeHandler负责Java类型和JDBC类型之间的转换:
1、将Java对象转换为合适的JDBC类型,用于设置PreparedStatement的参数。
2、将从ResultSet中获取的JDBC类型数据转换为Java对象。
源码
属性
value
指定该TypeHandler处理的JDBC类型数组,取值来自
org.apache.ibatis.type.JdbcType枚举。
includeNullJdbcType
指定该处理器是否适用于JDBC NULL类型,默认为false。
使用场景
1、处理特定JDBC类型的自定义转换
当数据库中的特定类型需要特殊处理时,例如将JSON字符串自动转换为Java对象
2、处理多种JDBC类型的映射
某些Java类型可能对应到数据库中的多种类型,例如处理字符串类型的枚举:
3、与NULL值的处理
当需要特别处理NULL值时:
与@MappedTypes的区别与配合
@MappedTypes:指定该TypeHandler处理的Java类型
@MappedJdbcTypes:指定该TypeHandler处理的JDBC类型
这两个注解通常配合使用,共同确定一个精确的类型映射关系:
注册方式
除了通过注解自动注册外,也可以在MyBatis配置文件中手动注册:
<typeHandlers>
<typeHandler handler="com.example.JsonTypeHandler" javaType="com.example.JsonObject" jdbcType="VARCHAR"/>
</typeHandlers>
优先级规则
当存在多个可用的TypeHandler时,MyBatis按以下优先级选择:
1、精确匹配指定Java类型和JDBC类型的处理器
2、精确匹配Java类型的处理器
3、泛型Java类型的处理器
4、默认处理器
@MappedJdbcTypes注解的存在使第1点的精确匹配成为可能。
示例代码
1、处理枚举到字符串的映射
2、处理JSON数据
总结
@MappedJdbcTypes注解是MyBatis类型处理体系中的重要组成部分,它允许开发者精确控制Java类型与数据库类型的映射关系。通过合理使用这个注解,可以:
1、处理复杂的类型转换需求
2、增强代码的可读性和可维护性
3、减少手动类型转换的代码
4、提高ORM映射的精确性
在设计自定义TypeHandler时,合理使用@MappedJdbcTypes与@MappedTypes的组合,能够构建出更加健壮和灵活的持久层代码。