首页 > 其他分享 >MyBatis基础使用四

MyBatis基础使用四

时间:2022-10-20 23:16:00浏览次数:61  
标签:gender name 标签 age 基础 emp 使用 MyBatis where

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>

标签:gender,name,标签,age,基础,emp,使用,MyBatis,where
From: https://www.cnblogs.com/wfy-studying/p/16811692.html

相关文章

  • Mybaits基本使用
    Mybaits基本使用整体的项目逻辑第一步:配置mybatis-config.xml核心配置文件,导入项目依赖<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationP......
  • JavaScript基础知识
    JavaScript基础知识##输出语句*1.window.alert()--写入警告框*2.document.write()---写入HTML输出*3.console.log()---写入浏览器控制台*alert("helloworld!......
  • Gradle基础知识-Wrapper,Daeman;Groovy闭包语法
    gradledescirbe:gradle本质就是一个bin脚本,分为window和unix。启动gradle:启动jvm加载lib所需的库gradlewrapper输入gradlewrapper命令会在当前目录创建安装一个jar包......
  • firebath数据库常见操作——增删改查使用总结
    firebath数据库常见操作——增删改查使用总结问题背景之前在看一个GitHub上的海外项目用到了Google的实时在线数据库firebath,查看官方文档提供的demo和api介绍感觉相对还......
  • [C#]SourceGenerator实战: 对任意对象使用await吧!!!
    [C#]SourceGenerator实战:对任意对象使用await吧!!!前言本文记录一次简单的SourceGenerator实战,最终实现可以在代码中await任意类型对象,仅供娱乐,请勿在生产环境中使......
  • 嵌入式-C语言基础:理解形参和实参的区别
    #include<stdio.h>//实参:函数原型中声明函数后面带的参数inttest(intx)//函数原型{//函数体printf("test里面的x地址=%p",&x);returnx;}//变量......
  • Spring中Transactional注解使用的心得
    今天看黑马redis的课,里面讲到了一个事务注解不生效的问题。究其原因,就在于Spring中事务注解生效的条件。那么接下来就说一下自己的心得。查了一下资料,就是说如果想让@Tr......
  • 印象笔记的高效使用方式
    印象笔记使用思路:笔记软件很多,能够做笔记的软件也很多,使用每种软件,务必充分发挥其优势才有意义。使用了印象笔记这么久,体会到以下几点:一、充分利用网页裁剪功能。网页裁剪......
  • 嵌入式-C语言基础:二维数组
    #include<stdio.h>intmain(){intarray[2][3]={{1,2,3},{4,5,6}};for(inti=0;i<2;i++){for(intj=0;j<3;j++){prin......
  • docker数据卷的使用
    在使用docker时,如果不挂载数据卷直接运行一个容器,在删除容器时会丢失所有新增或修改的数据,并且经常会遇到多个容器需要访问同一份数据的情况,所以我们在运行一个容器时需要......