mybatis 空值配置

    错误信息:  Error setting null parameter. Most JDBC drivers require that the JdbcType must be specified for all nullable parameters.

    数据库字段允许null空值,但是mybatis没有指定该字段的默认类型,因次会报错,PL/SQL不会提示错误,因为PL/SQL知道空值对应的字段类型

    

UPDATE INFO
	SET 
	CAPITAL = #{CAPITAL},
	NAME = #{NAME ,jdbcType=VARCHAR},
        AMOUNT = #{AMOUNT,jdbcType=DECIMAL}
	WHERE ID =#{ID}

 

 

 

    mybatis官方中文文档:http://mybatis.github.io/mybatis-3/zh/

    

    

<think> 我们参考了多个引用,特别是引用[1]、[3]、[5]中提到了MyBatis-Plus(MyBatis的增强工具)中设置空值的方法。 主要问题在于MyBatis-Plus默认的更新策略(FieldStrategy)会忽略null值,即当我们尝试将一个字段更新为null时,默认策略(如NOT_NULL)会忽略这个更新。 因此,我们需要改变字段的更新策略,使其允许更新为null。 根据引用[3],MyBatis-Plus的FieldStrategy有四种策略: - IGNORED: 忽略,不管字段是否为null,都会更新到数据库(可以更新为null) - NOT_NULL: 非NULL,默认策略,忽略null的字段,不忽略空字符串(即不更新为null) - NOT_EMPTY: 非空,为null和空字符串的都会忽略(不更新为null或空字符串) - NEVER: 永远不更新 引用[5]给出了一个示例:在实体类的字段上使用注解`@TableField(updateStrategy = FieldStrategy.IGNORED)`,这样在更新时,即使该字段为null,也会被更新到数据库。 此外,引用[1]提到,如果涉及多个业务层,可能更推荐自己写SQL来更新空值,以避免影响其他业务。 因此,我们可以总结两种方法: 1. 通过注解改变单个字段的更新策略(使用IGNORED策略),使其允许更新为null。 2. 自己编写SQL语句(在Mapper.xml中写update语句),直接设置字段为null。 下面分别给出两种方法的示例。 方法一:使用注解(适用于MyBatis-Plus) 在实体类的字段上添加注解,设置updateStrategy为FieldStrategy.IGNORED。 例如,我们有一个User实体,其中有一个字段enterpriseId,我们希望在更新时允许设置为null: ```java public class User { // 其他字段... @TableField(updateStrategy = FieldStrategy.IGNORED) private Long enterpriseId; // getter和setter... } ``` 这样,当我们在更新操作中设置enterpriseId为null时,就会更新到数据库。 方法二:自己编写SQL(适用于原生MyBatisMyBatis-Plus) 在Mapper接口中定义方法,并在对应的Mapper.xml中编写SQL语句。 例如: ```java // UserMapper.java public interface UserMapper extends BaseMapper<User> { void updateEnterpriseIdToNull(@Param("userId") Long userId); } ``` ```xml <!-- UserMapper.xml --> <update id="updateEnterpriseIdToNull"> UPDATE user SET enterprise_id = NULL WHERE id = #{userId} </update> ``` 注意:引用[4]提到,数据库字段不要设置非空约束,否则即使程序设置了null,也会因为数据库约束而报错。 因此,在使用上述方法前,请确保数据库表字段允许为NULL。 总结: 根据需求选择合适的方法。如果整个项目中该字段都需要允许更新为null,则使用方法一(注解)比较方便;如果只是特定业务需要更新为null,则使用方法二(自定义SQL)更灵活,且不影响其他业务。 相关问题: 1. MyBatis-Plus的FieldStrategy有哪些策略?分别代表什么含义? 2. 在MyBatis中如何自定义SQL语句来实现更新字段为空值? 3. 使用MyBatis-Plus更新字段为null时,数据库表设计需要注意什么? </think>### MyBatis设置空值的方法 在MyBatis中设置字段为空值(`NULL`)主要有以下三种方法,根据引用内容总结如下: #### 1. **修改字段更新策略(推荐)** 在实体类字段上添加注解`@TableField(updateStrategy = FieldStrategy.IGNORED)`,强制允许更新为`NULL`: ```java public class User { @TableId private Long id; @TableField(updateStrategy = FieldStrategy.IGNORED) // 允许更新为NULL private String enterpriseId; } ``` **原理**: MyBatis-Plus默认策略`FieldStrategy.NOT_NULL`会忽略`NULL`值(引用[3])。通过`IGNORED`策略可覆盖此行为,使`NULL`值被纳入SQL更新语句。 #### 2. **自定义SQL语句** 在Mapper.xml中直接编写SQL语句,显式设置字段为`NULL`: ```xml <update id="updateEnterpriseToNull"> UPDATE user SET enterprise_id = NULL WHERE id = #{userId} </update> ``` **适用场景**: - 需要精确控制字段更新(引用[1]) - 避免实体类注解影响其他业务逻辑 #### 3. **全局配置策略(谨慎使用)** 在配置文件中设置全局字段策略(可能影响其他字段): ```yaml mybatis-plus: global-config: db-config: update-strategy: ignored ``` **风险提示**: 全局配置会使所有字段允许更新为`NULL`(引用[3]),需评估业务影响。 --- ### ⚠️ 关键注意事项 1. **数据库约束** 确保目标字段**未设置`NOT NULL`约束**(引用[4]),否则会触发SQL异常。 2. **数据类型匹配** 数字类型字段需传递`null`而非空字符串`""`(引用[5]),前端需做类型校验。 3. **空字符串处理** 若需同时支持`NULL`和空字符串`""`,使用策略`FieldStrategy.NOT_EMPTY`。 --- ### 操作示例 ```java // Java调用示例 User user = new User(); user.setId(1L); user.setEnterpriseId(null); // 显式设为null // 方法1:依赖@TableField注解 userMapper.updateById(user); // 方法2:调用自定义SQL userMapper.updateEnterpriseToNull(1L); ``` > **引用说明**: > - 策略配置参考自FieldStrategy的IGNORED模式(引用[3][5]) > - 自定义SQL是规避框架限制的可靠方案(引用[1]) > - 数据库约束是空值操作的前提(引用[4]) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值