首页 > 数据库 >day114- 动态sql

day114- 动态sql

时间:2023-06-29 21:00:51浏览次数:39  
标签:day114 gender 标签 age 内容 emp sql 动态 where

动态SQL

解决拼接SQL语句字符串时的问题。

if标签

if标签可通过test属性的表达式进行判断,若表达式的结果为true,则标签中的内容会执行;反之标签中的内容不会执行

<!--  List<Emp> getEmpByCondition(Emp emp);  -->
<select id="getEmpByCondition" resultType="com.gu.mybatis.pojo.Emp">
    select <include refid="empColumns"></include> from t_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>

 

where标签

where和if一般结合使用:

a> 若where标签中的if条件都不满足,则where标签没有任何功能,即不会添加where关键字

b> 若where标签中的if条件满足,则where标签会自动添加where关键字,并将条件最前方多余的and去掉

注意:where标签不能去掉条件最后多余的and

<!--  List<Emp> getEmpByWhere(Emp emp);  -->
<select id="getEmpByWhere" resultType="com.gu.mybatis.pojo.Emp">
    select * from t_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>
        a. 若where标签中有条件成立,会自动生成where关键字。
        b. 会自动将where中内容前多余的and去掉,但内容后多余的and无法去掉
        c. 若where标签中没有任何一个条件成立,则where没有任何功能

 

trim标签

trim用于去掉或添加标签中的内容

常用属性:

prefix:在trim标签中的内容的前面添加某些内容

prefixOverrides:在trim标签中的内容的前面去掉某些内容

suffix:在trim标签中的内容的后面添加某些内容

suffixOverrides:在trim标签中的内容的后面去掉某些内容

<!--  List<Emp> getEmpByTrim(Emp emp);  -->
<select id="getEmpByTrim" resultType="com.gu.mybatis.pojo.Emp">
    select * from t_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>
 prefix,suffix:在标签中内容前或者后面添加指定内容
 prefixOverrides,suffixOverrides :在标签中内容前或者后面去掉指定内容

 

choose when otherwise标签

相当于if ... else if...else

<!--  List<Emp> getEmpByChoose(Emp emp);  -->
<select id="getEmpByChoose" resultType="com.gu.mybatis.pojo.Emp">
    select * from t_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标签

<!--  void insertMoreEmp(List<Emp> emps);  -->
<insert id="insertMoreEmp">
    insert into t_emp values
    <foreach collection="emps" item="emp" separator=",">
        (null,#{emp.empName},#{emp.age},#{emp.gender},null)
    </foreach>
    </insert>
<!--  void deleteMoreEmp(@Param("empIds") Integer[] empIds);  -->
<delete id="deleteMoreEmp">
<!--    delete from t_emp where emp_id in-->
<!--        <foreach collection="empIds" item="empId" separator="," close=")" open="(">-->
<!--            #{empId}-->
<!--        </foreach>-->
    delete from t_emp where
    <foreach collection="empIds" item="empId" separator="or">
        emp_id =#{empId}
    </foreach>
    </delete>
        collection:设置循环的数组集合
        item:用一个字符串表示数组或集合中的每一个数据
        separator:设置每次循环的数据之间的分割符
        open:循环内容以什么开始
        close:循环内容以什么结束

 

sql片段

<sql id="empColumns">
    emp_id,emp_name,age,gender,dept_id
</sql>

记录一些公共sql片段,进行标签引入

总结

<!--
    mybatis中的动态SQL:
    1. if标签:通过test中的表达式判断标签的内容是否有效,是否会拼接到SQL中
    2. where标签:
        a. 若where标签中有条件成立,会自动生成where关键字。
        b. 会自动将where中内容前多余的and去掉,但内容后多余的and无法去掉
        c. 若where标签中没有任何一个条件成立,则where没有任何功能
    3. trim标签:
        prefix,suffix:在标签中内容前或者后面添加指定内容
        prefixOverrides,suffixOverrides :在标签中内容前或者后面去掉指定内容
    4. choose,when,otherwise 标签
        相当于Java中的if...else if ...else
        when至少设置一个,otherwise最多设置一个
    5. foreach标签
        collection:设置循环的数组集合
        item:用一个字符串表示数组或集合中的每一个数据
        separator:设置每次循环的数据之间的分割符
        open:循环内容以什么开始
        close:循环内容以什么结束
    6. sql片段
        可以记录一个片段,在需要用的地方使用include引用
        <sql id="empColumns">
             emp_id,emp_name,age,gender,dept_id
        </sql>
        select <include refid="empColumns"></include> from t_emp
-->

 

 

 

 

 

 

标签:day114,gender,标签,age,内容,emp,sql,动态,where
From: https://www.cnblogs.com/GUGUZIZI/p/17515191.html

相关文章

  • jdk动态代理
    一、Class.forName的作用classc=Class.forName(“com.xxx.Example”); 返回的是一个类的实例factory=(ExampleInterface)c.newInstance();  newInstance之前必须保证类被加载了jvm在装载类时会执行类的静态代码段,要记住静态代码是和class绑定的,class装载成功就表示执行......
  • eggjs连接MySQL数据库
     前言:eggjs连接MySQL数据库,我摸索了各种方式。下面这篇文章能正确链上。 我犯过的几个错误:1,config/plugin.js中我填写错误,这是最致命的,导致直接读不到MySQL。官方文档不靠谱,如下所示//config/plugin.jsexports.mysql={  enable:true,  package:'egg-mysql',};......
  • 谷歌云:全面推出 AlloyDB for PostgreSQL 与数据库迁移服务
    【本文由CloudAce整理发布。CloudAce是谷歌云全球战略合作伙伴,拥有300多名工程师,也是谷歌最高级别合作伙伴,多次获得GoogleCloud合作伙伴奖。作为谷歌托管服务商,我们提供谷歌云、谷歌地图、谷歌办公套件、谷歌云认证培训服务。】2022年12月,谷歌云宣布全面推出AlloyDB......
  • mysql通过表分区来增加数据查询效率
    背景我们mysql是单机,其中有几个表体积会很大,需要做分表来增加查询效率.我们的数据是连续不断入库的,查询条件是一个批次一个批次的查,也可以看做是按时间段查询.思路mysql事件Event:到一定时间把原表改名,加一个后缀,比如user表改为user_1RENAMETABLEdivision_stop_......
  • 谷歌云:全面推出 AlloyDB for PostgreSQL 与数据库迁移服务
    【本文由CloudAce 整理发布。CloudAce 是谷歌云全球战略合作伙伴,拥有300多名工程师,也是谷歌最高级别合作伙伴,多次获得GoogleCloud合作伙伴奖。作为谷歌托管服务商,我们提供谷歌云、谷歌地图、谷歌办公套件、谷歌云认证培训服务。】2022年12月,谷歌云宣布全面推出 Allo......
  • 动态规划十大经典案例
    动态规划十大经典案例动态规划是一种常用的算法思想,它可以解决很多优化问题,比如求最大值、最小值、最长子序列等。动态规划的基本思想是把一个复杂的问题分解成若干个子问题,然后从最简单的子问题开始,逐步推导出更大的子问题的解,最终得到原问题的解。动态规划通常需要定义一个状态......
  • 图书商城项目练习②后端服务Node/Express/Sqlite
    本系列文章是为学习Vue的项目练习笔记,尽量详细记录一下一个完整项目的开发过程。面向初学者,本人也是初学者,搬砖技术还不成熟。项目在技术上前端为主,包含一些后端代码,从基础的数据库(Sqlite)、到后端服务Node.js(Express),再到Web端的Vue,包含服务端、管理后台、商城网站、小程序/App,分......
  • MySQL 8.0.33 my.ini说明
    #其他默认调整值#MySQLServer实例配置文件#-------------------------------------------------------------------------------------------------------------------------------------------------------------#由MySQLServer实例配置向导生成###安装说明#------------......
  • leetcode动态规划-
    什么是动态规划动态规划的定义和特点动态规划的基本思想和步骤动态规划的分类和常见问题线性动态规划最长公共子序列最长递增子序列最大子数组和区间动态规划矩阵链乘法括号化问题背包动态规划0-1背包问题完全背包问题多重背包问题状态压缩动态规划......
  • PostgreSQL技术大讲堂 - 第20讲:事务概述与隔离级别
     PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUGPG技术大讲堂。第20讲:事务概述与隔离级别内容1:ACID四大特性内容2:PostgreSQL......