Mybatis自定义typeHandler处理空数据
Mybatis中支持自定义处理类对数据库返回为 null
的数据进行处理,记录如下
1.自定义一个数据处理类
- 下面是一个处理字符串类型的数据处理类,将数据库中返回的
null
值转换为空字符串
package com.example;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 将数据库返回的 null 值转为空字符串 ""
* 继承BaseTypeHandler类,重写其中的方法
* MappedTypes注解: 指定处理Java哪些种类的数据
* MappedJdbcTypes注解: 指定处理数据库哪些种类的数据
*/
@MappedTypes({String.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MybatisStringHandler extends BaseTypeHandler<String> {
/**
* 处理入参
* @param ps 预处理的SQL执行对象
* @param i 字段下标
* @param parameter 入参
* @param jdbcType 字段在数据库中的类型
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, parameter);
}
/**
* 处理数据库中返回的可能为空的数据,转为空字符串
* @param rs 结果集
* @param columnName 数据库返回数据字段名
*/
@Override
public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
return rs.getString(columnName) == null ? "" : rs.getString(columnName);
}
/**
* 处理数据库中返回的可能为空的数据,转为空字符串
* @param rs 结果集
* @param columnIndex 数据库返回数据字段下标
*/
@Override
public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return rs.getString(columnIndex) == null ? "" : rs.getString(columnIndex);
}
/**
* 处理数据库中存储过程返回的可能为空的数据,转为空字符串
* @param rs 结果集
* @param columnIndex 数据库返回数据字段下标
*/
@Override
public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return cs.getString(columnIndex) == null ? "" : cs.getString(columnIndex);
}
}
2.在mapper文件中使用
在创建 resultMap
结果映射时在相应字段的 typeHandler
属性指定即可
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.DemoMapper">
<resultMap id="BaseResultMap" type="com.example.Demo">
<id column="id" jdbcType="INTEGER" property="id" />
<!-- 使用 typeHandler 属性指定即可 -->
<result column="demo" jdbcType="VARCHAR" property="demo" typeHandler="com.example.MybatisStringHandler"/>
</resultMap>
<mapper>