Mybatis自定义typeHandler处理空数据

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>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis中,你可以使用自定义的类型处理器(TypeHandler)来处理自定义的Map类型。类型处理器用于在Java对象和数据库字段之间进行转换。 以下是一种实现自定义类型处理处理自定义的Map的示例: 1. 定义一个自定义的Map类型,例如`CustomMap`: ```java public class CustomMap extends HashMap<String, Object> { // 添加自定义的方法或属性 } ``` 2. 实现一个自定义的类型处理器,继承自`org.apache.ibatis.type.BaseTypeHandler`类,并实现对应的方法。 ```java import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class CustomMapTypeHandler extends BaseTypeHandler<CustomMap> { @Override public void setNonNullParameter(PreparedStatement ps, int i, CustomMap parameter, JdbcType jdbcType) throws SQLException { // 将CustomMap转换为需要的数据类型,并设置到PreparedStatement中 // ps.setXXX(i, convertedValue); } @Override public CustomMap getNullableResult(ResultSet rs, String columnName) throws SQLException { // 从ResultSet中获取指定列名的值,并将其转换为CustomMap类型 // Object columnValue = rs.getXXX(columnName); // CustomMap map = convertToCustomMap(columnValue); // return map; return null; } @Override public CustomMap getNullableResult(ResultSet rs, int columnIndex) throws SQLException { // 与上面类似,只是根据列索引获取值 return null; } @Override public CustomMap getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { // 与上面类似,只是在CallableStatement中获取值 return null; } } ``` 在上述示例中,我们继承了`BaseTypeHandler`类,并重写了父类的方法,在这些方法中进行了自定义类型的转换逻辑。 3. 在MyBatis的配置文件中,注册自定义的类型处理器。 ```xml <typeHandlers> <typeHandler handler="com.example.CustomMapTypeHandler"/> </typeHandlers> ``` 通过以上步骤,你就可以使用自定义的Map类型,并通过自定义的类型处理器来处理该类型的转换逻辑。在数据库操作时,MyBatis会自动调用类型处理器来进行转换。你可以根据实际需求,在类型处理器中编写相应的转换逻辑,将自定义的Map类型与数据库字段进行转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值