IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 字段与列类型映射不上时,怎么办?Mybatis-Plus类型处理器了解一下 -> 正文阅读

[Java知识库]字段与列类型映射不上时,怎么办?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());
}

打印结果:

?到这,本篇结束!

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-01-17 11:22:16  更:2022-01-17 11:23:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:30:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码