概念
类型处理器,用于 JavaType 与 JdbcType 之间的转换,简单的理解就是对象属性与列间的映射处理。
有两种方式:
1.实现org.apache.ibatis.type.TypeHandler接口
2.继承org.apache.ibatis.type.BaseTypeHandler
开发步骤
1.定义转换类继承BaseTypeHandler<T> 泛型指定为需要返回的类型
2.覆盖4个未实现的方法,其中setNonNullParameter为java程序设置数据到数据库的回调方法.
getNullableResult为查询时mysql的字符串类型转换成java的Type类型的方法
数据库
这里额外说下 datetime是年月日 时分秒 date是年月日 timestamp是年月日 时分秒精确到毫秒 一般来说用datetime 省心点用varchar也行
如果说我现在需求改了 把birthday改成 bigint 以毫秒存入数据库 但是我头比较铁就不想改属性 birthday Date的类型 当然这个比方有点牵强 其实没必要 单纯就演示 这时就需要自定义类型处理器
在插入时指定typeHandler
<insert id="saveUser"> insert into user(name,password,birthday)values(#{name},#{password},#{birthday,typeHandler=com.example.typehandler.handler.DateTypeHandler}) </insert>
查询
下面用mybatis-plus测试 注意plus只做增强,本身还是mybatis
application.properties配置成plus的
原先的插入和查询功能也都是OK的
下面来个新需求来演示自定义类型转换器
需求是这样,实体类里有个List<String> contact属性 该属性[1399999996,1399999997,1399999988] 用来记录员工练习方式
我希望以1399999996,1399999997,1399999988 varchar的形式保存到数据库中 取出来自动赋值给List<String> contact
自定义类型处理器
/**
* @author hrui
* @date 2023/3/18 23:30
*/
public class ListTypeHandler extends BaseTypeHandler<List<String>> {
//将list集合字符串元素使用,方式拼接,然后存到列中
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, List<String> list, JdbcType jdbcType) throws SQLException {
if(list != null && list.size() > 0){
StringBuilder sb = new StringBuilder(100);
for (String s : list) {
sb.append(s).append(",");
}
preparedStatement.setString(i, sb.toString());
}
}
//从数据库查询出列值,然后拆分,转换成字符串集合
@Override
public List<String> getNullableResult(ResultSet resultSet, String column) throws SQLException {
String value = resultSet.getString(column);
return this.parseToList(value);
}
//从数据库查询出列值,然后拆分,转换成字符串集合
@Override
public List<String> getNullableResult(ResultSet resultSet, int i) throws SQLException {
String value = resultSet.getString(i);
return this.parseToList(value);
}
//从数据库查询出列值,然后拆分,转换成字符串集合
@Override
public List<String> getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
String value = callableStatement.getString(i);
return this.parseToList(value);
}
//字符串截取转换成list集合
private List<String> parseToList(String value){
List<String> list = new ArrayList<>();
if(StringUtils.hasText(value)){
String[] sArr = value.split(",");
if(sArr.length > 0){
for (String s : sArr) {
if(StringUtils.hasText(s)){
list.add(s.trim());
}
}
}
}
return list;
}
}
实体类
测试查询............问题出在了哪里呢 哈哈哈哈
在application.properties里
再次查询
查完收工
请给个五星好评