MySql查询所有字段不为空值的数据及Mybatis的#号和$符的区别引起的问题

回眸只為那壹抹淺笑 提交于 2020-08-11 05:33:26

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

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

SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.Columns
WHERE table_name='lltest'

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

<select id="getNotNullData" resultType="com.example.bean.LlTest">
    SELECT *
    FROM lltest
    WHERE
    <foreach collection="list" open="" close="" separator="AND" item="item">
        ${item} IS NOT NULL
    </foreach>
</select>

2.#号和$符号的区别

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

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

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

3.对比:

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

SELECT *  FROM lltest WHERE
            ? IS NOT NULL
         AND 
            ? IS NOT NULL
         AND 
            ? IS NOT NULL

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

查询出的结果

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

SELECT * FROM lltest WHERE          
            f1 IS NOT NULL
         AND 
            f2 IS NOT NULL
         AND 
            f3 IS NOT NULL

 

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 动态参数时需要注意,用$而不是#

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!