MyBatis的动态SQL语句

news2024/11/17 21:24:48

文章目录

  • 前言
    • LocalDate
    • 数据库代码
    • po 包
  • if+where 标签 查
  • trim 标签 增
  • set 标签 改
  • foreach 标签 删


前言

提示:这里可以添加本文要记录的大概内容:

查询条件是动态的

MyBatis的动态SQL语句是指在运行时根据不同条件选择不同的SQL语句执行。
这些条件可以是参数值、条件语句、动态标签等。
动态SQL语句的编写可以有效地减少重复代码

LocalDate

在 Java 8 中,LocalDatejava.time 包中的一个类,表示一个日期(年、月、日)。为了创建一个 LocalDate 对象,需要使用 LocalDate.of() 方法,该方法接受三个参数:年、月、日。

例如:

LocalDate date = LocalDate.of(2022, 9, 1);

这将创建一个 LocalDate 对象,表示 2022 年 9 月 1 日。

在你的代码中,为了将生日传递给 Cust 对象,你需要使用 LocalDate.of() 方法来创建一个 LocalDate 对象,并将其传递给 Cust 构造函数。例如:

Cust cust = new Cust(null, "吴三", "17446541321", LocalDate.of(2008, 5, 12), 10.0);

这将创建一个 Cust 对象,并将生日设置为 2008 年 5 月 12 日。

所以,你需要注意的是,LocalDate 是一个类,而 LocalDate.of() 是用于创建 LocalDate 对象的方法。

具体使用:

LocalDate 类提供了一个静态方法 of(int year, int month, int dayOfMonth),该方法允许创建一个指定年份、月份和日期的 LocalDate 对象。

以下是使用 LocalDate.of() 方法创建 LocalDate 对象的步骤:

  1. 导入 java.time.LocalDate 类:
   import java.time.LocalDate;
  1. 使用 of() 方法创建 LocalDate 对象:
   LocalDate date = LocalDate.of(year, month, dayOfMonth);

其中 year、month 和 dayOfMonth 分别代表年份、月份和日期,是整数类型的值:

   LocalDate date = LocalDate.of(2022, 10, 1);

创建了一个 LocalDate 对象,表示 2022 年 10 月 1 日。

  1. 处理 LocalDate 对象:

    一旦创建了一个 LocalDate 对象,可以使用它来执行各种操作,例如:

    • 获取日期的年份、月份和日期:
     int year = date.getYear();
     int month = date.getMonthValue();
     int day = date.getDayOfMonth();
  • 获取星期几:
     DayOfWeek dayOfWeek = date.getDayOfWeek();
  • 进行日期计算:
     LocalDate plusDays = date.plusDays(7); // 返回一周后的日期
     LocalDate minusMonths = date.minusMonths(2); // 返回两个月前的日期
  • 比较日期:
     LocalDate otherDate = LocalDate.of(2022, 10, 2);
     boolean isBefore = date.isBefore(otherDate); // 返回 true
     boolean isAfter = date.isAfter(otherDate); // 返回 false
     boolean isEqual = date.isEqual(otherDate); // 返回 false

这些就是使用 LocalDate.of() 方法创建和处理 LocalDate 对象的步骤。

数据库代码

这里以客户表为例

CREATE TABLE cust (
   id INT PRIMARY KEY auto_increment,         # id
   name VARCHAR(50) NOT NULL,    # 姓名
   phone VARCHAR(20),      # 电话
   birthday DATE,          # 出生日期
   balance DOUBLE          # 余额
);
INSERT INTO cust (id, name, phone, birthday, balance) VALUES (1, '张三', '13611111111', '1990-01-01', 1000.00);

INSERT INTO cust (id, name, phone, birthday, balance) VALUES (2, '李四', '13722222222', '1995-02-02', 2000.00);

INSERT INTO cust (id, name, phone, birthday, balance) VALUES (3, '王五', '13833333333', '1985-03-03', 3000.00);

po 包

新建项目后完善 pom.xml 文件、mybatis 的配置文件、log4j 的日志文件

在 main/java 文件中新建包 mapper 和 po

po 包代码:这里面有个Date类型,要注意!

public class Cust {
    private Integer id;
    private String name;
    private String phone;
    private Date birthday;
    private double balance;
    // 为了模糊查询某个时间段
    private Date startTime;
    private Date endTime;
	// 自动生成 Getter、Setter、toString()、有参无参方法
}

提示:以下是本篇文章正文内容,下面案例可供参考

if+where 标签 查

if+where语句可以根据条件动态构建where子句,以过滤查询结果。

在 mapper 包内新建接口文件和与之同名的映射文件
映射文件中的namespace必须是接口的限定名

先写接口文件:
在模糊查询功能中,输入 id 按照 id 查询,输入名字按照名字查询,输入手机号按照手机号查询,所以返回值是多个,查询多个用List

public interface CustMapper {
	List<Cust> queryCusts(Cust cust);
}

复制方法名回到映射文件粘贴到 id

下面模糊查询某个时间段的映射文件代码:

<mapper namespace="com.mybatis.mapper.CustMapper">
    <!-- 动态的where条件 -->
    <select id="queryCusts" parameterType="Cust" resultType="Cust">
        select * from cust
        <where>
            <if test="startTime != null">
                and birthday &gt;=#{startTime}
            </if>
            <if test="endTime != null">
                and birthday &lt;=#{endTime}
            </if>
        </where>
    </select>
</mapper>

以上代码中,映射文件中的 select 语句使用了动态的 where 条件,其中的 if 标签用于判断 startTime 和 endTime 是否为 null,若不为 null,则生成相应的SQL语句。
若输入了 startTime,则添加一个条件为 birthday>=startTime 的 where 子句;
若输入了 endTime,则添加一个条件为 birthday<=endTime 的 where 子句。

测试代码(模糊查询某个时间段):

    @Test
    public void where() throws Exception {
        CustMapper mapper = session.getMapper(CustMapper.class);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date startTime = sdf.parse("1990-01-01");
        Date endTime = sdf.parse("1999-12-31");
        Cust cust = new Cust();
        cust.setStartTime(startTime);
        cust.setEndTime(endTime);
        mapper.queryCusts(cust);
    }

在测试代码中,将 startTime 和 endTime 分别解析成日期格式,并通过set方法设置到Cust 对象中,作为参数传递给 queryCusts 方法进行查询。
在这里插入图片描述
如果是模糊查询 id、姓名、手机号:
映射文件代码:

<mapper namespace="com.mybatis.mapper.CustMapper">
    <!-- 动态的where条件 -->
    <select id="queryCusts" parameterType="Cust" resultType="Cust">
        select * from cust
        <where>
            <if test="id != null">
                and id = #{id}
            </if>
            <!-- 类型是String,也不能等于空 -->
            <if test="name != null and name != '' ">
                and name like concat('%',#{name},'%')
            </if>

            <if test="phone != null and phone != '' ">
                and phone like concat('%',#{phone},'%')
            </if> 
        </where>
    </select>
</mapper>

测试代码(模糊查询 id、姓名、手机号):

	@Test 
	public void where() {
		CustMapper mapper = session.getMapper(CustMapper.class);
		Cust cust = new Cust(null, "三", null,null,1000.0);
		mapper.queryCusts(cust);
	}

在测试代码中创建了一个Cust 对象,只设置了 name 属性值为"三",然后调用queryCusts 方法进行查询。因为 id 和 phone 属性值为null,所以查询条件中只会有name 相关的查询语句。此时,查询结果会返回所有名字包含"三"的记录。

需要注意的是,测试代码中设置的name值必须是一个非空字符串才会被加入到查询条件中。如果 name 属性值为 null 或空字符串,那么查询条件中不会包含对 name 的筛选。

查询结果:
在这里插入图片描述

trim 标签 增

Trim语句:可以包装一组语句,去除多余的空格或逗号;

mapper接口的代码:

void insertCust(Cust cust);

在映射文件增加对应的语句:
增加客户信息

<insert id="insertCust" parameterType="Cust" useGeneratedKeys="true" keyProperty="id">
  insert into cust
  <trim prefix="(" suffix=")" suffixOverrides=",">
    id, name,
    <if test="phone != null and phone != '' ">
      phone,
    </if>
    <if test="birthday != null">
      birthday,
    </if>
    <if test="balance != null">
      balance,
    </if>
  </trim>
  <trim prefix="values(" suffix=")" suffixOverrides=",">
    #{id}, #{name},
    <if test="phone != null and phone != '' ">
      #{phone},
    </if>
    <if test="birthday != null">
      #{birthday},
    </if>
    <if test="balance != null">
      #{balance},
    </if>
  </trim>
</insert>

接下来是测试:【注意: LocalDate】当然前面的类型也要改

	@Test
	public void trim() {
		CustMapper mapper = session.getMapper(CustMapper.class);
		Cust cust = new Cust(null, "吴三", "17446541321", LocalDate.of(1998, 6, 12), 10.0);
		mapper.insertCust(cust);
	}

在这里插入图片描述

set 标签 改

set语句:可用于构建UPDATE语句的SET子句;

mapper接口的代码:

void updateCust(Cust cust);

在对应的映射文件中:

根据 id 更改名字 和 电话号码

    <update id="updateCust" parameterType="Cust">
        update cust
        <set>
            <if test="name != null and name != '' ">
                name = #{name},
            </if>
            <if test="phone != null and phone != '' ">
                phone = #{phone},
            </if>
        </set>
        where id = #{id}
    </update>

测试类代码:

	@Test
	public void set() {
		CustMapper mapper = session.getMapper(CustMapper.class);
		Cust cust = new Cust(10, "刘兆儿", "1459745610",null,1000.0);
		mapper.updateCust(cust);
	}

控制台:
在这里插入图片描述

foreach 标签 删

Foreach语句:用于遍历集合或数组,可以重复执行SQL语句;

可能要删多个数据,可以用数组(array)或 集合(list)

mapper接口的代码:

    void deleteCusts(int[] ids);

在对应的映射文件中:

    <delete id="deleteCusts" parameterType="int">
        delete from cust where id in
        <foreach collection="array" item="no" open="(" close=")" separator=",">
            #{no}
        </foreach>
    </delete>

测试类代码:

	@Test
	public void foreach() {
		CustMapper mapper = session.getMapper(CustMapper.class);
						// id
		int [] nos = {1,2,3,4,5};
		mapper.deleteCusts(nos);
	}

在这里插入图片描述

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

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

相关文章

华为OD机试真题 Java 实现【阿里巴巴找黄金宝箱(IV)】【2023 B卷 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 七、复杂度分析1、时间复杂度2、空间复杂度 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAV…

CAD随机球体颗粒过渡区3D插件

插件介绍 CAD随机球体颗粒&过渡区3D插件可用于在AutoCAD软件内生成随机分布的球体及球体外侧过渡区部件&#xff0c;适用于科研绘图、有限元建模如混凝土细观、颗粒增强复合材料、随机三维骨料及过渡区等方面的应用。 插件可指定的参数有模型的长、宽、高&#xff1b;球…

批处理文件的@echo off是什么意思?

echo off 关闭回显 echo on 打开回显 echo off并不是DOS程序中的&#xff0c; 而是DOS批处理中的。 当年的DOS&#xff0c;所有操作都用键盘命令来完成&#xff0c; 当你每次都要输入相同的命令时&#xff0c; 可以把这么多命令存为一个批处理&#xff0c; 从此以后&#xff…

MybatisPlus的QueryWrapper方法解释

QueryWrapper继承AbstractLambdaWrapper 继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件以及 LambdaQueryWrapper, 可以通过 new QueryWrapper().lambda() 方法获取. 一些用法 常规 queryWrapper.lt&#xff08;&#xff09;——小于queryWrapper.le…

揭开接口自动化测试的神秘面纱,从入门到高级实战

接口测试背景和必要性 接口测试是测试系统组件间接口&#xff08;API&#xff09;的一种测试&#xff0c;主要用于检测内部与外部系统、内部子系统之间的交互质量&#xff0c;其测试重点是检查数据交换、传递的准确性&#xff0c;控制和交互管理过程&#xff0c;以及系统间相互…

vue3引用Font-Awesome字体图标库

环境&#xff1a;vue3tsviteelement plus 介绍&#xff1a;这里安装引用的是Font-Awesome 6.x 版本&#xff0c;有专业版&#xff08;付费&#xff09;&#xff0c;这里只介绍免费版字体使用方法 一、安装 1.使用npm安装&#xff0c;终端打开项目目录或者命令行cd到目录文件夹…

QMessageBox、QColorDialog、按钮汉化显示

QMessageBox、QColorDialog、按钮汉化显示 版本&#xff1a;Qt5.9.9 环境&#xff1a;QtCretator MinGW 在Qt源码目录下找到qt_zh_CN.ts复制一份到工程目录&#xff0c;该文件在&#xff1a;G:\install\Qt\Qt5.9.9\5.9.9\Src\qttranslations\translations。 打开qt_zh_CN.ts文…

【C#学习笔记】引用类型(1)

文章目录 引用类型class匿名类 记录引用相等和值相等record声明 接口delegate 委托合并委托/多路广播委托 引用类型 引用类型的变量存储对其数据&#xff08;对象&#xff09;的引用&#xff0c;而值类型的变量直接包含其数据。 对于引用类型&#xff0c;两种变量可引用同一对…

【分布式任务调度平台 XXL-JOB 急速入门】从零开始将 XXL-JOB 接入到自己的项目

&#x1f4a7; 分布式任务调度平台 X X L − J O B 急速入门&#xff1a;从零开始将 X X L − J O B 接入到自己的项目 \color{#FF1493}{分布式任务调度平台 XXL-JOB 急速入门&#xff1a;从零开始将 XXL-JOB 接入到自己的项目} 分布式任务调度平台XXL−JOB急速入门&#xff1a…

在.net 6.0中 调用远程服务器web服务,Webservices(xxx.asmx) ,RESTful 风格,2种解决方案。

1.使用 Connected Services&#xff1a; 右键单击您的项目&#xff0c;选择 "Add"&#xff08;添加&#xff09;-> "Connected Services"&#xff08;已连接的服务&#xff09;。 在 "Connected Services" 对话框中&#xff0c;选择 "W…

如何用 Apache DolphinScheduler 实现自动配置自定义变量?

作者 | sqlboy-yuzhenc 背景介绍 在实际工作应用中&#xff0c;我们可能需要在整个 Apache DolphinScheduler 层面定义共用的日期变量&#xff0c;但是&#xff0c;开源版 Apache DolphinScheduler 只允许配置工作流级别的全局变量&#xff0c;这样&#xff0c;每个工作流就得…

机器学习笔记之优化算法(九)收敛速度的简单认识

机器学习笔记之优化算法——收敛速度的简单认识 引言收敛速度的判别标准 Q \mathcal Q Q-收敛速度 R \mathcal R R-收敛速度关于算法复杂度与收敛速度 引言 本节对收敛速度简单介绍。 收敛速度的判别标准 我们之前几节介绍了线搜索方法 ( Line Search Method ) (\text{Line …

无人驾驶实战-第四课(动态环境感知与2D检测算法)

无人驾驶中的检测框架 2D目标检测的思路 位置&#xff1a;先找到所有的ROI (Region of Interest, bounding box may containing object)类别&#xff1a;对每一个ROI做分类获取类别信息 位置修正&#xff1a;Bounding box Regression 找寻ROI的方法 1.滑窗法。从左到右&#xf…

Ansys Zemax | 大功率激光系统的 STOP 分析 (三)

大功率激光器广泛用于各种领域当中&#xff0c;例如激光切割、焊接、钻孔等应用中。由于镜头材料的体吸收或表面膜层带来的吸收效应&#xff0c;将导致在光学系统中由于激光能量吸收所产生的影响也显而易见&#xff0c;大功率激光器系统带来的激光能量加热会降低此类光学系统的…

Java中的内存划分,一个数组的内存图,两个数组的内存图,两个引用指向同一个数组的内存图

1、Java中的内存划分 Java的内存需要分成5个部分&#xff1a; 栈&#xff08;Stack&#xff09; 存放的都是 方法 中的 局部变量 。方法的运行一定要在栈当中运行。 局部变量&#xff1a;方法的参数&#xff0c;或者是方法{}内部的变量 作用域&#xff1a;一旦超出作用域&#…

ubuntu调整路由顺序

Ubuntu系统跳转路由顺序 1、安装ifmetric sudo apt install ifmetric2、查看路由 route -n3、把Iface下面的eth1调到第一位 sudo ifmetric eth1 0命令中eth1是网卡的名称&#xff0c;更改网卡eth1的跃点数&#xff08;metric值&#xff09;为0&#xff08;数值越小&#xf…

存放数据的方式:Java集合框架

文章目录 1. 目前存放数据的方式2. Java集合框架3. Collection接口常用方法解析public boolean add(E e)public void clear()public boolean remove(E e)public boolean contains(E e)public boolean isEmpty()public int size()public Object[] toArray() 4. 迭代器5. 增强for…

从零基础开始开发自己的第一个微信小程序

文章目录 内容介绍小程序开发步骤注册微信小程序账号下载开发工具搭建开发环境创建工程编写代码手机上查看效果 工程里的文件作用介绍总结 内容介绍 通过本篇blog&#xff0c;你可以熟悉从零开始&#xff0c;搭建小程序开发环境&#xff0c;并运行起自己的第一个小程序。 小程…

Stability AI旗舰图像模型 SDXL1.0发布,AI绘画进入新的时代

Stability AI于7月26号开源了SDXL1.0文生图模型&#xff0c;要知道距离SDXL0.9开源发布也不过一个月,只能说AI发展日新月异。 根据官网介绍&#xff0c;SDXL1.0经过迭代更新&#xff0c;已经是目前世界上最好的图像生成模型 官网根据Discord上的几代实验模型和外部测试&#…

股票量价关系分析

量增价平 量增价平是指成交量增加&#xff0c;股价保持相对平稳的量价关系模型&#xff0c;量的增加可以是资金大量流入引起&#xff0c;也可以是资金大量流出引起&#xff0c;因此这种关系模型需要根据股价所处的位置来具体分析。1、股价处于低位 当股价处于低位&#xff0c;此…