当前位置: 首页 > news >正文

MyBatis学习(三)

动态SQL语句

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

if

if,通过test属性中的表达式判断标签中的内容是否有效(是否会拼接到sql中)

<!-- List<Emp>getEmpByCondition(Emp emp); -->
    <select id="getEmpByCondition" resultType="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>
    </select>

where

where标签
a>若where标签中有条件成立,会自动生成where关键字
b>会自动where标签中内容前多余的and去掉,但是其中内容后多余的and无法去掉
c>若where标签中没有任何一个条件成立,则where标签没有任何功能

<!-- List<Emp>getEmpByCondition(Emp emp); -->
    <select id="getEmpByConditionOne" resultType="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>

trim

虽然where标签可以把内容前的and去掉,但是如果是最后的条件并且不符合以及有and,那么where条件是不能处理的
在这里插入图片描述
trim
prefix、suffix:在标签中内容前面或内容后面添加指定内容
prefixOverrides、suffixOverrides:在标签中内容前面或内容后面去掉指定内容

<!-- List<Emp>getEmpByCondition(Emp emp); -->
    <select id="getEmpByCondition" resultType="Emp">
        select * from t_emp
        <trim prefix="where" suffixOverrides="and"><!-- prefix 前缀 suffix 后缀 Overrides 去掉-->
            <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>
        </trim>
    </select>

这里trim配置的属性反而又有点Thymeleaf的视图处理模板,所以编程的技术就是慢慢累计,概念也总是互通的

choose、when、otherwise

choose(if)、when(else if)、otherwise(else)
相当于java中的if…else if…else
when至少设置一个
otherwise最多设置一个

<!-- List<Emp>getEmpByChoose(Emp emp); -->
    <select id="getEmpByChoose" resultType="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>

foreach

批量添加
<!-- void insertMoreEmp(@Param("emps")List<Emp>emps); -->
    <insert id="insertMoreEmp" useGeneratedKeys="true" keyProperty="empId">
        insert into t_emp values
        <!-- collection表示集合名 item表示项(元素) separator表示分隔符 -->
        <foreach collection="emps" item="emp" separator=","><!-- separator分隔符 -->
            (null,#{emp.empName},#{emp.age},#{emp.gender},null)<!-- 集合有多少元素就insert into values多少次 -->
        </foreach>
    </insert>
void insertMoreEmp(@Param("emps") List<Emp>emps);
SqlSession sqlSession = SqlsessionUtil.getSqlSession();
        DynamicSQLMapper mapper = sqlSession.getMapper(DynamicSQLMapper.class);
        Emp emp1 = new Emp(null,"小明1",20,"男");
        Emp emp2 = new Emp(null,"小明2",20,"男");
        Emp emp3 = new Emp(null,"小明3",20,"男");
        List<Emp> list = Arrays.asList(emp1, emp2, emp3);
        mapper.insertMoreEmp(list);
批量删除

相关文章:

  • 【数据挖掘】2022年2023届秋招知能科技公司机器学习算法工程师 笔试题
  • 基于Python的视频中的人脸识别系统设计与实现
  • MySQL主从复制详解
  • 【深度学习入门】- 用电路思想解释感知机
  • 文字生成图片
  • HTTPS的原理浅析与本地开发实践(下)
  • java-多态
  • 一、CSS文本样式[文本基础、文本样式、段落控制]
  • Nginx网络服务的配置
  • m基于随机接入代价的异构网络速率分配算法matlab仿真(包括matlab仿真录像)
  • 【VUE的Form表单】使用v-if切换控件时,表单校验不生效
  • EnumWindowsProc
  • SSL安全证书:免费的SSL证书申请渠道有哪些?
  • SQL语言---数据的查询
  • 建模杂谈系列162 APIFunc: 可靠的复杂函数开发3
  • C++入门教程(10):for 语句
  • centos安装java运行环境jdk+tomcat
  • ES6 学习笔记(一)let,const和解构赋值
  • Java教程_软件开发基础
  • JSONP原理
  • Laravel Telescope:优雅的应用调试工具
  • markdown编辑器简评
  • react 代码优化(一) ——事件处理
  • SQL 难点解决:记录的引用
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 关于for循环的简单归纳
  • 关于字符编码你应该知道的事情
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 巧用 TypeScript (一)
  • 使用common-codec进行md5加密
  • 项目管理碎碎念系列之一:干系人管理
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 由插件封装引出的一丢丢思考
  • 自动记录MySQL慢查询快照脚本
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 进程与线程(三)——进程/线程间通信
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #includecmath
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • $$$$GB2312-80区位编码表$$$$
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (+4)2.2UML建模图
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (zt)最盛行的警世狂言(爆笑)
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (南京观海微电子)——I3C协议介绍
  • (排序详解之 堆排序)
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十三)Maven插件解析运行机制
  • (一)80c52学习之旅-起始篇
  • (原創) 物件導向與老子思想 (OO)
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功