首页 > 数据库 >Mybatis12 - 动态SQL

Mybatis12 - 动态SQL

时间:2023-02-14 19:35:26浏览次数:40  
标签:标签 age SQL emp gender 动态 id Mybatis12

动态SQL

Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。

One of the most powerful features of MyBatis has always been its Dynamic SQL capabilities. If you have any experience with JDBC or any similar framework, you understand how painful it is to conditionally concatenate strings of SQL together, making sure not to forget spaces or to omit a comma at the end of a list of columns. Dynamic SQL can be downright painful to deal with.

MyBatis的一个强大的特性之一通常是它的动态SQL能力。如果你有使用JDBC或其他相似框架的经验,你就明白条件地串联SQL字符串在一起是多么的痛苦,确保不能忘了空格或在列表的最后省略逗号。动态SQL可以彻底处理这种痛苦。

主要针对两种数据进行判断:1. null 2. "" 空字符串

1. if 标签

<select id="getEmpByConditionOne" resultType="Emp">
    SELECT * FROM t_emp WHERE 1=1
    <if test="empId != null and empId != ''">
        AND emp_id = #{empId}
    </if>
    <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>

2. where + if 标签

where 标签动态生成关键字:

  1. 如果 where标签中有条件成立,则自动生成 where关键字,否则 where标签以及内容会跳过
  2. where标签会对条件成立的语句自动去除第一个 and关键字,因此 where内的所有语句前可以统一加 and
<!-- where 标签动态生成关键字:
        1. 如果 where标签中有条件成立,则自动生成 where关键字,否则 where标签以及内容会跳过
        2. where标签会对条件成立的语句自动去除第一个 and关键字,因此 where内的所有语句前都加 and -->
<select id="getEmpByConditionTwo" resultType="Emp">
    SELECT * FROM t_emp
    <where>
        <if test="empId != null and empId != ''">
            AND emp_id = #{empId}
        </if>
        <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>
    </where>
</select>

3. trim + if 标签

trim 标签有四个属性分别是在所有内容前后进行操作:

prefix 添加前缀 prefixOverrides 去除前缀

suffix 添加后缀 suffixOverrides 去除后缀

<!-- trim 标签有四个属性分别是在所有内容前后进行操作
            prefix 添加前缀 prefixOverrides 去除前缀
            suffix 添加后缀 suffixOverrides 去除后缀
        -->
<select id="getEmpByConditionThree" resultType="Emp">
    SELECT * FROM t_emp
    <trim prefix="where" suffixOverrides="and">
        <if test="empId != null and empId != ''">
            emp_id = #{empId} AND
        </if>
        <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} AND
        </if>
    </trim>
</select>

4. choose when otherwise 组合标签

choose 中的多个 when 条件有一个成立就会跳出 choose,类似if(){}...else if(){}...else{}

choose 中至少有一个 when,至多有一个 otherwise

<!-- choose、when、otherwise
	choose 中的多个 when 条件有一个成立就会跳出 choose 类似if(){}...else if(){}...else{}
	choose 中至少有一个 when,至多有一个 otherwise
-->
<select id="getEmpByCondition" resultType="Emp">
    SELECT * FROM t_emp
    <where>
        <choose>
            <when test="empId != null and empId != ''">
                emp_id = #{empId}
            </when>
            <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>
            <otherwise>
                1=1
            </otherwise>
        </choose>
    </where>
</select>

5. foreach 标签

foreach 标签,对集合或数组进行遍历

  • 属性 collection 设置需要循环遍历的数组或集合对象
  • 属性 item 数组或集合中的元素命名(别名) 类似for( item : collection )
  • 属性 separator 每次遍历间的分隔符(会自动在两侧添加空格)
  • 属性 open close 组合同时使用,设置遍历开始前的前缀和遍历结束后的后缀
批量插入时,values (a),(b),(c)
<!-- foreach 标签,对集合或数组进行遍历
	属性 collection 设置需要循环遍历的数组或集合对象
	属性 item 数组或集合中的元素命名(别名) 类似for(item : collection)
	属性 separator 每次循环间的分隔符(会自动在两侧添加空格)
-->
<insert id="insertMoreEmp" useGeneratedKeys="true" keyProperty="empId">
    INSERT INTO t_emp VALUES
    <foreach collection="emps" item="emp" separator=",">
        (null, #{emp.empName}, #{emp.age}, #{emp.gender}, null)
    </foreach>
</insert>
批量删除方法一,WHERE key IN (a, b, c)
<!--方法一:IN 判断 emp_id 是否在需要删除的数组中
	DELETE FROM t_emp WHERE emp_id IN (1,2,3);
	属性 open close 同时使用,设置以开始遍历前的前缀和遍历结束后的后缀
-->
<delete id="deleteMoreEmpByIdOne">
    DELETE FROM t_emp WHERE emp_id IN
    <foreach collection="empIds" item="empId" separator="," open="(" close=")">
        #{empId}
    </foreach>
</delete>
批量删除方法二,WHERE key = a OR key = b OR key =c
<!-- 方法二:OR 连接数组内容,逐个判断
	DELETE FROM t_emp WHERE emp_id=1 OR emp_id=2 OR emp_id=3;
-->
<delete id="deleteMoreEmpById">
    DELETE FROM t_emp WHERE
    <foreach collection="empIds" item="empId" separator="OR">
        emp_id = #{empId}
    </foreach>
</delete>

6. sql 标签

sql标签,记录重复的SQL片段,后续再使用只需调用 id

实际开发中,SELECT * 是不常使用的, * 在mysql中还是需要转换为每个字段名再进行查询

因此,将表中的所有字段用 sql标签封装,需要时直接调用,代替 SELECT *

在需要调用 sql片段的地方使用 include标签进行引用

<!-- sql标签,记录重复的SQL片段,后续再使用只需调用 id
	实际开发中,SELECT * 是不常使用的, * 在mysql中还是需要转换为每个字段名再进行查询
	因此,将表中的所有字段用 sql标签封装,需要时直接调用,代替 SELECT *
-->
<sql id="empColumns">
    emp_id, emp_name, age, gender, dept_id
</sql>

<!-- 在需要调用 sql片段的地方使用 include标签进行引用 -->
<select id="getEmps" resultType="Emp">
    SELECT <include refid="empColumns"></include> FROM t_emp
</select>

标签:标签,age,SQL,emp,gender,动态,id,Mybatis12
From: https://www.cnblogs.com/Ashen-/p/17120656.html

相关文章

  • dinky-binlog-kafka-flinksql流程处理
    准确阶段:mysql:开启mysql日志kafka:需检查服务是否正常maxwell:这里采用19版本,过新的版本对java版本要求高,我这里是java8maxwell-1.19.0maxwell操作:cd/root/tar_temp/maxwell-......
  • (数据库系统概论|王珊)第三章关系数据库标准语言SQL-第二、三节:数据定义
    pdf下载:密码7281专栏目录首页:【专栏必读】(考研复试)数据库系统概论第五版(王珊)专栏学习笔记目录导航及课后习题答案详解零:有关说明(1)安装数据库与建表关于数据库如何......
  • 在EF中执行SQL语句
    在EF中执行SQL语句 你可能要问,我用EF不就为了避免写SQL吗?如果要写SQL我不如直接用ADO.NET得了。话虽然这么说没错,可有些时候使用EF操作数据还是有一些不方便,例如让你......
  • 在EF中执行SQL语句新
    在EF中执行SQL语句 一、为什么要在EF中执行SQL语句 使用EF操作数据库,可以避免写SQL语句,完成使用Linq实现,但为什么还要在EF中执行SQL语句呢。如果要写SQL语句,完全可......
  • mysql交互式外部执行sql语句
    之前一直纠结mysql如何编写交互式脚本,像Oracle那样进行交互式输出,通过Oracle的方式交互式输出在mysql中格式是乱的,最后在网上发现了mysql原来有一个-e选项编写相关脚本如......
  • 常见的SQL注入绕过身份验证
    or1=1or1=1–or1=1#or1=1/*admin”or“1”=”1″–admin”or“1”=”1″#admin”or“1”=”1″/*admin”or1=1or“”=”admin”or1=1admin”or1=1–admin......
  • Mysql数据库安全防护
    1.禁止mysql以管理员的账号权限运行加固方法:在mysql的配置文件my.cnf中配置user=mysql2.设置root用户口令并修改登录名,且不存在空密码账户检查方法:登录mysql之后,输入这个......
  • 通过sql给数据库字段设置默认值
    #添加新字段并设置默认值altertable`user_tb`addcolumn`user_name`varchar(20)notnullDEFAULT'默认值';#修改原有默认值altertable`user_tb`altercolumn......
  • sql的常用语句
    增加表中数据:insertinto表名(列名1,列名2,...,列名n)values(值1,值2,...,值n);//按列名插入全部数据insertinto表名values(值1,值2,...,值n);//按列名顺序插入数据......
  • win10安装sql server2008遇到 无法安装.net 3.5 错误
        如图所示,多次安装无效。用镜像安装Dism/online/enable-feature/featurename:NetFX3/All/Source:H:\sources\sxs/LimitAccess也无效,出现错误为错误:0......