解决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=)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • MyBatis-Plus 查询指定字段的实现

    首先创建一个数据库表,如下图所示: 然后创建一个Spring Boot项目,pom.xml和配置如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schema

  • 解决mybatisPlus null 值更新的问题

    发现mybatisPlus会更新对象属性为null的值, 与field-strategy配置有关 mybatis-plus: global-config: db-config: field-strategy: not_null 在3.1.0版本中,其选择的值有 public enum FieldStrategy { IGNORED, NOT_NULL, NOT_EMPTY, DEFAULT; private FieldStrategy() { } } 我刚开始选择的是ignored,所以null

  • 详解MyBatis-Plus updateById方法更新不了空字符串/null解决方法

    最近遇到了Mybatis-Plus updateById(),更新某一个字段为null,却发现没有更新成功,发现有一个博客记录挺好的.转载过来,方便自己看. 一.简介 因为最近在忙项目,好久都没有更新博客,最近在项目中刚好遇到一个问题,就是在使用MyBatis-Plus updateById(xxx)的时候,居然更新不了字符串或者null,本文分享两种解决方案,具体大家可以根据自己的需求选择一种方法解决. 二.原理 在实际项目中,难免更新的时候,有可能会把已有的值更新成空字符串或者null,但是

  • 解决mybatis plus字段为null或空字符串无法保存到数据库的问题

    背景 项目中集成了mybatis plus, 今天在做后台的一个常规的增删改查时,发现字段值为null时,这个字段不会被保存到数据库 解决办法 在字段上加上 @TableField(strategy = FieldStrategy.IGNORED) strategy字段更新插入策略属性说明: IGNORED(0): "忽略判断", 所有字段都更新和插入 NOT_NULL(1): "非 NULL 判断", 只更新和插入非NULL值 NOT_EMPTY(2): &quo

  • 使用Jackson 处理 null 或者 空字符串

    目录 Jackson 处理 null 或者 空字符串 这里要区分序列化和反序列化 如果是字段属性级别的 jackson解决:null到"", 空值处理为空串 1.一个比较头疼的问题 2.代码如下 3.配置如下 Jackson 处理 null 或者 空字符串 Retrofit 配合 Jackson 反序列化,就是将字符串解析为java bean 对象 的时候 ,如果遇到服务端由于各种原因会导致 有些String类型的字段值为null ,需要替换为空字符串或者占位符"-"

  • jackson设置返回null为空字符串的操作

    1.将接口返回的字段为null的设置为空字符串: import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializerProvider; import org.s

  • java json不生成null或者空字符串属性(详解)

    大家平时用java对象转json字符串.null或者空字符串属性是不需要生成到json字符串里面的. 如下方式生成,没有使用的属性也会生成json字符串属性. JSONArray jsonarray = JSONArray.fromObject(ecmMessageMap.values()); msgObj = jsonarray.toString(); {"actionType":"","clientIp":"","

  • java poi 读取单元格null或者空字符串方式

    目录 java poi 读取单元格null或空字符串 java poi读取excel单元格为空的数据,出现空指针异常 产生原因 问题解决 java poi 读取单元格null或空字符串 Cell cell = row.getCell(j, Row.RETURN_BLANK_AS_NULL); 需求 :策划同学填写的单元格有时为null 有时为空串 分条件处理 getcell 可以传入指定的策略 根据需求拿到结果分需处理 java poi读取excel单元格为空的数据,出现空指针异常 空指针异常:

  • 解决mybatis查询结果为null时,值被默认值替换问题

    目录 查询结果为null时,值被默认值替换 问题原因 解决办法 mybatis查询结果处理 处理核心流程 返回类型处理ResultHandler 字段类型处理TypeHandler 查询结果为null时,值被默认值替换 问题:pojo种设置了一个默认值,当此字段查询结果为空时,字段值变成了默认值0,经过排查发现,mybatis在赋值时并没有调用set方法赋值,而是直接调用get方法,取了默认值 问题原因 原因是因为mybatis在给map赋值时,如果返回值不是基本数据类型,且返回值为null,就

  • mybatis查询字段为null设置为0的操作

    背景 使用mybatis查询(mysql)时,会使用多个double字段做相加,但是呢,其中几个字段有可能是null,会抛空指针. 解决方法 自动生成的mybatis mapper文件长这样 <sql id="Base_Column_List"> ID, PREPAYMENT_FEE </sql> 修改它 <sql id="Base_Column_List"> ID, ifnull(PREPAYMENT_FEE,0) as PRE

  • js中null与空字符串""的区别讲解

    String str=null 这句话的意思就是定义一个字符串,变量str,字符串的内容为空值. String str="" 定义一个String类型的变量str,并为其赋值. 1.类型 null表示的是一个对象的值,而并不是一个字符串.例如声明一个对象的引用,String a = null ; ""表示的是一个空字符串,也就是说它的长度为0.例如声明一个字符串String str = "" ; 2.内存分配 String str = null

  • mybatis 解决将数值0识别成空字符串的问题

    今天遇到一个问题 我在用java的BigDecimal对象时,值是0.00000:该对象不是空的,是new出来的,我需要将该值插入数据库,数据库对于该值的接收字段类型是decimal. 我使用的Mybatis.mybatis中的语句大致如下: UPDATE user_consumption <trim prefix="SET" suffixOverrides=","> <if test="totalConsumption!=null&qu

随机推荐