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 动态参数时需要注意,用$而不是#
来源:oschina
链接:https://my.oschina.net/u/4230516/blog/4467292