大丰企业做网站多少钱,网站收录大量下降,网页设计制作网站总结,wordpress仿朋友圈MyBatis 在处理数据库查询结果或传递参数时#xff0c;需要将数据库类型与 Java 类型之间进行转换。MyBatis 提供了多种方式来实现这种类型转换#xff0c;主要通过内置的 TypeHandler#xff08;类型处理器#xff09;机制。 1. TypeHandler 的作用
TypeHandler 是 MyBat…
MyBatis 在处理数据库查询结果或传递参数时需要将数据库类型与 Java 类型之间进行转换。MyBatis 提供了多种方式来实现这种类型转换主要通过内置的 TypeHandler类型处理器机制。 1. TypeHandler 的作用
TypeHandler 是 MyBatis 中的一个接口用于在 Java 类型和 JDBC 类型之间进行转换。每当 MyBatis 需要将 Java 对象传递给 SQL 语句或者从 SQL 查询结果中获取数据并转换为 Java 对象时都会使用 TypeHandler。
TypeHandler 负责以下两种类型的转换 Java 类型到 JDBC 类型的转换当 MyBatis 需要将 Java 对象作为参数传递给 SQL 语句时TypeHandler 会将 Java 类型转换为 JDBC 类型。 JDBC 类型到 Java 类型的转换当 MyBatis 从数据库中获取数据时TypeHandler 会将 JDBC 类型转换为 Java 类型。 2. 内置的 TypeHandler
MyBatis 提供了许多内置的 TypeHandler可以处理常见的 Java 类型和 JDBC 类型之间的转换。以下是一些常见的内置 TypeHandler IntegerTypeHandler用于将 int 和 Integer 转换为数据库中的 INTEGER 类型。 StringTypeHandler用于将 String 转换为数据库中的 VARCHAR 类型。 DateTypeHandler用于将 java.util.Date 转换为数据库中的 DATE 类型。 BooleanTypeHandler用于将 boolean 和 Boolean 转换为数据库中的 BIT 或 BOOLEAN 类型。
这些内置的 TypeHandler 在绝大多数情况下能够满足开发者的需求。MyBatis 会自动选择合适的 TypeHandler 来处理常见的数据类型。 3. 自定义 TypeHandler
有时应用程序中可能需要处理一些自定义的数据类型或者需要对现有的类型转换进行定制。此时可以通过实现 TypeHandler 接口来自定义类型处理器。 3.1. 实现 TypeHandler 接口
要创建一个自定义的 TypeHandler你需要实现 org.apache.ibatis.type.TypeHandler 接口。这个接口有四个方法 setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType)将 Java 类型的数据设置到 PreparedStatement 中作为 SQL 语句的参数。 getResult(ResultSet rs, String columnName)从 ResultSet 中通过列名获取数据并将其转换为 Java 类型。 getResult(ResultSet rs, int columnIndex)从 ResultSet 中通过列索引获取数据并将其转换为 Java 类型。 getResult(CallableStatement cs, int columnIndex)从 CallableStatement 中获取数据并将其转换为 Java 类型用于处理存储过程的输出参数。 3.2. 自定义 TypeHandler 示例
假设你有一个枚举类 Gender它表示用户的性别。数据库中性别使用 CHAR 类型存储值为 M 或 F而在 Java 中使用枚举来表示
public enum Gender {MALE, FEMALE
}
你可以创建一个自定义的 TypeHandler用于将 CHAR 类型的数据库值转换为 Gender 枚举并反向转换
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.*;
public class GenderTypeHandler extends BaseTypeHandlerGender {
Overridepublic void setNonNullParameter(PreparedStatement ps, int i, Gender gender, JdbcType jdbcType) throws SQLException {ps.setString(i, gender Gender.MALE ? M : F);}
Overridepublic Gender getNullableResult(ResultSet rs, String columnName) throws SQLException {String gender rs.getString(columnName);return gender ! null gender.equals(M) ? Gender.MALE : Gender.FEMALE;}
Overridepublic Gender getNullableResult(ResultSet rs, int columnIndex) throws SQLException {String gender rs.getString(columnIndex);return gender ! null gender.equals(M) ? Gender.MALE : Gender.FEMALE;}
Overridepublic Gender getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {String gender cs.getString(columnIndex);return gender ! null gender.equals(M) ? Gender.MALE : Gender.FEMALE;}
} 3.3. 注册自定义 TypeHandler
你可以通过两种方式将自定义的 TypeHandler 注册到 MyBatis 在 MyBatis 配置文件中注册 typeHandlerstypeHandler handlercom.example.GenderTypeHandler javaTypecom.example.Gender/
/typeHandlers 通过注解注册 如果你使用 MyBatis 的 Mapper 注解可以在字段或方法上直接使用 TypeHandler 注解 Select(SELECT id, name, gender FROM users WHERE id #{id})
Results({Result(property gender, column gender, typeHandler GenderTypeHandler.class)
})
User selectUserById(int id); 4. 全局和局部 TypeHandler 全局 TypeHandler可以通过在 MyBatis 配置文件中注册自定义 TypeHandler或者使用 MappedTypes 注解将自定义 TypeHandler 绑定到特定的 Java 类型。MyBatis 会自动在需要时使用这些全局 TypeHandler。 局部 TypeHandler在特定的 SQL 映射文件或注解中指定 TypeHandler。这种方式仅在指定的地方生效不会影响全局行为。 5. 总结 内置 TypeHandlerMyBatis 提供了多种内置的 TypeHandler用于处理常见的 Java 类型和数据库类型之间的转换。 自定义 TypeHandler当内置的 TypeHandler 不能满足需求时可以通过实现 TypeHandler 接口或扩展 BaseTypeHandler 类来自定义类型处理器并在 MyBatis 中注册使用。 注册与使用自定义的 TypeHandler 可以全局注册也可以在特定的映射文件或注解中局部使用灵活处理复杂的类型转换需求。
通过使用 TypeHandlerMyBatis 能够灵活且高效地处理 Java 类型和数据库类型之间的转换满足各种应用场景的需求。