原本在使用mybatis时,实体类属性的类型为java的常规类型如Integer、String、List等,如果想要使用自己定义的类型时如何和数据库中的类型对应呢?
在mybatis中是通过BaseTypeHandler类进行转换的,所以我们只需要重写BaseTypeHandler中的方法即可,创建自己的类型转换器MyTypeHandler类继承BaseTypeHandler,同时重写BaseTypeHandler中的4个方法。
以varchar为例,当数据库中有字段name,类型为Varchar,原本我们使用mybatis默认的BaseTypeHandler时,只需要在实体类中定义属性name类型为String,现在我们将String修改为自定义的类型CommonTypeString:
public class CommonTypeString {
private String name;
private String description;
private String help;
private String compute;
private boolean store;
private boolean required;
private boolean readonly;
private boolean copy;
private Object value;
//省略set、get方法
}
其中Object value存放数据库中的值。
重写CommonTypeString的类型转换器StringTypeHandler:
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes(CommonTypeString.class)
public class StringTypeHandler extends BaseTypeHandler {
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object o, JdbcType jdbcType) throws SQLException {
String value = (String)o;
CommonTypeString cts = new CommonTypeString();
cts.setValue(value);
preparedStatement.setString(i,value);
}
@Override
public Object getNullableResult(ResultSet resultSet, String s) throws SQLException {
String str = resultSet.getString(s);
CommonTypeString cts = new CommonTypeString();
cts.setValue(str);
return cts;
}
@Override
public Object getNullableResult(ResultSet resultSet, int i) throws SQLException {
String str = resultSet.getString(i);
CommonTypeString cts = new CommonTypeString();
cts.setValue(str);
return cts;
}
@Override
public Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
String str = callableStatement.getString(i);
CommonTypeString cts = new CommonTypeString();
cts.setValue(str);
return cts;
}
}
其中@MappedJdbcTypes(JdbcType.VARCHAR) 和 @MappedTypes(CommonTypeString.class),表示数据库中的类型为varchar且实体类中的类型为CommonTypeString的属性转换时才需要用到该StringTypeHandler,不符合的属性字段还是使用mybatis默认的类型转换器。
目前使用的spring-cloud,所以只需要在application.yml中配置该类型转换器即可:
mybatis-plus:
mapper-locations: classpath:/mapping/*/*.xml
typeAliasesPackage: com.yuqiinfo.web.model.entity
type-handlers-package: com.yuqiinfo.web.typeHandler
type-handlers-package:com.yuqiinfo.web.typeHandler 会默认加载该路径下的所有类型转换器。
自此我们就可以在实体类中使用CommonTypeString的自定义类型了。
@TableName("student_student")
@Data
public class Student extends BaseModelDto {
/**
* 姓名
*/
private CommonTypeString name ;
}