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>

 

posted on 2022-10-25 21:52  201812  阅读(2084)  评论(0编辑  收藏  举报