MyBatis基础使用四

MyBatis基础使用四

动态SQL

一、多条件查询语句

通过标签进行的多条件查询,通过test属性中的表达式判断标签中的内容是否有效(是否会拼接到sql中)

    <select id="SelectConditionOld" resultType="com.wfy.pojo.Emp">
        select * from emp where
                              <if test="empName !=null and empName !=''">
                                 emp_name=#{empName}
                              </if>
                                <if test="age !=null and age !=''">
                                and     age=#{age}
                                </if>
                                <if test="gender !=null and gender !=''">
                                  and   gender=#{gender}
                                </if>

    </select>

问题:if判断是直接拼接在sql查询语句之后,如果输入的数据为null或空字符串,则会拼接一个空的and(若都为空则会拼接一个where)都会导致错误

解决方案:

  1. 在where判断语句后加上恒等式1=1,第一个if标签内加上and
   <select id="SelectConditionOld" resultType="com.wfy.pojo.Emp">
        select * from emp where 1=1
                              <if test="empName !=null and empName !=''">
                               and    emp_name=#{empName}
                              </if>
                                <if test="age !=null and age !=''">
                                and     age=#{age}
                                </if>
                                <if test="gender !=null and gender !=''">
                                  and   gender=#{gender}
                                </if>

    </select>
  1. 通过标签进行设置
 <select id="SelectConditionTwo" resultMap="DynamicSQLResultMap">
        select * from emp
                        <where>
                               <if test="empName !=null and empName !=''">
                                   emp_name=#{empName}
                               </if>
                                <if test="age !=null and age !=''">
                                   and   age=#{age}
                                </if>
                                <if test="gender !=null and gender !=''">
                                   and   gender=#{gender}
                                </if>

                        </where>

    </select>

where标签的功能:

a. 若where标签中有条件成立,会自动生成where关键字

b. 会自动将where标签中内容多余前的and去掉,但是其中内容多余后的and标签无法去除

c. 若where标签中没有任何一个条件成立,则where没有任何功能

  1. 通过标签进行设置
    <select id="SelectCondition" resultMap="DynamicSQLResultMap">
        select * from emp
       <trim prefix="where" suffixOverrides="and">
           <if test="empName !=null and empName !=''">
               emp_name=#{empName} and
           </if>
           <if test="age !=null and age !=''">
                  age=#{age} and
           </if>
           <if test="gender !=null and gender !=''">
                  gender=#{gender}
           </if>
       </trim>
</select>

trim标签的功能:

a. prefix、suffix:在标签中内容前或内容后面添加指定内容

b. prefixOverrides、suffixOverrides: 在标签中内容前或内容后面去掉指定内容

  1. 标签进行设置
 <select id="SelectByChoose" resultMap="DynamicSQLResultMap">
        select * from emp
         <where>
             <choose>
                 <when test="empName != null and empName !=''">
                     emp_name=#{empName}
                 </when>
                 <when test="age != null and age !=''">
                     age=#{age}
                 </when>
                 <when test="gender != null and gender !=''">
                     gender=#{gender}
                 </when>
             </choose>
         </where>
    </select>

这三个标签相当于java中的if....else if....else

when至少设置一个,otherwise至多设置一个

二、批量操作语句

通过foreach标签进行批量操作

  1. 批量插入对象数组或集合
  <insert id="InsertMoreEmp">
           insert into emp values
                         <foreach collection="emps" item="emp" separator=",">
                            (null,#{emp.empName},#{emp.age},#{emp.gender},null)
                          </foreach>
    </insert>
  1. 根据id集合或数组等批量删除数据
    • 第一种方式:
    <delete id="DeleteMoreEmpOne">
              delete  from emp where emp_id in
                               (                                               
                     <foreach collection="empIds" item="empId" separator=",">     
                                      #{empId}                                   
                                   </foreach>                                   
                                   )                                                       
    </delete>
  • 第二种方式:
    <delete id="DeleteMoreEmpTwo">
              delete  from emp where emp_id in
    <foreach collection="empIds" item="empId" separator="," open="(" close=")">
          #{empId}
     </foreach>
    </delete>
  • 第三种方式:
	 <delete id="DeleteMoreEmp" >
        delete from emp where
                  <foreach collection="empIds" item="empId" separator="or">
                             emp_id=#{empId}
                  </foreach>
    </delete>

foreach标签中各各标签的功能:

collection:设置循环的数组或集合

item:用一个字符串来表示数组或集合中的每个数据

separator:设置每次循环的数据之间的间隔符

open:循环的所有内容以什么开始

close:循环的内容以什么结束

补充内容:sql片段

sql片段:可以记录一段sql,在需要使用的地方使用include标签进行引用
 <sql id="empColumns">
        emp_id,emp_name,age,gender,dept_id
    </sql>
 <select id="SelectAllEmpBySql" resultMap="DynamicSQLResultMap">
        select <include refid="empColumns"></include> from emp
    </select>
posted @   ShamUnite  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
点击右上角即可分享
微信分享提示