mapper.xml中查询(+动态查询)的一些笔记
1.参数占位符
1. #{} :执行SQL时,会将 #{}占位符替换为?,将来自动设置参数值
2. ${} :拼SQL,会存在SQL注入问题
3. 使用时机:
参数传递都用 #{},如果要对表名、列名进行动态设置,只能使用${}进行sql拼接。
2.parameterType:
用于设置参数类型,可以省略
3.SQL语句中特殊字符处理
可以使用转义字符 < 注意要加分号
也可以使用 <![CDATA[内容,如< ]]>
动态查询
有时候输入查询条件时,并不会把所有条件写上时,需要使用动态查询
原先的条件查询语句:
<select id="selectByCondition" resultType="com.xxxx.entity.Brand"> select * from tb_brand where status=#{status} and compant_name like #{companyName} and brand_name like #{brandName} </select>
动态查询语句:(加条件判断)
<select id="selectByCondition" resultType="com.xxxx.entity.Brand"> select * from tb_brand where <if test="status != null"> status=#{status} </if> <if test="companyName != null and companyName != ''" > and compant_name like #{companyName} </if> <if test="brandName!=null and brandName!=''"> and brand_name like #{brandName} </if> </select>
存在问题:如果第一个条件不存在的话就会报错
解决方案:建议用方案2的where标签
1.添加恒等式
2.通过MyBatis提供的<where>标签来替换where这个关键字(建议使用where标签)
但是全空的话,会报错,建议在Servlet中(即在使用selectByCondition之前)先对所有查询条件进行非空判断,这里还要注意怎么个判断法,如果只写 xxx==null的话,我发现还是会报错
要写成xxx==null || "".equals(xxx.trim())才可以判断成功
例如我现在要查询的是status,compant_name,brand_name,则在使用Mapper中的selectByCondition之前,要进行下面这一段判断
if( (status==null||"".equals(status.trim())) && (compant_name==null||"".equals(compant_name.trim())) && (brand_name==null || "".equals(brand_name.trim())) )
如果上面为true说明是不符合条件的,就不要再往下进行查询了。
到时候会自动判断,添加where 如果是第一个标签会帮我们主动去掉and
如果用choose标签,在otherwise里面进行处理写成1=1,会将所有信息都显示出来
<select id="selectByCondition" resultType="com.xxxx.entity.Brand"> select * from tb_brand where <choose> <when test="status != null"> status=#{status} </when> <when test="companyName != null and companyName != ''"> compant_name like #{companyName} </when> <when test="brandName!=null and brandName!=''"> brand_name like #{brandName} </when> <otherwise> 1=1 </otherwise> </choose> </select>