mybatis 对于生成的sql语句 自动加上单引号的情况

本文探讨了MyBatis在处理SQL字段冲突时自动加单引号的问题,讲解了MySQL中REPLACE函数的两种用途,以及MyBatis中IFNULL函数的正确用法,包括如何处理NULL值和局部字段替换。
部署运行你感兴趣的模型镜像

mybatis 对于生成的sql语句 自动加上单引号的情况
mybatis是这样的,如果表的字段跟系统字段冲突,写sql语句的时候必须得加上单引号,这样才会区分
mySQL中replace的用法
1.replace into
replace into table (id,name) values(‘1’,‘aa’),(‘2’,‘bb’)
此语句的作用是向表table中插入两条记录。如果主键id为1或2不存在
就相当于
insert into table (id,name) values(‘1’,‘aa’),(‘2’,‘bb’)
如果存在相同的值则不会插入数据
2.replace(object,search,replace)
把object中出现search的全部替换为replace
select replace(‘www.baicai.net’,‘w’,‘Ww’)—>WwWwWw.baicai.net
例:把表table中的name字段中的aa替换为bb
update table set name=replace(name,‘aa’,‘bb’)

Mybatis中IFNULL(P1,P2)函数的用法

select md.valueofdouble, md.periodcode
from meas_data md
WHERE objectcode="YQ"
AND datatime="2017-5-25 00:00:00"
AND measurementcode="PI_DRFDL

在这里插入图片描述

select md.valueofdouble, IFNULL(md.periodcode,0)
from meas_data md
WHERE objectcode="YQ"
AND datatime="2017-5-25 00:00:00"
AND measurementcode="PI_DRFDL"

在这里插入图片描述
4.总结:
1、IFNULL(P1,P2)如果P1不为空,则返回值为P1;P1为NULL,则返回为P2;P2有点类似替补球员;
2、注意,IFNULL只是针对局部字段的替换;如果整个结果查出来都是空,则不能使用IFNULL(P1,P2)

select md.valueofdouble, md.periodcode
from meas_data md
WHERE objectcode="YQ"
AND datatime="2017-5-25 00:00:01"
AND measurementcode="PI_DRFDL"

在这里插入图片描述

select md.valueofdouble, IFNULL(md.periodcode,0)
from meas_data md
WHERE objectcode="YQ"
AND datatime="2017-5-25 00:00:01"
AND measurementcode="PI_DRFDL"

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>好的,我现在需要解决MyBatis Plus逻辑删除不自动添加单引号的问题。首先,我得回顾一下用户的问题和相关引用内容。用户提到,当使用MyBatis Plus的逻辑删除功能生成SQL语句中的删除值没有自动加上单引号,这可能导致类型不匹配的问题,尤其是在数据库字段是字符类型的情况下。 根据引用[3],MyBatis Plus在处理逻辑删除的值,如果字段类型是字符序列(CharSequence),会自动在值周围添加单引号。否则,直接使用值而不加单引号。因此,如果数据库中的逻辑删除字段是字符类型(如VARCHAR),而我们在配置中使用的是数字类型(如1或0),MyBatis Plus可能不会添加单引号,导致SQL语法错误。 用户的需求是让逻辑删除的值自动加上单引号。根据引用[3]中的示例,可以通过在配置逻辑删除的值直接使用带有单引号的字符串来解决。例如,将正常值和删除值配置为"'1'"和"'0'",这样即使字段类型不是字符类型,MyBatis Plus也会直接使用这些字符串,从而在SQL生成单引号的值。 另外,引用[1]提到可以通过全局配置来设置逻辑删除的字段名和值,而不需要在每个实体类中使用@TableLogic注解。这可能是一个更简洁的解决方案,但需要确保在配置文件中正确设置逻辑删除值,包括单引号。例如,在application.yml中配置logic-not-delete-value和logic-delete-value,使用带单引号的字符串。 还需要考虑字段类型是否与数据库中的类型匹配。如果数据库字段是字符类型,实体类中的对应字段应该使用String类型,而不是数值类型,这样MyBatis Plus会自动处理单引号的问题。如果确实需要使用数值类型,可能需要通过自定义SQL处理器或修改全局配置来强制添加单引号。 总结可能的解决方案: 1. 在实体类的@TableLogic注解中直接配置带单引号的值,如value = "'1'", delval = "'0'"。 2. 在全局配置文件中设置逻辑删除值为带单引号的字符串。 3. 确保实体类字段类型与数据库字段类型一致,使用String类型。 4. 自定义SQL注入器,手动处理逻辑删除值的引号添加。 需要验证这些方法的有效性,并检查是否有其他潜在问题,比如SQL注入风险或配置冲突。同,参考引用[2]和[4],确保MyBatis Plus的版本兼容性和配置正确性。</think>### 分步解决方案 #### 问题分析 MyBatis Plus默认根据字段类型决定是否给逻辑删除值添加单引号。若数据库字段是字符类型(如$varchar$),但实体类字段使用数值类型(如$Integer$),会导致生成SQL语句中逻辑删除值缺少单引号,引发语法错误。例如: ```sql UPDATE user SET deleted = 1 WHERE id = 1 -- 正确(数值类型) UPDATE user SET status = '1' WHERE id = 1 -- 正确(字符类型) ``` #### 解决方案 --- ##### 方法1:实体类注解直接添加单引号 在`@TableLogic`注解中**手动添加单引号**,强制为逻辑删除值包裹单引号: ```java @TableLogic(value = "'1'", delval = "'0'") //值直接包含单引号 @TableField("deleted") private String deleted; //字段类型需改为String ``` *原理*:通过显式定义带单引号的值,绕过框架的类型判断,直接生成正确格式的SQL[^3]。 --- ##### 方法2:全局配置添加单引号 在`application.yml`中配置逻辑删除值**添加单引号**: ```yaml mybatis-plus: global-config: db-config: logic-delete-field: deleted logic-not-delete-value: "'1'" # 未删除值加单引号 logic-delete-value: "'0'" # 删除值加单引号 ``` *注意*:实体类字段类型需改为`String`,否则可能引发类型转换异常[^1]。 --- ##### 方法3:保持字段类型一致性 将实体类字段类型与数据库字段类型**严格对齐**: 1. 若数据库字段是字符类型(如$varchar$),实体类字段应使用`String` ```java @TableLogic(value = "1", delval = "0") @TableField("deleted") private String deleted; //字段类型与数据库一致 ``` 2. 框架会自动识别字符类型,为值添加单引号[^3]。 --- ##### 方法4:自定义SQL注入器(高级) 通过重写`LogicSqlInjector`,强制添加单引号: ```java public class CustomLogicSqlInjector extends LogicSqlInjector { @Override protected String getLogicSqlWhere(TableInfo tableInfo, boolean isLogicDelete) { String value = tableInfo.getLogicDeleteValue(); return "deleted = '" + value + "'"; //手动单引号 } } ``` 注册到Spring容器: ```java @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new CustomLogicSqlInjector()); return interceptor; } ``` *适用场景*:需要全局控制逻辑删除条件格式使用[^2]。 --- #### 验证结果 执行更新操作后,观察生成SQL语句: ```sql UPDATE user SET deleted = '0' WHERE id = 1 # 字符类型字段正确添加单引号 ``` #### 注意事项 1. 优先推荐**方法1**或**方法2**,改动最小且符合框架设计 2. 若字段实际为数值类型,应避免强制添加单引号,否则会导致类型错误 3. 使用`@TableField(select = false)`可隐藏逻辑删除字段的查询[^4]
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值