解決mybatis plus字段為null或空字符串無法保存到數據庫的問題
背景
項目中集成瞭mybatis plus, 今天在做後臺的一個常規的增刪改查時,發現字段值為null時,這個字段不會被保存到數據庫
解決辦法
在字段上加上
@TableField(strategy = FieldStrategy.IGNORED)
strategy字段更新插入策略屬性說明:
IGNORED(0): “忽略判斷”, 所有字段都更新和插入
NOT_NULL(1): “非 NULL 判斷”, 隻更新和插入非NULL值
NOT_EMPTY(2): “非空判斷”, 隻更新和插入非NULL值且非空字符串
另外一種方式可全局配置,未親手實踐。
補充:Mybatis查詢數據部分字段顯示為null,怎麼轉成空串(“”)
1、先定義一個handler,來把字段為null的轉成空串(””)
2、在Mapper.xml中,把可能為空的字段,加上typeHandler屬性,指定處理的handler類的全路徑。
CustomStringTypeHandler.java
package com.wang.common.mybatis.handler; 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; /** * @Name: CustomStringTypeHandler * @Desc: 自定義mybatis處理類,將null返回為空串(‘') * @Author: Administrator * @Date: 2019-09-03 18:20 */ @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); } }
Mapper.xml
<?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.wang.sss.fw.mapper.BusinessTripMapper"> <resultMap id="BaseResultMap" type="com.wang.sss.fw.pojo.BusinessTrip"> <result column="REQUEST_ID" jdbcType="VARCHAR" property="requestId" /> <result column="JOB_NUMBER" jdbcType="VARCHAR" property="jobNumber" /> <result column="REQUEST_DATE" jdbcType="VARCHAR" property="requestDate" /> <result column="DEPARTMENT" jdbcType="VARCHAR" property="department" /> <result column="BUSINESS_DAYS" jdbcType="VARCHAR" property="businessDays"/> <result column="CFD" jdbcType="VARCHAR" property="cfd" /> <result column="MDD" jdbcType="VARCHAR" property="mdd" /> <result column="START_TIME" jdbcType="VARCHAR" property="startTime" /> <result column="END_TIME" jdbcType="VARCHAR" property="endTime" /> <result column="REASON" jdbcType="VARCHAR" property="reason" typeHandler="com.wang.common.mybatis.handler.CustomStringTypeHandler"/> <result column="REMARK" jdbcType="VARCHAR" property="remark" typeHandler="com.wang.common.mybatis.handler.CustomStringTypeHandler"/> </resultMap> </mapper>
沒有加typeHandler屬性,處理之前的查詢結果:
BusinessTrip(requestId=11925, jobNumber=5721, requestDate=2019-05-06, department=57, businessDays=21, cfd=上海, mdd=南京, startTime=2019-05-06 13:36, endTime=2019-05-07 13:36, reason=null, remark=null)
增加typeHandler屬性,處理後的結果:(reason和remark字段都變成瞭空串)
BusinessTrip(requestId=11925, jobNumber=5721, requestDate=2019-05-06, department=57, businessDays=21, cfd=上海, mdd=南京, startTime=2019-05-06 13:36, endTime=2019-05-07 13:36, reason=, remark=)
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- Mybatis的TypeHandler加解密數據實現
- Mybatis的類型轉換接口TypeHandler
- Java中的BaseTypeHandler自定義類型轉換器的使用
- MyBatisPlus TypeHandler自定義字段類型轉換Handler
- mybatis-plus如何配置自定義數據類型TypeHandle