mysql查是否为空语句_MySql查询所有字段不为空值的数据及Mybatis的#号和$符的区别引起的问题...

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:33   4577   0

1.MySql查询所有字段不为空值的数据

搜了一上午搜不到,最后用Mybatis的foreach标签,先查询出表字段,

SELECT COLUMN_NAME

FROM INFORMATION_SCHEMA.Columns

WHERE table_name='lltest'

然后传入了另一条SQL中,使用foreach标签完成了这个操作。

SELECT *FROM lltest

WHERE

${item} IS NOT NULL

2.#号和$符号的区别

在使用foreach的时候,发现使用#号来获取字段名时,查询到的结果跟mysql直接查询的结果不一样,会查询出所有数据,感觉没有条件限制。

这个原因是#号会把获取到的值加上双引号,当字符串来使用,而我循环的是字段名,字段名不能用双引号。改为$符号就可以了。

#相当于对数据 加上 双引号,$相当于直接显示数据

3.对比:

###使用#号时log4j打印的SQL语句

SELECT * FROM lltest WHERE

? IS NOT NULL

AND

? IS NOT NULL

AND

? IS NOT NULL

这些?都是#号替换的会加上双引号,所以执行这条SQL相当于没有条件限制

查询出的结果

bd0efcc2c89bcbc93b65c4a310e96633.png

###使用$符号log4j打印的SQL语句

SELECT * FROM lltest WHERE

f1 IS NOT NULL

AND

f2 IS NOT NULL

AND

f3 IS NOT NULL

c62b4415dd38ffc61fb75cc0fbdddbe0.png

1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".

2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.

3. #方式能够很大程度防止sql注入。

4.$方式无法防止Sql注入。

5.$方式一般用于传入数据库对象,例如传入表名.

6.一般能用#的就别用$.

MyBatis排序时使用order by 动态参数时需要注意,用$而不是#

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP