字段与列类型映射不上时,怎么办?Mybatis-Plus类型处理器了解一下

学习要求

良好的java基础, 熟悉SpringBoot框架,熟悉Mybatis框架

教学目标

了解并掌握MyBatis-Plus 通用类型处理器实现

视频教程

MyBatisPlus实战教程与开发建议

概念

类型处理器,用于 JavaType 与 JdbcType 之间的转换,简单的理解就是对象属性与列间的映射处理。

举个例子:员工对象在Mapper.xml中对象属性与列间映射

  <resultMap id="BaseResultMap" type="com.langfeiyes.mp.Employee" >
    <id column="id" property="id" jdbcType="BIGINT" />
    <result column="name" property="name" jdbcType="VARCHAR" typeHandler="xxxTypeHanler"/>
    <result column="phone" property="phone" jdbcType="VARCHAR" />
    <result column="email" property="email" jdbcType="VARCHAR" />
    <result column="status" property="status" jdbcType="CHAR" />
    <result column="del" property="del" jdbcType="CHAR" />
  </resultMap>

在没有显示指定具体类型处理器,那就是使用默认处理器,默认处理器可以处理简单类型映射:比如8大基本类型,时间,字符串等。但是,如果是相对复杂类型映射呢?

要实现复杂的类型映射,那么就需要使用自定义类型处理器,自定义映射规则。

实现

需求:员工表中有手机号码列,格式如下

多个手机号码使用  逗号分开,现在查询时候需要将这个类转换成对象中List集合

 转成员工对象contat集合

public class Employee {
    private List<String> contact = new ArrayList<>();
}

很明显,数据库中的varchar类型的contact 列是无法直接转换list集合,此时需要使用使用者自定义类型处理器啦。

步骤1:自定义类型转换处理器

/**
 * 将字符串转换成字符串数组
 * eg: 13700000000,13700000001,13700000002,    ---> List<String>
 * 将字符串数组元素拼接字符串
 * eg: List<String>   ---> 13700000000,13700000001,13700000002, 
 */
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;
    }
}

步骤2:给员工表添加contact列,类型为varchar

步骤3:给Employee对象添加contact属性,类型是List<String>

public class Employee {
	//指定类型转换处理器
    @TableField(typeHandler = ListTypeHandler.class)
    private List<String> contact = new ArrayList<>();
}   

步骤4:在application.properties配置文件中配置处理器所在包

mybatis-plus.type-handlers-package=com.langfeiyes.mp.handler

步骤5:添加与查询测试

@Test
public void testSave(){
    Employee employee = new Employee();
    employee.setAdmin(1);
    employee.setAge(18);
    employee.setDeptId(1L);
    employee.setEmail("zhangsan@163.com");
    employee.setName("zhangsan");
    employee.setPassword("111");
    //执行状态
    employee.setStatus(EmployeeStatus.LEAVE);
    //联系电话
    employee.setContact(Arrays.asList("13700000000", "13700000001","13700000002"));
    employeeMapper.insert(employee);
}
@Test
public void testGet(){
    Employee employee = employeeMapper.selectById(1L);
    System.out.println(employee.getContact());
}

打印结果:

 到这,本篇结束!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪飞yes

我对钱没兴趣~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值