学习要求
良好的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());
}
打印结果:
?到这,本篇结束!
|