【MyBatis】动态SQL

news2024/12/28 20:50:04

if标签

CarMapper.java

/**
     * 多条件查询
     * @param brand 品牌
     * @param guidePrice 指导价
     * @param carType 汽车类型
     * @return
     */
    List<Car> selectByMultiCondition(@Param("brand") String brand,@Param("guidePrice") Double guidePrice,@Param("carType") String carType);

CarMapper.xml

   <select id="selectByMultiCondition" resultType="car">
        select * from t_car where 1=1
--      1.if标签中test属性是必须的
--      2.if标签中test属性的值是falsetrue
--      3.如果test是true,if标签中的sql语句就会拼接
--      4.test属性中可以使用的是:
--          当使用了@Param注解,那么test中要出现的是@Param注解指定的参数名,@Param("brand"),只能用brand
--          当没有使用注解,则出现param1 param2 arg0 arg1
--          当使用POJO,则出现POJO的属性名
        <if test="brand !=null and brand !=''">
            and brand like "%"#{brand}"%"
        </if>
        <if test="guidePrice !=null and guidePrice !=''">
            and guide_price > #{guidePrice}
        </if>
        <if test="carType !=null and carType !=''">
            and car_type = #{carType}
        </if>
    </select>

test.java

    @Test
    public void testSelectByMuItiCondition(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);

        //假设三个条件都不是空
        List<Car> cars = mapper.selectByMultiCondition("比亚泰迪",2.0,"新能源");

        //假设三个条件都是空

        //假设后两个条件不为空,第一个条件为空

        //假设第一个条件不为空,第二个条件为空

        cars.forEach(car -> System.out.println(car));
        sqlSession.close();
    }

where标签

作用:让where子句更加动态智能

  • 所有条件都为空时,where标签保证不会生成where子句
  • 自动去除某些条件前面多余的and或or
    mapper接口
 /**
     * 使用where标签
     * @param brand
     * @param guidePrice
     * @param carType
     * @return
     */

    List<Car> selectByMultiConditionWithWhere(@Param("brand") String brand,@Param("guidePrice") Double guidePrice,@Param("carType") String carType);

xml

    <select id="selectByMultiConditionWithWhere" resultType="car">
        select * from t_car
--         where标签专门负责where子句动态生成的
        <where>
            <if test="brand !=null and brand !=''">
                brand like "%"#{brand}"%"
            </if>
            <if test="guidePrice !=null and guidePrice !=''">
                and guide_price > #{guidePrice}
            </if>
            <if test="carType !=null and carType !=''">
                and car_type = #{carType}
            </if>
        </where>
    </select>

test

 @Test
    public void testselectByMultiConditionWithWhere(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        //三个条件都是空
        List<Car> cars = mapper.selectByMultiConditionWithWhere("",null,"");
        cars.forEach(car -> System.out.println(car));
        sqlSession.close();
    }

trim标签

接口


    /**
     * 使用trim标签
     * @param brand
     * @param guidePrice
     * @param carType
     * @return
     */
    List<Car> selectByMultiConditionWithTrim(@Param("brand") String brand,@Param("guidePrice") Double guidePrice,@Param("carType") String carType);

xml

 <select id="selectByMultiConditionWithTrim" resultType="car">
        select * from t_car
        <!--
            prefix:加前缀
            suffix:加后缀
            prefixOverrides:删除前缀
            suffixOverrides:删除后缀
        -->
        <!--
            prefix="where" 在trim标签所有内容的前面添加where
            suffixOverrides="and|or 把trim标签中内容的后缀and或or去掉
        -->
        <trim prefix="where" suffixOverrides="and|or">
            <if test="brand !=null and brand !=''">
                brand like "%"#{brand}"%" and
            </if>
            <if test="guidePrice !=null and guidePrice !=''">
                 guide_price > #{guidePrice} and
            </if>
            <if test="carType !=null and carType !=''">
                  car_type = #{carType}
            </if>
        </trim>
    </select>

test

@Test
    public void testselectByMultiConditionWithTrim(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        List<Car> cars = mapper.selectByMultiConditionWithTrim("",null,"");
        cars.forEach(car -> System.out.println(car));
        sqlSession.close();
    }

set标签

主要用在update语句中,用来生成set关键字,同时去除最后多余的“,”
比如我们只更新提交的不为空的字段,如果提交的数据是空或者“”,那么这个字段我们将不更新。
接口

    /**
     * 使用set标签
     * @param car
     * @return
     */
    int updateBySet(Car car);

xml


    <update id="updateBySet">
        update t_car
        <set>
            <if test="carNum !=null and carNum !=''">car_num=#{carNum},</if>
            <if test="brand !=null and brand !=''">brand=#{brand},</if>
            <if test="guidePrice !=null and guidePrice !=''">guide_price=#{guidePrice},</if>
            <if test="produceTime !=null and produceTime !=''">produce_time=#{produceTime},</if>
            <if test="carType !=null and carType !=''">car_type=#{carType},</if>
        </set>
            where
                id=#{id}
    </update>

test


    @Test
    public void testUpdateBySet(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        Car car=new Car(2L,null,"丰田道",null,null,"燃油车");
        mapper.updateBySet(car);
        sqlSession.commit();
        sqlSession.close();
    }

choose when otherwise

这三个标签在一起使用
接口

 /**
     * 使用choose when otherwise标签
     * @param brand
     * @param guidePrice
     * @param carType
     * @return
     */

     List<Car> selectByChoose(@Param("brand") String brand,@Param("guidePrice") Double guidePrice,@Param("carType") String carType);
    

xml

 <select id="selectByChoose" resultType="car">
        select * from t_car
        <where>
            <choose>
                <when test="brand != null and brand !=''">
                    brand like "%"#{brand}"%"
                </when>
                <when test="guidePrice !=null and guidePrice !=''">
                    guide_price > #{guidePrice}
                </when>
                <otherwise>
                    car_type=#{carType}
                </otherwise>
            </choose>
        </where>
    </select>

test

 @Test
    public void testselectByChoose(){
        SqlSession sqlSession=SqlSessionUtil.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        List<Car> cars = mapper.selectByChoose("宾利", null, null);
        cars.forEach(car -> System.out.println(car));
        sqlSession.close();
    }

foreach标签

批量删除

java

 /**
     * 批量删除,foreach标签
     * @param ids
     * @return
     */
   int deleteByIds(@Param("ids") Long[] ids);

xml

 <!--
    foreach标签的属性:
        collection:指定数组或集合
        item:代表数组或集合中的元素
        separator:循环之间的分隔符
        open foreach循环拼接的所有sql语句的最前面以什么开始
        colse foreach循环拼接的所有sql语句的最后面以什么结束
    -->
<!--    报错:Parameter 'ids' not found. Available parameters are [array, arg0]-->
<!--    可以使用@Param标签-->
<!--    <delete id="deleteByIds">-->
<!--        delete from t_car where id in(-->
<!--            <foreach collection="ids" item="id" separator=",">-->
<!--                #{id}-->
<!--            </foreach>-->
<!--            )-->
<!--    </delete>-->
<!--    另一种写法(没有括号的)-->
    <delete id="deleteByIds">
            delete from t_car where id in
                <foreach collection="ids" item="id" separator="," open="(" close=")">
                    #{id}
                </foreach>

        </delete>

test

  @Test
    public void testDeleteByIds(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        Long[] ids={7L,8L,9L};
        int count=mapper.deleteByIds(ids);
        System.out.println(count);
        sqlSession.commit();
        sqlSession.close();
    }

第二种写法
xml

<delete id="deleteByIds2">
        <foreach collection="ids" item="id" separator="or">
            id=#{id}
        </foreach>
    </delete>

批量添加

java

 /**
  * 批量插入,一次插入多条Car信息
  * @param cars
  * @return
  */
 int insertBatch(@Param("cars") List<Car> cars);

xml

    
    <insert id="insertBatch">
        insert into t_car values
        <foreach collection="cars" item="car" separator=",">
            (null,#{car.carNum},#{car.brand},#{car.guidePrice},#{car.produceTime},#{car.carType})
        </foreach>
    </insert>

test

   @Test
    public void testinsertBatch(){
        SqlSession sqlSession = SqlSessionUtil.openSession();
        CarMapper mapper = sqlSession.getMapper(CarMapper.class);
        Car car1=new Car(null,"1200","帕萨特",30.0,"2020-11-15","燃油车");
        Car car2=new Car(null,"1201","帕萨特CDS",50.0,"2021-11-15","燃油车");
        Car car3=new Car(null,"1202","奔驰",40.0,"2024-11-15","新能源");

        List<Car> cars=new ArrayList<>();
        cars.add(car1);
        cars.add(car2);
        cars.add(car3);
        mapper.insertBatch(cars);
        sqlSession.commit();
        sqlSession.close();
    }

sql标签 include标签

sql标签用来声明sql片段
include标签用来将声明的sql片段包含到某个sql语句中

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL基础篇之MySQL概述

01、MySQL概述 1.1、数据库相关概念 1、数据库相关概念 名称解释说明简称数据库存储数据的仓库&#xff0c;数据是有组织的进行存储DataBase&#xff08;DB&#xff09;数据库管理系统操纵和管理数据库的大型软件DataBase Management System&#xff08;DBMS&#xff09;SQL…

ky使用教程(基于fetch的小巧优雅js的http客服端)

1.前言 react项目更加倾向于使用原生的fetch请求方式&#xff0c;而ky正是底层使用fetch的api做请求。github星数是8.2K&#xff0c;源码地址是&#xff1a;GitHub - sindresorhus/ky: &#x1f333; Tiny & elegant JavaScript HTTP client based on the browser Fetch A…

树上背包dp

“我们终其一生不过是为了一个AC罢了” 软件安装 嗯…这个题又调了一个下午&#xff0c;不过俺的确对dp方程有了一些理解 这个题没啥难的&#xff0c;不过是这个转移方程不太好想&#xff0c;过于抽象了&#xff0c;之前一直不理解树上背包是啥&#xff0c;现在理解了&#xff…

Xftp 无法连接 Debian

Xftp 无法连接 Debian检查网络是否配置有问题检查是不是防火墙没有关闭首先检查主机防火墙检查Debian防火墙启动SSH服务检查网络是否配置有问题 发现主机和Debian在一个网段。说明配置没有问题。 检查是不是防火墙没有关闭 首先检查主机防火墙 检查Debian防火墙 显然都没有开…

并行多核体系结构基础知识

目录分类MIMD计算机分类并行编程并行编程模型共享存储并行模型针对LDS的并行编程存储层次结构缓存一致性和同步原语缓存一致性基础对同步的硬件支持存储一致性模型和缓存一致性解决方案存储一致性模型高级缓存一致性设计互连网络体系结构分布式操作系统SIMT体系结构分类 根据Fl…

MCE | 磁珠 VS 琼脂糖珠

琼脂糖珠 长久以来&#xff0c;多孔的琼脂糖珠 (也称琼脂糖树脂) 作为免疫沉淀实验中的固相支持物常用的材料。琼脂糖珠海绵状的结构 (直径 50-150 μm) 可以结合抗体 (继而结合靶蛋白)&#xff0c;它能够直接高效、快速结合抗体&#xff0c;而不需借助特殊的专业设备。 图 1.…

【.Net Core】上传文件-IFormFile

文章目录安全注意事项存储方案文件上传方案.NET Core Web APi FormData多文件上传&#xff0c;IFormFile强类型文件灵活绑定验证内容验证文件扩展名验证文件签名验证文件名安全大小验证使名称属性值与 POST 方法的参数名称匹配来源安全注意事项 向用户提供向服务器上传文件的功…

openfeign调用文件服务的文件上传接口报错:Current request is not a multipart request

今天在用Swagger测试项目中文件服务的文件上传接口时发现接口调用异常。 异常展示 笔者这里罗列下Swagger上的错误显示、文件服务的异常以及服务调用方的异常。 【Swagger的异常】 【服务调用方的控制台异常】 【文件服务的控制台异常】 代码展示 【服务调用方的Controller…

KMP算法(求解字符串匹配)

提示&#xff1a;可搭配B站比特大博哥视频学习&#xff1a;传送门 &#xff08;点击&#xff09; 目录 前言 图解 代码 前言 KMP算法是一种改进的字符串匹配算法&#xff0c;由D.E.Knuth&#xff0c;J.H.Morris和V.R.Pratt提出的&#xff0c;因此人们称它为克努特一莫里斯―…

如何实现办公自动化?

办公自动化&#xff08;OA&#xff09;允许数据在没有人工干预的情况下流动。由于人工操作被排除在外&#xff0c;所以没有人为错误的风险。如今&#xff0c;办公自动化已经发展成无数的自动化和电子工具&#xff0c;改变了人们的工作方式。 办公自动化的好处 企业或多或少依…

jar包的一些事儿

在咱们日常的搬砖过程中&#xff0c;只要你涉及到Java的项目&#xff0c;就不可避免地接触到jar包。而实际开发中&#xff0c;maven等项目管理工具为我们自动地管理jar包以及相关的依赖&#xff0c;让jar包的调用看起来如黑盒一般"密不透风"。今天&#xff0c;让我们…

做音视频开发要掌握哪些知识?

最近有读者留言&#xff0c;说“想转行音视频开发&#xff0c;怎么做”&#xff0c;正巧&#xff0c;前几天我还在某乎上&#xff0c;看到有人在问音视频的学习资料&#xff0c;还是个大一的学生。 想说一句&#xff1a;真有眼光。 如今这个时代&#xff0c;想赚钱&#xff0c;…

前端开发——HTML5新增加的表单属性

1.formactiom属性 对于<input type"submit">、<button type"submit"></button>、<input type"image">元素&#xff0c;都可以指定formcation属性&#xff0c;该属性可以提交到不同的URL。 代码如下&#xff1a; <f…

自动化平台测试开发方案(详解自动化平台开发)

目录&#xff1a;导读 前言 自动化平台开发方案自动化平台开发 功能需求 技术知识点 技术知识点如表所示 自动化平台开发技术栈如图所示。 开发时间计划 投资回报率可视化 后期优化计划 登录功能实现 退出功能实现 使用Django 内置用户认证退出函数logout。 权限功…

Word控件Spire.Doc 【图像形状】教程(4) 用 C# 中的文本替换 Word 中的图像

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

元宇宙|世界人工智能大会之元宇宙论坛:设计篇

Hello&#xff0c;大家好~ 这里是壹脑云科研圈&#xff0c;我是鲤鱼~ 世界人工智能大会&#xff08;WAIC&#xff09;由国家发展和改革委员会、工业和信息化部、科学技术部、国家互联网信息办公室、中国科学院、中国工程院、中国科学技术协会和上海市人民政府共同主办。 大会…

宝宝喝奶粉过敏怎么办?

为了确保喂养过程安全&#xff0c;我们仍然需要首先了解婴儿奶粉过敏的症状&#xff0c;母亲利用这些基本症状来判断婴儿是否对奶粉过敏&#xff0c;以便及时发现婴儿奶粉过敏&#xff0c;找到相应的策略。婴儿奶粉过敏婴儿奶粉过敏&#xff0c;是指婴儿喝配方奶粉后&#xff0…

【STL】string 类

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;为什么要…

一道面试题:JVM老年代空间担保机制

面试问题 昨天面试的时候&#xff0c;面试官问的问题&#xff1a; 什么是老年代空间担保机制&#xff1f;担保的过程是什么&#xff1f;老年代空间担保机制是谁给谁担保&#xff1f;为什么要有老年代空间担保机制&#xff1f;或者说空间担保机制的目的是什么&#xff1f;如果…

APS高级排产可视化设备任务甘特图

甘特图是评价一个高级计划排程系统的最重要指标之一。一方面企业排程结果数据量规模 大&#xff0c;表格形式显示数据非常不直观&#xff0c;必须借助甘特图进行可视化显示。另一方面&#xff0c;在甘特图上面手动调整排程结果&#xff0c;反馈生产实绩&#xff0c;也可大大简化…