在使用mybatis配置文件时sql注入的一些问题点:
1.if标签test比较字符串:
<if test="isExpired=='Y'"> and msg.expire_time < now() </if>
上面的代码会报NumberFormatException异常,需要用如下的写法:
<if test="isExpired=='Y'.toString()"> and msg.expire_time < now() </if>
2.#和$的区别:
a.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
b.$将传入的数据直接显示生成在sql中。
一般会使用$方式传入数据库对象,例如表名和字段名称
3.特殊符号(大于|小于|等于等):
a.使用转义字符替换:
xml转义字符 | 特殊字符 |
> | > |
< | < |
& | & |
' | ' |
" | " |
此处千万不要忘记写"&"号。
b.使用xml不解析的符号进行说明:即
<![CDATA[ AND ALAGY < 1500 ]]>
3.foreach标签的使用:
可以利用<foreach>标签实现sql条件的循环,可完成批量的sql;
mybatis接受的参数分为:(1)基本类型(2)java对象(3)List(4)数组(5)Map
如果传入基本类型:变量名作为key,变量值作为value 此时生成的map只有一个元素。
如果传入对象:对象的属性名作为key,属性值作为value
如果传入List:"list"作为key,这个List是value (这类参数可以迭代,利用<foreach>标签实现循环)
如果传入数组:"array"作为key,数组作为value(同上)
如果传入Map:键值不变
foreach标签有6个属性:
collection:要循环的集合
index:循环索引
open:以什么开始
close:以什么结束
separator:循环内容之间以什么分隔
<foreach collection="rejectReasons" item="rejectReason1" open="(" separator="," index="index" close=")"> #{rejectReason1} </foreach>
4.开发中一般使用mybatis来进行查询,所有在设计xml查询上要设计合理,下面来讲解下本人认为比较合理的方式:
a.一般我们的查询条件都会进行封装,一般使用Map或着java对象来封装,本人习惯用java对象;
b.将查询条件进行封装:
<sql id="queryCondition"> <if test="state!=null"> and d.STATE=#{state} </if> <if test="incidentDate!=null and incidentDate!='' "> and d.INCIDENT_DATE=#{incidentDate} </if> <if test="eventsInvolvingTask!=null and eventsInvolvingTask!='' "> and d.EVENTS_INVOLVING_TASK like CONCAT(CONCAT( '%',#{eventsInvolvingTask}),'%') </if> </sql>
c.在需要使用该查询条件的位置使用<include refid="queryCondition"/>来进行引用
d.在查询语句中的做法是:
<select id="queryRefuseLike" parameterType="com.test.dto" resultType="com.test.dto"> SELECT * FROM EMPLOYEE d <where> <include refid="queryCondition"/> </where> <choose> <when test="sortFieldName !='' and sortFieldName !=null and sortType !='' and sortType !=null"> ORDER BY ${sortFieldName} ${sortType} </when> <otherwise>ORDER BY d.CREATE_TIME DESC</otherwise> </choose> </select>
这样就可以所有的该对象的查询都使用这一个,包括排序!!!