下面是针对MyBatis中的类型处理器TypeHandler的作用与自定义方式的完整攻略。
什么是TypeHandler
TypeHandler是Mybatis中一种类型转换器,用于将Java类中的数据类型转换为数据库中对应字段的类型或者将数据库查询结果的数据类型转换为Java对象中的数据类型。
例如,在将Java类中的Date类型转换成数据库中的Timestamp类型或者将查询结果中的Timestamp类型转换成Java类中的Date类型时,就需要用到TypeHandler。
TypeHandler的作用
TypeHandler的作用有两个:
- 将Java类中的数据类型转换为数据库中对应字段的类型;
- 将数据库查询结果的数据类型转换为Java对象中的数据类型。
TypeHandler在Mybatis中的使用非常广泛,可以满足大部分类型转换的需求。
TypeHandler的自定义方式
Mybatis中提供了一种扩展TypeHandler的方式,即自定义TypeHandler。需要实现TypeHandler接口,其中包含处理类型转换的三个方法:setNonNullParameter、getNullableResult和getNullableResult。
自定义非空参数
public class ExampleTypeHandler implements TypeHandler<String> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
// 将Java类中String类型的参数parameter转换为数据库的VARCHAR类型
ps.setString(i, parameter);
}
}
自定义空参数
public class ExampleTypeHandler implements TypeHandler<String> {
@Override
public void setParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
if (parameter != null) {
// 将Java类中String类型的参数parameter转换为数据库的VARCHAR类型
ps.setString(i, parameter);
} else {
// 如果参数为空,将数据库的VARCHAR类型设置为null
ps.setNull(i, jdbcType.TYPE_CODE);
}
}
}
自定义结果集映射
public class ExampleTypeHandler implements TypeHandler<String> {
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
// 将查询结果中的VARCHAR类型转换为Java类中的String类型
return rs.getString(columnName);
}
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
// 将查询结果中的VARCHAR类型转换为Java类中的String类型
return rs.getString(columnIndex);
}
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
// 将查询结果中的VARCHAR类型转换为Java类中的String类型
return cs.getString(columnIndex);
}
}
示例说明
下面是两个示例,分别演示了将Java类中的数据类型转换为数据库中对应字段的类型和将数据库查询结果的数据类型转换为Java对象中的数据类型。
示例一
在Java中,有一个程序员实体类,其中包含生日字段,其类型为Date。而在数据库中,对应的字段类型是Timestamp。因此,在将Java类中的数据类型转换成数据库中的Timestamp类型时,需要用到TypeHandler。
自定义TypeHandler
public class DateTypeHandler implements TypeHandler<Date> {
@Override
public void setParameter(PreparedStatement preparedStatement, int i, Date date, JdbcType jdbcType) throws SQLException {
if (date != null) {
preparedStatement.setTimestamp(i, new Timestamp(date.getTime()));
} else {
preparedStatement.setNull(i, Types.TIMESTAMP);
}
}
@Override
public Date getResult(ResultSet resultSet, String s) throws SQLException {
Timestamp timestamp = resultSet.getTimestamp(s);
if (timestamp != null) {
return new Date(timestamp.getTime());
}
return null;
}
@Override
public Date getResult(ResultSet resultSet, int i) throws SQLException {
Timestamp timestamp = resultSet.getTimestamp(i);
if (timestamp != null) {
return new Date(timestamp.getTime());
}
return null;
}
@Override
public Date getResult(CallableStatement callableStatement, int i) throws SQLException {
Timestamp timestamp = callableStatement.getTimestamp(i);
if (timestamp != null) {
return new Date(timestamp.getTime());
}
return null;
}
}
将TypeHandler与Java实体类进行对应
在Java实体类中,使用@TypeHandler注解将TypeHandler与Java实体类进行对应。
public class Programmer {
private Long id;
private String name;
private Date birth;
// getter和setter方法省略
// 使用@TypeHandler注解
@TypeHandler(value = DateTypeHandler.class)
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
}
示例二
在Java中,有一个部门实体类,其中包含部门编号字段,其类型为自定义的DeptNo类型。在数据库中,部门编号字段的类型为VARCHAR。因此,在将数据库查询结果的数据类型转换为Java对象中的数据类型时,也需要用到TypeHandler。
自定义TypeHandler
public class DeptNoTypeHandler implements TypeHandler<DeptNo> {
@Override
public void setParameter(PreparedStatement preparedStatement, int i, DeptNo deptNo, JdbcType jdbcType) throws SQLException {
if (deptNo != null) {
preparedStatement.setString(i, deptNo.getCode());
} else {
preparedStatement.setNull(i, Types.VARCHAR);
}
}
@Override
public DeptNo getResult(ResultSet resultSet, String s) throws SQLException {
return new DeptNo(resultSet.getString(s));
}
@Override
public DeptNo getResult(ResultSet resultSet, int i) throws SQLException {
return new DeptNo(resultSet.getString(i));
}
@Override
public DeptNo getResult(CallableStatement callableStatement, int i) throws SQLException {
return new DeptNo(callableStatement.getString(i));
}
}
将TypeHandler与Java实体类进行对应
在Java实体类中,使用@TypeHandler注解将TypeHandler与Java实体类进行对应。
public class Department {
private DeptNo deptNo;
private String name;
private String location;
// getter和setter方法省略
// 使用@TypeHandler注解
@TypeHandler(value = DeptNoTypeHandler.class)
public DeptNo getDeptNo() {
return deptNo;
}
public void setDeptNo(DeptNo deptNo) {
this.deptNo = deptNo;
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mybatis之类型处理器TypeHandler的作用与自定义方式 - Python技术站