Mybatis动态sql标签

动态SQL标签简介:

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

Mybatis中实现动态sql的标签有: <if>        <where>        <trim>        <set>        <choose>       <foreach>

示例对象(Student):

package com.ffyc.mybatis.model;

public class Student {
    private Integer id;
    private Integer num;//建议不使用基本类型,使用包装类型,包装类型默认值都是null,后期判断会方便
    private String name;
    private String gender;
    private Major major;//类与类之间的关联关系    has-a关系   什么有什么,将专业信息封装到专业对象中,减少冗余

    public Major getMajor() {
        return major;
    }

    public void setMajor(Major major) {
        this.major = major;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getNum() {
        return num;
    }

    public void setNum(Integer num) {
        this.num = num;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", num=" + num +
                ", name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", major=" + major +
                '}';
    }
}

<if>标签

        判断标签,用于添加判断条件:

        当我们查询学生列表时,若是不查询特定名字,则打印所有学生信息,若是要查询特定名字,则我们只需要选择对应名字的学生,示例如下:

Dao:

List<Student> findStudents(Student student);
<select id="findStudents" resultType="Student">
        select * from student
            <if test="name!=null">
                where name = #{name}
            </if>
</select>-->

<where>标签 

        判断内部if标签如果有一个返回true,会自动添加一个where关键字,还会自动去除where后多余关键字.

        在进行多条件查询时,例如:姓名,编号,性别。若性别为null则只需要查询姓名与编号相同的行,意思就是,几个元素不为null,就加几个判断条件。这时候就可以使用where进行多个条件的判断:

Dao:

List<Student> findStudents(Student student);
<select id="findStudents" resultType="Student">
        select * from student where
        
            <if test="name!=null">
                name = #{name}
            </if>
            <if test="num!=0">
                and num = #{num}
            </if>
            <if test="gender!=null">
                and gender = #{gender}
            </if>
        
    </select>

很明显,当我们写出来后会发现一个很糟糕的问题,要是传入的name值为null,查询语句:

        select * from student where and num=? and gender=?

where后面出现了一个多余的关键字‘and’.

这该怎么解决?

有一种简单而暴力的方法:

<select id="findStudents" resultType="Student">
        select * from student where 1=1
      
            <if test="name!=null">
                and name = #{name}
            </if>
            <if test="num!=0">
                and num = #{num}
            </if>
            <if test="gender!=null">
                and gender = #{gender}
            </if>
        </select>

这样一来,就不会出现where后面出现多余关键字的现象,这也是在<where>标签出现之前程序猿面对这种问题采取的措施。

有人就觉得了:有没有优雅一点的写法?

        这时候就到我们<where>标签出场了:

<select id="findStudents" resultType="Student">
        select * from student
        <where>
            <if test="name!=null">
                and name = #{name}
            </if>
            <if test="num!=0">
                and num = #{num}
            </if>
            <if test="gender!=null">
                and gender = #{gender}
            </if>
        </where>
    </select>

雅!太雅了!<where>标签会自动添加一个where关键字,还会自动去除where后多余关键字

<choose>标签

        <choose>标签与<when>标签和<otherwise>标签配用用于判定多重条件的语句 

        应用场景:若传值有名字则查找名字,若没有则查找编号若还是没有则查找名为'kk'的人

Dao:

List<Student> findStudents(Student student);
<select id="findStudents" resultType="Student">
        select * from student where
        <choose>
            <when test="name!=null">
                name=#{name}
            </when>
            <when test="num!=null">
                num=#{num}
            </when>
            <otherwise>
                name='kk'
            </otherwise>
        </choose>
    </select>

当传值为:name=“张三” num=1

 

当传值为: name=null num=1

 当传值为: name=null num=null

<trim>标签 

        当我们需要修改某些数据时,我们可以用到<trim>来删去多余的符号(或关键字)或是添加我们需要的符号(或关键字)

        应用场景:修改指定id的某几列

Dao:

void updatestudent(Student student);
<update id="updatestudent" parameterType="student">
        update student
        <trim prefix="set" suffixOverrides=",">
            <if test="name!=null">
                name=#{name},
            </if>
            <if test="num!=null">
                num=#{num},
            </if>
            <if test="gender!=null">
                gender=#{gender}
            </if>
        </trim>
        where id=#{id}
    </update>

在student后添加“set”,删去最后的“,”.

当传值为:name=op        num=1005        id=1

 <set>标签

        在标签前添加set,将最后的多余的逗号删除

        应用场景:与上面的<trim>标签相同,修改指定id的某几列

Dao:

void updatestudent(Student student);
<update id="updatestudent" parameterType="student">
        update student
        <set>
            <if test="name!=null">
                name=#{name},
            </if>
            <if test="num!=null">
                num=#{num},
            </if>
            <if test="gender!=null">
                gender=#{gender}
            </if>

        </set>
        where id=#{id}
    </update>

<foreach>标签 

        主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。

        item: 定义一个变量,接收每次循环中获得的元素

        collection: 循环的集合类型 list-集合 array-数量

        open: 循环开始的一个符号

        close: 循环结束的一个符号

        separator: 每次循环后的一个分隔符号

        index: 循环时生成的索引

        应用场景:当需要使用到一串相同类型变量时,可以与List或Integer[]搭配使用

         (1)当需要删除一组数据时我们可以接收这组数据的id,再用<foreeach>标签循环检索

Dao:

void deleteStudent(List<Integer> list);

 或 

void deleteStudent(Integer[] array);
<delete id="deleteStudent">
        delete from student where id in
        <foreach item="a" collection="list" open="(" close=")" separator=",">
            #{a}
        </foreach>
    </delete>

当传值为:[7,8]

        (2)查找所有学生的指定信息

Dao:

List<Student> findstudentbycolumn(List<String> list);
<select id="findstudentbycolumn" resultType="student">
        select
        <foreach item="a" collection="list" separator=",">
            ${a}
        </foreach>
        from student
    </select>

当传值为:name,num

最后补充一点:

        为什么整数类型不用基本类型而是用包装类?

        其实基本类型是可以使用的,但是基本类型被定义后默认值为0,而包装类型默认值为null,若是基本类型每次判断需要把!=null换成!=0,这样我们需要判断该变量的初始值是0还是null,而使用包装类就不需要思考,因为和其它变量一样都是null,因此一般使用包装类进行交互。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/711780.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue 安装依赖报错

解决方法&#xff1a; npm install --legacy-peer-deps 然后再运行项目即可。

微前端乾坤方案

微前端乾坤方案 了解乾坤 官方文档 介绍 qiankun 是一个基于 single-spa 的微前端实现库&#xff0c;旨在帮助大家能更简单、无痛的构建一个生产可用微前端架构系统。 qiankun 的核心设计理念 &#x1f944; 简单 由于主应用微应用都能做到技术栈无关&#xff0c;qiankun 对…

湘潭大学软件工程数据库2(题型,复习资源和计划)

文章目录 选择题关系范式事务分析E-R 图sql作业题答案链接&#xff08;仅限有官方答案的版本&#xff09;结语 现在实验全部做完了&#xff0c;实验和作业占比是百分之 40 &#xff0c;通过上图可以看出来&#xff0c;重点是 sql 语言 所以接下来主要就是学习 sql 语句怎么书写…

万能破题方法包(3)暴力破解法

一、前言 暴力破解法是指通过尝试所有可能的密码组合来破解密码 1.1、概念 暴力破解法是一种通过尝试所有可能的密码组合来破解密码的方法。它基于暴力的方式&#xff0c;不依赖于任何密码漏洞或特殊技巧&#xff0c;而是通过穷举所有可能性来找到正确的密码。 1.2、解决步骤 …

Python中关于电商商品数据的采集【taobao/JD/商品详情数据返回】

在Python中采集电商商品数据&#xff08;如淘宝、京东等&#xff09;通常涉及到网络爬虫&#xff08;web scraping&#xff09;或称为网络数据抓取&#xff08;web data scraping&#xff09;。由于电商平台通常会有反爬虫机制&#xff0c;因此直接抓取数据可能会遇到各种挑战&…

UITableView初识之分组显示数据Demo

基本介绍 继承自UIScrollView&#xff0c;因此可以滚动。 需要Datasource 遵循UITableViewDataSource协议的OC对象&#xff0c;都可以是UITableView的数据源&#xff0c;该协议中的方法告诉UITableView如何显示数据。 关于UITableView UITableView显示分组数据&#xff0c;对应…

C++ 30 之 new 和 delete 关键字

#include <iostream> #include <string.h> using namespace std;class Students08{ public:Students08(){cout << "students08的默认构造函数"<< endl;}Students08(int a){cout << "students08的有参构造函数"<< endl…

springboot与flowable(9):候选人组

act_id_xxx相关表存储了所有用户和组的数据。 一、维护用户信息 Autowiredprivate IdentityService identityService;/*** 维护用户*/Testvoid createUser() {User user identityService.newUser("zhangsan");user.setEmail("zhangsanqq.com");user.setF…

超万卡训练集群网络互联技术解读

超万卡训练集群互联关键技术 大模型迈向万亿参数的多模态升级&#xff0c;万卡集群计算能力亟需飞跃。关键在于增强单芯片性能、提升超节点算力、融合DPU多计算能力&#xff0c;并追求算力能效比极致。这一系列提升将强有力支撑更大规模模型训练和推理&#xff0c;快速响应业务…

ROS中Twist消息类型

Twist消息类型在Robot Operating System (ROS)中是一个常见的数据结构&#xff0c;主要用于描述物体的线性速度和角速度。这种消息类型在ROS的geometry_msgs包中定义&#xff0c;常用于机器人运动控制&#xff0c;尤其是当需要向机器人发布速度指令时。 Twist消息由两个Vector…

实拆一个风扇

fr:徐海涛(hunkxu)

枚举算法01

限制&#xff1a;升序-局部-表征新加的数大于前面一个 从前往后依次枚举每个位置上的数是几 我们排列时候 是从1 到 n 实际上比前面的数大 递归时 1.把搜索问题顺序变成搜索树 2 如何把树转化为

PySide在QLabel上按住鼠标左键画方框

用于截图放大等 import sys from PySide6.QtWidgets import QApplication, QLabel, QMainWindow from PySide6.QtGui import QPixmap, QPainter, QPen, QColor from PySide6.QtCore import Qt, QRect, QPointclass ImageLabel(QLabel):def __init__(self, parentNone):super().…

IDEA创建web项目

IDEA创建web项目 第一步&#xff1a;创建一个空项目 第二步&#xff1a;在刚刚创建的项目下创建一个子模块 第三步&#xff1a;在子模块中引入web 创建结果如下&#xff1a; 这里我们需要把这个目录移到main目录下&#xff0c;并改名为webapp&#xff0c;结果如下 将pom文件…

Linux下的串口通信

串口通信 基础知识&#xff1a; 什么是串口&#xff1f; 串口全称串行通信接口&#xff0c;是一种常用于电子设备之间通信的异步&#xff0c;全双工接口&#xff0c;典型的串口通信只需要 3 根线&#xff0c;分别是地线 (GND)&#xff0c;发送线(TX)&#xff0c;接收线(RX)。如…

(游戏:三个数的加法)编写程序,随机产生三个一位整数,并提示用户输入这三个整数的和,判断用户输入的和是否正确。

(游戏:三个数的加法)编写程序&#xff0c;随机产生三个一位整数&#xff0c;并提示用户输入这三个整 数的和&#xff0c;判断用户输入的和是否正确。 package myjava; import java.math.*; import java.util.Scanner; public class cy {public static void main(String[]args)…

自动化数据驱动?最全接口自动化测试yaml数据驱动实战

前言 我们在做自动化测试的时候&#xff0c;通常会把配置信息和测试数据存储到特定的文件中&#xff0c;以实现数据和脚本的分离&#xff0c;从而提高代码的易读性和可维护性&#xff0c;便于后期优化。 而配置文件的形式更是多种多样&#xff0c;比如&#xff1a;ini、yaml、…

微型操作系统内核源码详解系列五(1):arm cortex m3架构

系列一&#xff1a;微型操作系统内核源码详解系列一&#xff1a;rtos内核源码概论篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列二&#xff1a;微型操作系统内核源码详解系列二&#xff1a;数据结构和对象篇&#xff08;以freertos为例&#xff09;-CSDN博客 系列…

MySQL 中 Varchar(50) 和 varchar(500) 区别是什么?

一. 问题描述 我们在设计表结构的时候&#xff0c;设计规范里面有一条如下规则: 对于可变长度的字段&#xff0c;在满足条件的前提下&#xff0c;尽可能使用较短的变长字段长度。 为什么这么规定&#xff1f;我在网上查了一下&#xff0c;主要基于两个方面 基于存储空间的考…

洗地机哪款好?洗地机十大名牌排行榜

随着科技的发展&#xff0c;各种家居清洁工具层出不穷&#xff0c;为我们的生活带来了诸多便利。在众多清洁工具中&#xff0c;洗地机的清洁效果更受大家喜爱&#xff0c;它能够完美解决了扫地机无法做到的干湿垃圾“一遍清洁”效果&#xff0c;而且几乎能解决日常生活中所有的…