SSM——MyBatis动态SQL

目录

一、什么是动态sql

二、用法

1、查找

2、修改

[​编辑 3、某一项查询](#编辑 3、某一项查询)

4、标签

[(1)用 trim 改写上面select的 if+where 语句](#(1)用 trim 改写上面select的 if+where 语句)

[(2)用 trim 改写上面update的 if+set 语句](#(2)用 trim 改写上面update的 if+set 语句)

5.批量添加

6.批量删除


非动态基础语句上一篇,已经为大家介绍

SSM框架------Mybaits实现增删改查_ssm1、使用mybatis实现从数据库查询一个列表数据和一条数据 2、使用mybatis进行增-CSDN博客文章浏览阅读877次,点赞29次,收藏25次。上一篇博文我们简单讲述了一个如何配置MybatisSSM搭建(1)------配置MyBatis-CSDN博客JDBC(Java Database Connectivity)是Java编程语言中用于访问关系型数据库的标准应用程序接口(API)。它由一组用Java语言编写的类和接口组成,定义了一套标准的接口,使得Java程序可以通过统一的方式连接、访问、操作不同的关系型数据库。新建项目选择【Maven】------选择默认SDK------【下一步】创建完成,让maven加载导入,如图加载完成。_ssm1、使用mybatis实现从数据库查询一个列表数据和一条数据 2、使用mybatis进行增https://blog.csdn.net/2301_78566776/article/details/144161037?spm=1001.2014.3001.5502这篇我们通过MyBatis实现动态SQL语句去完成增删改查。

一、什么是动态sql

动态SQL指在不同条件下做对sql语句的拼装。根据不同情况,去拼接不同的SQL语句。

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

比如我们在用淘宝之类的软件在进行商品属性选择的时候,我们会发现我们可以选择的商品的属性有很多条件,其中一些条件可以选择也可以不选择,那么如果使用传统的方式进行查询,反而在拼接sql的时候会造成一些列的问题。

二、用法

1、查找

<where>---<if> 标签

根据 username 和 sex 来查询数据。如果username为空,那么将只根据sex来查询;反之只根据username来查询。

mapper层

java 复制代码
<select id="selectUser" parameterType="com.qcby.entity.User" resultType="com.qcby.entity.User">
       select * from user
        <where>
            <if test="username!=null and username!=''">
                username=#{username}
            </if>
            <if test="sex!=null and sex!=''">
                and sex=#{sex}
            </if>
            <if test="birthday!=null">
                and birthday=#{birthday}
            </if> 
            <if test="address!=null and address!=''">
                and address=#{address}
            </if>
            <if test="id!=null">
                and id=#{id}
            </if>
        </where>
   </select>

加上了<where>标签,如果username为空,系统会自动剔除sex当中的and。保证查询的正常进行 。

Dao接口

java 复制代码
List<User> selectUser(User user);

Test类

java 复制代码
 @Test
    public void selectUser(){
        User user = new User();
        user.setUsername("熊大");
        user.setSex("男");
        List<User> users = mapper.selectUser(user);
        for (User u:users){
            System.out.println(u.toString());
        }
    }

结果如下

2、修改

<set>---<if> 标签 ------ 用来组装update语句

mapper层

java 复制代码
 <update id="updateUser" parameterType="com.qcby.entity.User">
        update user
        <set>
            <if test="username!=null and username!=''">
                username=#{username},
            </if>
            <if test="sex!=null and sex!=''">
                sex=#{sex},
            </if>
            <if test="birthday!=null">
                birthday=#{birthday},
            </if>
            <if test="address!=null and address!=''">
                address=#{address},
            </if>
        </set>
            where id=#{id}
    </update>

注意where id语句放在<set>标签外,并且<if>标签里的SQL语句使用逗号隔开

Dao接口

java 复制代码
 int updateUser(User user);

Test类

不要忘记 session.commit();

java 复制代码
 @Test
    public void updateUser(){
        User user = new User();
        user.setId(1);
        user.setBirthday(new Date());
        user.setAddress("大连");
        mapper.updateUser(user);
        session.commit();
    }

结果如下:

3、某一项查询

<choose>、<when>和<otherwise>标签

这个标签相当于是我们java当中的if.....elseif.....else

<choose>标签是这个标签组合当中的父标签和标签都在标签内部。

<when>标签就相当于是我们的 if 和 elseif

<otherwise>标签相当于是我们的 else

查询如果与用户使用username!=null那么我们使用username查询,否则使用sex查询,最终使用id查询

mapper层

java 复制代码
 <select id="ChooseUser" parameterType="com.qcby.entity.User" resultType="com.qcby.entity.User">
        select * from user
        <where>
            <choose>
                <when test="username!=null and username!=''">
                    username = #{username}
                </when>
                <when test="sex!=null and sex!=''">
                    sex = #{sex}
                </when>
                <otherwise>
                    id = #{id}
                </otherwise>
            </choose>
        </where>
    </select>

Dao接口

java 复制代码
 List<User> ChooseUser(User user);

Test类

java 复制代码
 @Test
    public void chooseUser(){
        User user = new User();
        user.setId(1);
        //user.setUsername("张三");
        //user.setSex("男");
        List<User> users = mapper.ChooseUser(user);
        for (User u:users){
            System.out.println(u.toString());
        }
    }

结果如下:

4、<trim>标签

trim标记是一个格式化的标记,可以完成set或者是where标记的功能

(1)用 trim 改写上面select的 if+where 语句

prefix:前缀

prefixoverride:去掉第一个and或者是or

mapper层

java 复制代码
 <select id="TrimSelectUser" parameterType="com.qcby.entity.User" resultType="com.qcby.entity.User">
        select * from user
        <trim prefix="where" prefixOverrides="and | or">
            <if test="username !=null and username !=''">
                username = #{username}
            </if>
            <if test="sex!=null and sex!=''">
                and sex = #{sex}
            </if>
            <if test="birthday !=null">
                and birthday = #{birthday}
            </if>
            <if test="address !=null and address!=''">
                and address = #{address}
            </if>
            <if test="id !=null">
                and id = #{id}
            </if>
        </trim>
    </select>
(2)用 trim 改写上面update的 if+set 语句

suffix:后缀

suffixOverrides:去掉后缀

java 复制代码
 <update id="TrimUpdateUser" parameterType="com.qcby.entity.User">
        update user
        <trim prefix="set" suffixOverrides=",">
            <if test="username !=null and username !=''">
                username = #{username} ,
            </if>
            <if test="sex!=null and sex!=''">
                sex = #{sex},
            </if>
            <if test="birthday!=null">
                birthday = #{birthday} ,
            </if>
            <if test="address !=null and address !=''">
                address = #{address} ,
            </if>
        </trim>
        where id = #{id}
    </update>
5.批量添加

<foreach>标签的应用

collection:前要循环的数组或者集合

item: 我们指定要循环的数组的每一个元素

mapper层

java 复制代码
 <insert id="insertMoreUser" >
        insert into user(username,address,sex,birthday) values
        <foreach collection="users" item="user" separator=",">
            (#{user.username},#{user.address},#{user.sex},#{user.birthday})
        </foreach>
    </insert>

Dao接口

java 复制代码
 int insertMoreUser(@Param("users") List<User> users);

Test类

java 复制代码
  @Test
    public void insertMoreUser(){
        User user1 = new User("aa",new Date(),"男","北京");
        User user2 = new User("bb",new Date(),"男","北京");
        User user3 = new User("cc",new Date(),"男","北京");
        List<User> users = Arrays.asList(user1,user2,user3);
        mapper.insertMoreUser(users);
        session.commit();
    }

结果如下:

6.批量删除

<foreach>标签的应用

collection:当前要循环的数组或者集合

item: 我们指定要循环的数组的每一个元素

separator:每一个元素应该用什么来做分割

open:当前循环是以什么开始

close:当前循环是以什么结束

mapper层

java 复制代码
 <delete id="deleteMore" >
        delete from user where id in
        <foreach collection="ids" item="id" separator="," open="(" close=")">
            #{id}
        </foreach>
    </delete>

Dao接口

java 复制代码
int deleteMore(@Param("ids") Integer[] ids);

Test类

java 复制代码
 @Test
    public void deleteMore(){
        Integer[] ids = new Integer[]{6,7,8};
        mapper.deleteMore(ids);
        session.commit();
    }

结果如下:

相关推荐
pengzhuofan38 分钟前
第10章 Maven
java·maven
百锦再1 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
刘一说1 小时前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
壹佰大多1 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring
百锦再1 小时前
对前后端分离与前后端不分离(通常指服务端渲染)的架构进行全方位的对比分析
java·开发语言·python·架构·eclipse·php·maven
DokiDoki之父2 小时前
Spring—注解开发
java·后端·spring
源力祁老师2 小时前
ODOO数据文件(XML、CSV、SQL)是如何转换并加载到 Odoo 数据库
xml·数据库·sql
提笔了无痕2 小时前
什么是Redis的缓存问题,以及如何解决
数据库·redis·后端·缓存·mybatis
CodeCraft Studio2 小时前
【能源与流程工业案例】KBC借助TeeChart 打造工业级数据可视化平台
java·信息可视化·.net·能源·teechart·工业可视化·工业图表
摇滚侠2 小时前
Spring Boot 3零基础教程,WEB 开发 默认页签图标 Favicon 笔记29
java·spring boot·笔记