Mybatis自定义类型处理器测试

概念

类型处理器,用于 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里

 再次查询

查完收工

 请给个五星好评

猜你喜欢

转载自blog.csdn.net/tiantiantbtb/article/details/129629093
今日推荐