Mybatis动态sql标签

动态SQL标签简介:

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

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

示例对象(Student):

java 复制代码
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:

java 复制代码
List<Student> findStudents(Student student);
java 复制代码
<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:

java 复制代码
List<Student> findStudents(Student student);
java 复制代码
<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'.

这该怎么解决?

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

java 复制代码
<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>标签出场了:

XML 复制代码
<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:

java 复制代码
List<Student> findStudents(Student student);
XML 复制代码
<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:

java 复制代码
void updatestudent(Student student);
XML 复制代码
<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:

java 复制代码
void updatestudent(Student student);
XML 复制代码
<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:

java 复制代码
void deleteStudent(List<Integer> list);

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

当传值为:[7,8]

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

Dao:

java 复制代码
List<Student> findstudentbycolumn(List<String> list);
XML 复制代码
<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,因此一般使用包装类进行交互。

相关推荐
Monkey-旭2 小时前
Android Handler 完全指南
android·java·handler
秃狼2 小时前
Execel文档批量替换标签实现方案
java
Brookty2 小时前
Java线程安全与中断机制详解
java·开发语言·后端·学习·java-ee
Sylvia-girl2 小时前
排序查找算法,Map集合,集合的嵌套,Collections工具类
java·算法·排序算法
TT哇2 小时前
【分治】归并排序——排序数组(medium)
java·算法·排序算法
给力学长2 小时前
自习室预约小程序的设计与实现
java·数据库·vue.js·elementui·小程序·uni-app·node.js
试着2 小时前
零基础学习性能测试第五章:JVM性能分析与调优-JVM概念,java程序运行原理
java·jvm·学习·零基础·性能测试
從南走到北3 小时前
JAVA东郊到家按摩服务同款同城家政服务按摩私教茶艺师服务系统小程序+公众号+APP+H5
android·java·开发语言·微信小程序·小程序
雾林小妖3 小时前
springboot集成deepseek
java·spring boot·后端
愿你天黑有灯下雨有伞4 小时前
枚举策略模式实战:优雅消除支付场景的if-else
java·开发语言·策略模式