自学内容网 自学内容网

SSM——MyBatis动态SQL

目录

一、什么是动态sql

 二、用法

1、查找

 2、修改

​编辑 3、某一项查询

4、标签

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

(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层

<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接口

List<User> selectUser(User user);

Test类

 @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层

 <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接口

 int updateUser(User user);

Test类

不要忘记 session.commit();

 @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层

 <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接口

 List<User> ChooseUser(User user);

 Test类

 @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层

 <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:去掉后缀

 <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层

 <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接口

 int insertMoreUser(@Param("users") List<User> users);

Test类

  @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层

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

Dao接口

int deleteMore(@Param("ids") Integer[] ids);

Test类

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

结果如下:


原文地址:https://blog.csdn.net/2301_78566776/article/details/144296371

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!