Mybatis 动态SQL – 使用trim标签替代where,set标签

news2024/12/25 13:55:46

前面几篇我们介绍了where,set标签的使用;本篇我们继续介绍如何使用Mybatis提供的tirm标签替代where,set标签。

如果您对where,set标签不太了解,建议您先进行了解后再阅读本篇,可以参考:

Mybatis 动态SQL – 使用if,where标签动态生成条件语句

Mybatis 动态SQL – 使用if,set标签动态生成更新语句

一、数据准备

这里我们直接使用脚本初始化数据库中的数据

-- 如果数据库不存在则创建数据库
CREATE DATABASE IF NOT EXISTS demo DEFAULT CHARSET utf8;
-- 切换数据库
USE demo;
-- 创建用户表
CREATE TABLE IF NOT EXISTS T_TEACHER(
  ID INT PRIMARY KEY COMMENT '教师编号',
  TEACHER_NAME VARCHAR(64) NOT NULL COMMENT '教师名称',
  DEPARTMENT VARCHAR(16) NOT NULL COMMENT '所属部门',
  BIRTH DATE NOT NULL COMMENT '出生年月',
  DEGREE VARCHAR(16) NOT NULL COMMENT '学历(ZK:专科, BK:本科, YJS:研究生, BS:博士)'
);
-- 插入用户数据
INSERT INTO T_TEACHER(ID, TEACHER_NAME, DEPARTMENT, BIRTH, DEGREE)
VALUES(1, '张三1', '001', '1990-06-12', 'BK'),
      (2, '李四1', '002', '1992-05-10', 'BK'),
      (3, '张三2', '003', '1988-01-15', 'YJS'),
      (4, '李四2', '001', '1979-03-10', 'BK'),
      (5, '李四3', '003', '1995-08-16', 'YJS');

创建了一个名称为demo的数据库;并在库里创建了名称为T_TEACHER的教师表并向表中插入了数据

二、环境搭建

1、创建实体类

在cn.horse.demo下创建TeacherInfo实体类:

TeacherInfo类:

package cn.horse.demo;

import java.time.LocalDate;

public class TeacherInfo {
    private Integer id;
    private String name;
    private String department;
    private LocalDate birth;
    private String degree;

    public void setId(Integer id) {
        this.id = id;
    }

    public void setDepartment(String department) {
        this.department = department;
    }

    public void setDegree(String degree) {
        this.degree = degree;
    }

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("{ ");
        stringBuilder.append("id: ");
        stringBuilder.append(this.id);
        stringBuilder.append(", ");
        stringBuilder.append("name: ");
        stringBuilder.append(this.name);
        stringBuilder.append(", ");
        stringBuilder.append("department: ");
        stringBuilder.append(this.department);
        stringBuilder.append(", ");
        stringBuilder.append("birth: ");
        stringBuilder.append(this.birth);
        stringBuilder.append(", ");
        stringBuilder.append("degree: ");
        stringBuilder.append(this.degree);
        stringBuilder.append(" }");
        return stringBuilder.toString();
    }
}

2、Mapper配置文件

在resources的目录下新建TeacherInfoMapper.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.horse.demo.TeacherInfoMapper">

    <select id="findById" resultType="cn.horse.demo.TeacherInfo">
        SELECT
            ID,
            TEACHER_NAME name,
            DEPARTMENT,
            BIRTH,
            DEGREE
        FROM T_TEACHER
        WHERE ID = #{id}
    </select>

    <select id="findByQuery" parameterType="cn.horse.demo.TeacherInfoQuery" resultType="cn.horse.demo.TeacherInfo">
        SELECT
            ID,
            TEACHER_NAME name,
            DEPARTMENT,
            BIRTH,
            DEGREE
        FROM T_TEACHER
        <where>
            <if test="null != degree and '' != degree">
                AND DEGREE = #{degree}
            </if>
            <if test="null != department and '' != department">
                AND DEPARTMENT = #{department}
            </if>
        </where>
    </select>

    <update id="updateByEntity" parameterType="cn.horse.demo.TeacherInfo">
        UPDATE T_TEACHER
        <set>
            <if test="null != department and '' != department">
                DEPARTMENT = #{department},
            </if>
            <if test="null != degree and '' != degree">
                DEGREE = #{degree},
            </if>
        </set>
        WHERE ID = #{id}
    </update>
</mapper>

3、引入配置文件

在resources下新建mybatis-config.xml配置文件,并引入TeacherInfoMapper.xml配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="logImpl" value="JDK_LOGGING"/>
    </settings>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="org.gjt.mm.mysql.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&amp;useSSL=false&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="horse"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="demo/TeacherInfoMapper.xml" />
    </mappers>
</configuration>

4、会话工具类

在cn.horse.demo包下新建SqlSessionUtils工具类

package cn.horse.demo;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.InputStream;
import java.util.Objects;

public class SqlSessionUtils {

    private static final SqlSessionFactory sqlSessionFactory;
    static {
        // 读取mybatis配置文件
        InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("mybatis-config.xml");
        // 根据配置创建SqlSession工厂
        sqlSessionFactory = new SqlSessionFactoryBuilder()
                .build(inputStream);
    }

    /**
     * 开启会话
     * @return
     */
    public static SqlSession openSession() {
        return sqlSessionFactory.openSession();
    }

    /**
     * 关闭会话
     * @param sqlSession
     */
    public static void closeSession(SqlSession sqlSession) {
        if(Objects.nonNull(sqlSession)) {
            sqlSession.close();
        }
    }
}

5、JDK 日志系统配置

在resources的目录下新建logging.properties配置文件

handlers=java.util.logging.ConsoleHandler
.level=INFO

cn.horse.demo.TeacherInfoMapper.level=FINER
java.util.logging.ConsoleHandler.level=ALL
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tT.%1$tL %4$s %3$s - %5$s%6$s%n

在cn.horse.demo下新建JdkLogConfig类:

JdkLogConfig类:

package cn.horse.demo;

import java.io.IOException;
import java.io.InputStream;
import java.util.logging.LogManager;

public class JdkLogConfig {

    public JdkLogConfig() {
        try {
            InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("logging.properties");
            LogManager.getLogManager().readConfiguration(inputStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

6、启动程序

package cn.horse.demo;

import org.apache.ibatis.session.SqlSession;

import java.util.List;

public class Main {
    public static void main(String[] args) {
        // 引入JDK日志配置
        System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");

        // 查询学历为本科的教师
        TeacherInfoQuery query = new TeacherInfoQuery();
        query.setDegree("BK");
        findAll("cn.horse.demo.TeacherInfoMapper.findByQuery", query);

        // 更新编号为2的教师
        TeacherInfo teacherInfo = new TeacherInfo();
        teacherInfo.setId(2);
        teacherInfo.setDegree("BK");
        updateByEntity("cn.horse.demo.TeacherInfoMapper.updateByEntity", teacherInfo);
        // 查询编号为2的教师
        findById("cn.horse.demo.TeacherInfoMapper.findById", 2);
    }

    private static void findAll(String statement, TeacherInfoQuery query) {
        SqlSession sqlSession = null;
        try {
            sqlSession = SqlSessionUtils.openSession();
            List<TeacherInfo> teacherInfoList = sqlSession.selectList(statement, query);
            for (TeacherInfo teacherInfo: teacherInfoList) {
                System.out.println(teacherInfo);
            }
        } finally {
            SqlSessionUtils.closeSession(sqlSession);
        }
    }

    private static void updateByEntity(String statement, TeacherInfo teacherInfo) {
        SqlSession sqlSession = null;
        try {
            sqlSession = SqlSessionUtils.openSession();
            sqlSession.update(statement, teacherInfo);
            sqlSession.commit();
        } finally {
            SqlSessionUtils.closeSession(sqlSession);
        }
    }

    private static void findById(String statement, Integer id) {
        SqlSession sqlSession = null;
        try {
            sqlSession = SqlSessionUtils.openSession();
            TeacherInfo teacherInfo = sqlSession.selectOne(statement, id);
            System.out.println(teacherInfo);
        } finally {
            SqlSessionUtils.closeSession(sqlSession);
        }
    }
}

执行后的结果如下:

三、trim标签替代where标签

之前我们介绍过where标签的两个作用:

(1)判断是否存在条件,如果条件不存在,则不再拼接where;如果条件存在,则拼接where

(2)剔除where后面多余的AND或OR

下面我们给出where等效的trim标签配置:

<trim prefix="where" prefixOverrides="AND | OR">
    
</trim>

prefix属性:当trim标签中内容不为空时,则拼接prefix的属性值

prefixOverrides属性:当trim标签中的内容以AND或OR开头时,则剔除AND或OR

下面我们修改TeacherInfoMapper.xml配置文件中的findByQuery查询语句:

<select id="findByQuery" parameterType="cn.horse.demo.TeacherInfoQuery" resultType="cn.horse.demo.TeacherInfo">
    SELECT
        ID,
        TEACHER_NAME name,
        DEPARTMENT,
        BIRTH,
        DEGREE
    FROM T_TEACHER
    <trim prefix="where" prefixOverrides="AND | OR">
        <if test="null != degree and '' != degree">
            AND DEGREE = #{degree}
        </if>
        <if test="null != department and '' != department">
            AND DEPARTMENT = #{department}
        </if>
    </trim>
</select>

测试:

// 引入JDK日志配置
System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");

// 查询学历为研究生的教师
TeacherInfoQuery query = new TeacherInfoQuery();
query.setDegree("YJS");
findAll("cn.horse.demo.TeacherInfoMapper.findByQuery", query);

执行后的结果如下:

四、trim标签替代set标签

之前我们介绍过set标签可用于剔除更新语句中多余的逗号

下面我们给出set等效的trim标签配置:

<trim prefix="set" suffixOverrides=",">
    
</trim>

prefix属性:当trim标签中内容不为空时,则拼接prefix的属性值

suffixOverrides属性:当trim标签中的内容以逗号结束时,则剔除逗号

下面我们修改TeacherInfoMapper.xml配置文件中的updateByEntity查询语句:

<update id="updateByEntity" parameterType="cn.horse.demo.TeacherInfo">
    UPDATE T_TEACHER
    <trim prefix="set" suffixOverrides=",">
        <if test="null != department and '' != department">
            DEPARTMENT = #{department},
        </if>
        <if test="null != degree and '' != degree">
            DEGREE = #{degree},
        </if>
    </trim>
    WHERE ID = #{id}
</update>

测试:

// 引入JDK日志配置
System.setProperty("java.util.logging.config.class", "cn.horse.demo.JdkLogConfig");

// 更新编号为2的教师
TeacherInfo teacherInfo = new TeacherInfo();
teacherInfo.setId(2);
teacherInfo.setDegree("BK");
updateByEntity("cn.horse.demo.TeacherInfoMapper.updateByEntity", teacherInfo);
// 查询编号为2的教师
findById("cn.horse.demo.TeacherInfoMapper.findById", 2);

查询的结果如下:

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

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

相关文章

直播app源码,QUIC协议:改善性能与安全性

一、QUIC协议的定义&#xff1a; QUIC协议是由 “谷歌”提出的一种基于UDP传输层协议的新型协议&#xff0c;由于TCP协议的延迟较高、丢包重传效率较低等缺点&#xff0c;QUIC协议被开发应用出来&#xff0c;让直播app源码平台拥有更可靠、更快、更安全的数据传输&#xff0c;并…

给文章添加阅读模式纯js

今天给大家分享添加文章的阅读模式&#xff0c;让更好的体验度。 方法&#xff1a;首先建个input <input type"button" value"阅读模式" onclick"miniPic()" style"background-color:#275ecf;color:#FFFFFF;width:70px;height:20px;bo…

Python开发者必读!优化你的代码风格的7个技巧

当你编写Python代码时&#xff0c;是否曾想过如何让它更加清晰、整洁&#xff0c;并且易于阅读&#xff1f;Python的简单性是其吸引力之一&#xff0c;但这并不意味着你可以在编码时忽略代码质量。好的代码风格和结构可以让你的Python项目更容易维护&#xff0c;更少出现错误&a…

AI艺术写真头像二维码生成分销公众号小程序开源版开发

AI艺术写真头像二维码生成分销公众号小程序开源版开发 以下是AI艺术写真头像二维码生成分销公众号小程序的功能列表&#xff1a; 用户注册和登录功能&#xff1a;用户可以通过手机或邮箱注册和登录账号。 AI艺术写真头像生成功能&#xff1a;用户可以上传照片&#xff0c;通过…

芯科蓝牙BG27开发笔记5-有坑就蒙

笔记1中的蓝牙点灯是可以运行的&#xff0c;但是有时又会在连接过程中死机&#xff0c;笔记2中经过调试&#xff0c;通过屏蔽log输出的模块解决了此问题&#xff0c;问题定位到了uart。 那到底uart有什么问题&#xff1f; 在对这套工具和代码不熟悉的情况下&#xff0c;根据以…

使用阿里云轻量应用服务器安装Docker进行SpringBoot项目的部署上线

零、写在前面 项目源码&#xff1a;QiuShicheng/Qiu-blog (github.com) 项目是跟着B站up主【三更草堂】做的&#xff0c;本人最终系统是修改了一些前端代码。 (注&#xff1a;源码中前端代码未修改&#xff0c;仍是up主提供的&#xff09; 购买了一个轻量应用服务器2核2G&a…

Windows下WSL将ubuntu挪位置-系统盘清理

Windows下WSL将ubuntu挪位置-系统盘清理 Excerpt 文件夹&#xff0c;将 C 盘下对应路径的 .android 文件夹拷贝过来覆盖&#xff1b;最近 C 盘空间暴涨&#xff0c;用工具 WinDirStat。文件夹里的内容都是无用的垃圾&#xff0c;可以统统清除掉&#xff0c;找到对应的老路径修改…

​重生奇迹MU剑士技能升级攻略​

奇迹剑士技能升级技巧 游戏中剑士作为近战的代表职业&#xff0c;一直以来都是血牛职业&#xff0c;除了拥有强大的防御一级减伤能力之外&#xff0c;剑士还有着非常不错的输出能力。 如果其他职业与重生奇迹MU剑士近身战斗&#xff0c;那么完全讨不到半点便宜。虽然剑士表现…

CentOS8安装mysql-community-client错误解决

安装MySQL5.7.37的mysql-community-client-5.7.37-1.el7.x86_64.rpm时&#xff0c;提示如下&#xff1a; 提示的意思是缺少依赖软件包。 使用如下命令安装依赖包&#xff1a; yum install libncurse* 实际安装如下两个软件包。 成功后再次安装mysql-community-client-5.7.37…

2020-2022年低纬高原区典型种养殖区氮磷干湿沉降数据集

摘要 氮磷干湿沉降是指大气中氮磷通过沉降方式到达地面,进入陆地生态系统物质循环的过程,干湿沉降在环境氮磷污染输入中占据重要比例。我国是种养殖业大国,摸清源于种植业和养殖业氮磷干湿沉降负荷,对评估氮磷干湿沉降生态效应,指导环境污染治理,促进种养殖业绿色发展具有…

vim的使用介绍以及命令大全

懒羊羊感谢大家的关注和三连支持~ 目录 前言 一、vim的使用介绍 二、命令大全 1.命令模式 &#xff08;1&#xff09;复制&#xff08;配合粘贴命令p使用&#xff09; &#xff08;2&#xff09;剪切 &#xff08;3&#xff09;粘贴 &#xff08;4&#xff09;删除 …

企业可以自己建立大数据平台吗?有哪些好处?

随着企业的快速发展&#xff0c;企业累积了越来越多的数据&#xff0c;但管理巨量的大数据是一件非常难的事情&#xff0c;且很多数据没有充分发挥作用。因此不少企业在问&#xff0c;企业可以自己建立大数据平台吗&#xff1f;有哪些好处&#xff1f; 企业可以自己建立大数据…

不同场景下的JMETER设置

不同场景下的JMETER设置 1.基准测试 验证主要业务在单用户运行下的性能指标&#xff0c;为多用户并发并发和混合场景的性能分析提供基础参考。 基准测试JMETER线程组设置(在1秒内执行5个线程循环一次)&#xff1a; 2.并发测试 多用户在同一时间访问某一个模块或则应用的场景&…

为什么要选择期权?开通期权有何益处?

相较于期货&#xff0c;期权的交易方式更为灵活多样&#xff0c;对标的期货市场也有较高的要求。据了解&#xff0c;在国际成熟的期权市场上&#xff0c;流动性和价格波动性是判断期货品种是否适合开展期权交易的两大关键因素&#xff0c;下文介绍为什么要选择期权&#xff1f;…

什么气传导蓝牙耳机好?2023气传导耳机推荐

​随着科技的发展&#xff0c;耳机市场正迎来一场前所未有的变革。气传导耳机作为一种新兴的耳机类型&#xff0c;正逐渐受到消费者的关注和青睐。然而&#xff0c;面对层出不穷的气传导耳机&#xff0c;我们该如何选择&#xff1f;本文将帮助你挑选到最适合自己的气传导耳机&a…

【全国大学生IoT设计竞赛】安谋科技国赛三等奖分享:城市环境监测小车——城市守望者

本文参加极术社区和灵动微电子组织的【有奖征集】分享作品传播技术成果&#xff0c;更有奖品等你来领&#xff01;线上征集活动。 8月23到25日&#xff0c;我们参加了在南京大学举行的线下2023物联网创新设计大赛全国总决赛。由全国高等学校计算机教育研究会主办&#xff0c;湖…

Vscode 快速下载

https://vscode.cdn.azure.cn/stable/8b617bd08fd9e3fc94d14adb8d358b56e3f72314/VSCodeUserSetup-x64-1.82.0.exe https://vscode.cdn.azure.cn/------>镜像&#xff0c;将官网的下载地址复制过来&#xff0c;stable开始拼接到后面

华为云云耀云服务器L实例评测|使用宝塔面板管理服务器教学

目录 一、概述 1.1 华为云云耀云服务器L实例 1.2 BT&#xff08;宝塔&#xff09; 1.3 资源和成本规划 二、购买云耀云服务器L实例并进行相关配置 2.1 购买云耀云服务器L实例 2.2 设置服务器密码 2.3 配置安全组 2.4 设置Nginx安全级别 三、初始化宝塔面板 3.1 获取密…

网卡bond和信息查看 EDACDIMMCEError错误导致服务器重启

https://blog.csdn.net/weixin_45720992?spm1001.2101.3001.5343 EDACDIMMCEError错误导致服务器重启 现象&#xff1a; 最近几天一个华为RH2285服务器一直不定时自动重启&#xff0c;基本每天一两次&#xff0c;查看系统日志报下面的错误&#xff0c;每秒记录一条错误日志 …

单位固定资产应该怎么管理

对于单位固定资产的管理&#xff0c;更是需要我们以创新的方式&#xff0c;以科技的手段&#xff0c;以严谨的态度来对待。那么&#xff0c;单位固定资产应该如何进行有效的管理呢&#xff1f; 建立一个完善的资产管理系统  我们需要建立一个完善的资产管理系统。这个系统应…