场景:当字段的类型和数据库类型不一致时,需要自定义类型转化器。
比如:
Users{
int id;
String username;
String password;
Address address;
}
Address{
String provinceName;
String cityName;
String distinctName;
String streetName;
int no;
}
使用步骤:
①:编写一个普通类继承BaseTypeHandler 抽象类,或者实现TypeHandler接口。重写三个方法:
如下:
/*自定义类型转化器
* 遇到Address类型的字段是会自动来调用该类中的方法
* 新增 修改 :address对象 --》string
* 调用setNonNullParameter 方法处理Address类
* 查询: 把varchar 类型的address->Address类型
* 调用getNullableResult/getNullableResult
* 把数据库的address 重新封装成Address类型
* */
public class MyTypeHandler extends BaseTypeHandler<Address> {
/**
* 新增 或者修改时 遇到Address 类型的字段 自动会调用该方法
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Address parameter, JdbcType jdbcType)
throws SQLException {
ps.setString(i, parameter.toString()); //Address对象-->address字符串
}
/**
* 根据列名查询
*/
@Override
public Address getNullableResult(ResultSet rs, String columnName) throws SQLException {
String a = rs.getString("address");
Address address = null;
if(a!=null){
String s[] = a.split("-");
address = new Address();
address.setProvinceName(s[0]);
address.setCityName(s[1]);
address.setDistinctName(s[2]);
address.setStreetName(s[3]);
address.setNo(Integer.parseInt(s[4].trim()));
}
return address;
}
/**
* 根据下标查询
*/
@Override
public Address getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String a = rs.getString(columnIndex);
Address address = null;
if(a!=null){
String s[] = a.split("-");
address = new Address();
address.setProvinceName(s[0]);
address.setCityName(s[1]);
address.setDistinctName(s[2]);
address.setStreetName(s[3]);
address.setNo(Integer.parseInt(s[4].trim()));
}
return address;
}
//存储过程
@Override
public Address getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
// TODO Auto-generated method stub
return null;
}
}
②:在mybatis的配置文件中配置该处理器
<typeHandlers>
<!--配置自定义类型转化器 -->
<!-- 配置自定义类型处理器
配置完成后:遇到address类型的字段 自动会调用MyAddressTypeHandler类处理该字段
-->
<typeHandler handler="com.tf.test.MyTypeHandler"/>
</typeHandlers>
效果如:1, 小新, admin, 北京市-北京市-昌平区-沙河镇-12