JavaEE简单示例——动态SQL的<trim>属性

news2024/10/6 8:24:38

简单介绍:

在之前我们介绍过使用<where>和<set>可以帮我们动态的添加和删除一些关键字,但是这些只能操作特定的关键字,比如where和set,但是有一些时候我们需要操作的关键字并不是这些常见的关键字,而是一些没有标签进行直接操作的一些不常用的关键字,这时候如果想要删除或者添加这些关键字就要使用另一个标签<trim>标签,这个标签可以自定义我们要删除或者添加的关键字。

简单使用:

<select id="唯一标识" resultType="结果集封装的实体类" >

        select * from student

        <trim prefix="要添加的前缀关键字" suffixOverrides="要删除的后缀关键字">

                <if test="判断条件">

                        and 要拼接的SQL语句

                </if>

                <if test="判断条件">

                        and 要拼接的SQL语句

                </if>

        </trim>

</select>

<trim>标签有四个属性:

prefix:指定SQL语句增加的前缀

prefixOverrides:指定SQL语句中要去掉的前缀字符串

suffix:指定给SQL语句增加的后缀

suffixOverrides:指定SQL语句中要去掉的后缀字符串

代码实现:

SQL映射文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="Mappers.dynamicSql">
  <select id="selectByIdOrName" parameterType="student" resultType="student">
    select * from student where 1=1
#                             当id的值不等于null并且id的值不是空字符的时候,就会拼接这个SQL语句
        <if test="id != null and id != ''">
          and id = #{id}
        </if>
#                             当name的值不等于null的时候并且name的值不是空字符串的时候,就会拼接这个SQL语句
        <if test="name != null and name != ''">
#                             注意这个地方是使用了一个concat函数将模糊匹配的百分号和参数进行拼接,在使用的时候注意这个地方不要写错
          and name like concat ('%',#{name},'%')
        </if>
  </select>
    <select id="selectAll" resultType="student">
        select * from student;
    </select>
<!--    动态SQL中的choose元素-->
<!--    当查询的条件满足第一个when的时候,就拼接第一个when里面的SQL语句-->
<!--    当查询的条件满足第二个when的时候,就拼接第二个when里面的SQL语句-->
<!--    当所有的when都不满足的时候,就拼接otherwise里面的SQL语句-->
<!--    当有多个when里面的条件都满足的时候,就拼接最靠上的一条SQL语句,并且不会执行其他when里面的语句-->
    <select id="selectStudentByIdAndName" resultType="student" >
        select * from student where 1=1
        <choose>
            <when test="name != null and name != ''">
                and name like concat('%',#{name},'%')
            </when>
            <when test="id != null and id != ''">
                and id = #{id}
            </when>
            <otherwise>
                and password is not null
            </otherwise>
        </choose>
    </select>
<!--    使用<where>来动态的处理where关键字是否添加-->
    <select id="selectByIdAndWhere" resultType="student" parameterType="student">
        select * from student
        <where>
            <if test="name != null and name !=''">
                and name like concat('%',#{name},'%')
            </if>
            <if test="id != null and id !=''">
                and id = #{id}
            </if>
        </where>
    </select>
<!--    使用set标签简化update的代码和运行效率-->
    <update id="updateBySet" parameterType="student">
        update student
            <set>
                <if test="name != null and name != ''">
                    name = #{name},
                </if>
                <if test="password != null and password != ''">
                    password = #{password},
                </if>
            </set>
        where id = #{id}
    </update>
<!--    使用<trim>标签来动态的添加where和and关键字-->
    <select id="selectByTrim" parameterType="student" resultType="student">
        select * from student
        <trim prefix="where" prefixOverrides="and">
            <if test="name != null and name !=''">
                and name like concat('%',#{name},'%')
            </if>
            <if test="id != null and id != ''">
                and id = #{id}
            </if>
        </trim>
    </select>
</mapper>

接口文件:

package Mappers;

import com.mybatis.POJO.student;

import java.util.List;

public interface dynamicSql {
    List<student> selectByIdOrName(student s);
    List<student> selectStudentByIdAndName(student s);
    List<student> selectByIdAndWhere(student s);
    int updateBySet(student s);
    List<student> selectByTrim(student s);
}

测试类:

package Mappers;

import com.mybatis.POJO.Tools.createSqlSession;
import com.mybatis.POJO.student;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class dynamicSqlTest {
    @Test
    public void selectByIdOrName(){
        SqlSession sqlSession = new createSqlSession().create();
        dynamicSql dynamicSql = new createSqlSession().createdynamicSql();
        student s = new student();
        s.setId(1);
        s.setName("张三");
        List<student> stu = sqlSession.selectList("Mappers.dynamicSql.selectByIdOrName", s);
        for(student student : stu){
            System.out.println(student.toString());
        }
    }
    @Test
    public void selectStudentByIdAndName(){
        dynamicSql dynamicSql = new createSqlSession().createdynamicSql();
        student s =new student();
//        s.setId(1);
//        s.setName("张三");
        for (student student : dynamicSql.selectStudentByIdAndName(s)) {
            System.out.println(student);
        }
    }
    @Test
    public void selectAll(){
        SqlSession sqlSession = new createSqlSession().create();
        dynamicSql dynamicSql = new createSqlSession().createdynamicSql();
        List<student> list = sqlSession.selectList("Mappers.dynamicSql.selectAll");
        for(student student : list){
            System.out.println(student.toString());
        }
    }
    @Test
    public void selectByIdAndWhere(){
        SqlSession sqlSession = new createSqlSession().create();
        dynamicSql dynamicSql = new createSqlSession().createdynamicSql();
        student s = new student();
//        s.setId(1);
//        s.setName("张三");
        for (student student : dynamicSql.selectByIdAndWhere(s)) {
            System.out.println(student.toString());
        }
    }
//    测试set标签插入数据的方法
    @Test
    public void updateBySet(){
        SqlSession sqlSession = new createSqlSession().create();
        dynamicSql dynamicSql = new createSqlSession().createdynamicSql();
        student s = new student();
        s.setId(4);
        s.setName("大海");
        s.setPassword("222333");
        int i = dynamicSql.updateBySet(s);
        if(i > 0){
            System.out.println("修改成功!");
        }
    }
//    使用<trim>标签动态的添加where关键字和and关键字
    @Test
    public void selectByTrim(){
        SqlSession sqlSession = new createSqlSession().create();
        dynamicSql dynamicSql = new createSqlSession().createdynamicSql();
        student s = new student();
        s.setId(1);
        s.setName("张三");
        for (student student : dynamicSql.selectByTrim(s)) {
            System.out.println(student.toString());
        }

    }
}

运行结果:

我们先放开两个条件,当这两个条件同时存在的时候,应该会正常的查询出一条数据:

紧接着我们就关闭id的参数,只保留name的参数作为查询条件,这时候我们能查询出两条数据:

 可以看到无论是查询单条数据还是多条数据都可以正常的查询出来 

注意点:

在我们使用<trim>标签的时候,一定要注意它的四个属性的使用,注意要添加的关键字是前缀还是后缀,以及SQL语句是否拼写错误,条件判断语句的判断条件是否正确合理。

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

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

相关文章

基于SSM的婴幼儿商城

基于SSM的婴幼儿商城 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; …

软件测试3年经验就能拿30K?

1.软件测试如何实现涨薪 首先涨薪并不是从8000涨到9000这种涨薪&#xff0c;而是从8000涨到15K加到25K的涨薪。基本上三年之内就可以实现。 如果我们只是普通的有应届毕业生或者是普通本科那我们就只能从小公司开始慢慢往上走。 有些同学想去做测试&#xff0c;是希望能够日…

springboot+vue员工宿舍报修系统 uniapp微信小程序开发的

目 录 目 录 III 第一章 概述 1 1.1 研究背景 1 1.2 开发意义 1 1.3 研究现状 1 1.4 研究内容 2 1.5 论文结构 2 第二章 开发技术介绍 1 2.2 微信开发者工具 1 2.3 mysql数据库介绍 1 2.4 MySQL环境配置 2 2.5 B/S架构 2 第三章 系统分析 1 3.1 可行性分析 1 3.1.1 技术可行性…

这次,我的CentOS又ping不通www.baidu.com了(gateway配置)

当我们保证了宿主机与虚拟机的ip地址在同一网段&#xff0c;并且我们使用虚拟机ping宿主机&#xff0c;与宿主机ping虚拟机都可以互相ping通的情况下虚拟机却ping不通外网了&#xff0c;由于涉及到了跨越网络访问&#xff0c;所以我们应该把问题聚焦在网关的配置上&#xff01;…

手工布署 java 项目

新建一个java springboot项目 maven 这是一个非常简易的 springBoot 的项目 使用 maven 的 package 工具进行打包 把包上传到 linux 的机器上&#xff0c; 确保 linux 机器上安装了 java jdk工具&#xff0c; 并且配置好了 JAVA_HOME 注意&#xff0c;helloworld 默认的是要使…

Rocky 9.1操作系统实现zabbix6.0的安装部署实战

文章目录前言一. 实验环境二. 安装zabbix过程2.1. 安装zabbix源2.2 安装zabbix相关的软件2.3 安装数据库并启动2.4 开始初始化数据库&#xff1a;2.5 创建数据库实例及对应的用户2.6 导入官网提供的数据2.7 配置zabbix 服务的配置文件2.8. 启动服务2.9 从网页进行安装2.10 登陆…

H5盲盒抽奖系统源码

盲盒抽奖系统4.0&#xff0c;带推广二维码防洪炮灰功能和教程。 支持微信无限回调登录 标价就是源码价格&#xff0c;vuetp5框架编写&#xff0c;H5网页&#xff0c;前后端分离 此源码为正规开发&#xff0c;正版产品已申请软著。 开源无加密无授权&#xff0c;可以二开使用…

网络工程师必备知识点

作为网络工程师&#xff0c;您将负责设计、部署和维护计算机网络系统。这包括构建、配置和管理网络设备&#xff0c;如交换机、路由器、防火墙等&#xff0c;并确保网络系统能够高效地运行。您需要了解计算机网络的各个层次、协议、标准和技术&#xff0c;包括TCP/IP、DNS、HTT…

东京大学最新研究成果!一种可实现陆空两栖的新型四足机器人SPIDAR,具备多模态运动能力

原创/文 BFT机器人 现实中&#xff0c;蜘蛛可以凭借飘荡的蛛丝在空中漂浮&#xff0c;让它们能够穿越复杂地形。普通蜘蛛长度只有几毫米&#xff0c;重量只有几十克&#xff0c;如何让比蜘蛛重数百倍的机器人实现多模态运动&#xff0c;是众多学者研究的热点。 具有多模态运动…

分布式链路追踪-skywalking

一、分布式调用链随着业务的高速发展&#xff0c;服务之间的调用关系愈加复杂线上每一个请求会经过多个业务系统&#xff0c;并产生对各种缓存或者DB 的访问&#xff0c;业务流会经过很多个微服务的处理和传递。问题&#xff1a;• —次请求的流量从哪个服务而来&#xff1f;最…

ChatGPT这是要抢走我的饭碗?我10年硬件设计都有点慌了

前 言 呃……问个事儿&#xff0c;听说ChatGPT能写电路设计方案了&#xff0c;能取代初级工程师了&#xff1f;那我这工程师的岗位还保得住么&#xff1f;心慌的不行&#xff0c;于是赶紧打开ChatGPT问问它。 嘿&#xff0c;还整的挺客气&#xff0c;快来看看我的职业生涯是否…

图扑孪生工厂流水线组态图可视化

前言 2018 年&#xff0c;世界经济论坛(WEF)携手麦肯锡公司共同倡议并正式启动了全球“灯塔工厂网络项目”(Lighthouse Network)&#xff0c;共同遴选率先应用工业革命 4.0 技术实现企业盈利和持续发展的创新者与示范者。这就使得工厂系统需要对各流水线及生产运行成本方面进行…

非关系型数据库(mongodb)简单使用介绍

关系型数据库与非关系型数据库 关系型数据库有mysql、oracle、db2、sql server等&#xff1b; 关系型数据库特点&#xff1a;关系紧密&#xff0c;由表组成&#xff1b; 优点&#xff1a; 易于维护&#xff0c;都是使用表结构&#xff0c;格式一致&#xff1b; sql语法通用&a…

资源消耗降低 90%,速度提升 50%,解读 Apache Doris Compaction 最新优化与实现

背景LSM-Tree&#xff08; Log Structured-Merge Tree&#xff09;是数据库中最为常见的存储结构之一&#xff0c;其核心思想在于充分发挥磁盘连续读写的性能优势、以短时间的内存与 IO 的开销换取最大的写入性能&#xff0c;数据以 Append-only 的方式写入 Memtable、达到阈值…

Linux基础命令-lsof查看进程打开的文件

Linux基础命令-uptime查看系统负载 Linux基础命令-top实时显示系统状态 Linux基础命令-ps查看进程状态 文件目录 前言 一 命令的介绍 二 语法及参数 2.1 使用help查看命令的语法信息 2.2 常用参数 2.2.lsof命令-i参数的条件 三 命令显示内容的含义 3.1 FD 文件描述符的…

手工测试1年经验面试,张口要13K,我真是服了····

由于朋友临时有事&#xff0c; 所以今天我代替朋友进行一次面试&#xff0c;他需要应聘一个测试工程师&#xff0c; 我以很认真负责的态度完成这个过程&#xff0c; 大概近30分钟。 主要是技术面试&#xff0c; 在近30分钟内&#xff0c; 我与被面试者是以交流学习的方式进行的…

自动驾驶路径规划概况

文章目录前言介绍1. 路径规划在自动驾驶系统架构中的位置2. 全局路径规划的分类2.1 基础图搜索算法2.1.1 Dijkstra算法2.1.2 双向搜索算法2.1.3 Floyd算法2.2 启发式算法2.2.1 A*算法2.2.2 D*算法2.3 基于概率采样的算法2.3.1 概率路线图&#xff08;PRM&#xff09;2.3.2 快速…

docker启动容器报错No chain/target/match by that name.

一、问题描述 docker启动容器时提示: docker start xxx-search Error response from daemon: driver failed programming external connectivity on endpoint microblog-search (801478f2672887ee0fcf60eb7d7970703b4853f44f51b0b5b8622dafdb9580fb): (iptables failed: iptab…

【C ++】C++入门知识(二)

C入门&#xff08;二&#xff09; 作者&#xff1a;小卢 专栏&#xff1a;《C》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 1.引用 1.1.引用的概念及应用 引用&#xff08;&&#xff09; 引用不是新定义一个变量&#xff0…

前缀和与差分---概念+例题

目录 前缀和 概念 例题 差分 概念 例题 前缀和 概念 在高中学习了数列的概念&#xff0c;跟现在的数组很像。可以类比来看&#xff0c;数组的前缀和与数列的前n项和其实可以看成一个概念。很多算法题利用前缀和的思想也就是可以使用高中里面的前n项和来求解数组里面任何…