mybatis自定義TypeHandler轉換null值為空字符串


背景

目前接手的一個新項目中生成報表需求中,讀取數據庫數據之后的非常多String類型的字段,在寫入csv報表的時候如果字段是null值 會默認顯示為null,顯示字符串null在報表中顯然不合適

考慮可以在sql查詢時使用ifnull函數,但此類型字段過多,寫查詢語句太過繁瑣
因此想到自定義一個typeHandler來轉換數據庫中的null字段為 空字符串

解決方案

1、自定義handler

注意事項:

除了正常typeHandler繼承的一些方法之外還需要重寫BaseTypeHandler的getResult方法,因為原方法獲取自定義handler處理后的result之后還會再做一層判斷,如下:

 	 if (rs.wasNull()) {
      return null;
    } else {
      return result;
    }
  }

rs.wasNull() 判斷結果集是否為null,此判斷仍然為true導致返回結果仍然為null因此還需要重寫該方法去掉這一判斷,下面上代碼

import org.apache.ibatis.executor.result.ResultMapException;
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;

/**
 * @author liwanping
 * @since 2019-05-15
 */
@MappedTypes({String.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class CustomStringTypeHandler extends BaseTypeHandler<String> {

	
    @Override
    public String getResult(ResultSet rs, String columnName) {
        String result;
        try {
            result = getNullableResult(rs, columnName);
        } catch (Exception e) {
            throw new ResultMapException("Error attempting to get column '" + columnName + "' from result set.  Cause: " + e, e);
        }
        return result;
    }

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType)
            throws SQLException {
        ps.setString(i, parameter);
    }

    @Override
    public String getNullableResult(ResultSet rs, String columnName)
            throws SQLException {
        return rs.getString(columnName) == null? "" : rs.getString(columnName);
    }

    @Override
    public String getNullableResult(ResultSet rs, int columnIndex)
            throws SQLException {
        return rs.getString(columnIndex) == null? "" : rs.getString(columnIndex);
    }

    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex)
            throws SQLException {
        return cs.getString(columnIndex) == null? "" : cs.getString(columnIndex);
    }
}

2、springboot配置

mybatis.type-handlers-package=handler所在包名
啟動springboot應用會自動掃描到該handler並加載

Reference

mybatis official doc - typehandler


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM