【Spring】— 动态SQL :<if>元素

news2024/11/20 18:30:55

动态SQL :元素

在MyBatis中,<if>元素是常用的判断语句,主要用于实现某些简单的条件选择。在实际应用中,我们可能会通过多个条件来精确地查询某个数据。

【示例8-1】下面通过一个具体的案例来演示元素的使用。

(1)创建一个名为chapter08的Web项目。

(2)将之前chapter06项目中的JAR包和src目录下的文件复制到chapter08中。

(3)将配置文件中的数据库信息修改为外部引用的形式,即在项目的src目录下创建一个名称为db.properties的配置文件,编辑代码,如下所示。

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_mybatis
jdbc.username=root
jdbc.password=root

然后在MyBatis配置文件mybatis-config.xml中配置<properties/>属性,并修改配置文件中数据库连接的信息,修改完成后mybatis-config.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--    1.配置环境,默认的环境 id 为 mysql-->
    <environments default="mysql">
<!--        1.2 配置id为mysql 的数据库环境-->
        <environment id="mysql">
<!--            使用JDBC的事务管理-->
            <transactionManager type="JDBC" />
<!--            数据库连接池-->
            <dataSource type="POOLED">
<!--                数据库驱动-->
                <property name="driver" value="com.mysql.jdbc.Driver" />
<!--                连接数据库的url-->
                <property name="url" value="jdbc:mysql://localhost:3306/db_mybatis" />
<!--                连接数据库的用户名-->
                <property name="username" value="root" />
<!--                连接数据库的用户名-->
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>
<!--2.配置 Mapper的位置-->
    <mappers>
        <mapper resource="UserMapper.xml" />
    </mappers>
</configuration>

(4)创建一个com.ssm.util包,在该包下创建工具类MybatisUtil,在其中定义获取SqlSession的方法getSession(),如下所示。

package com.ssm.util;

import java.io.IOException;
import java.io.Reader;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

/**
 * 功能描述
 *
 * @author: 衍生星球
 * @date: 2023年05月29日 15:32
 */

public class MybatisUtil {
    private static SqlSessionFactory sqlSessionFactory=null;
        static {
            try {
                String resource = "mybatis-config.xml";
                InputStream inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 获取SqlSession的方法
    public static SqlSession getSession() {
            return sqlSessionFactory.openSession();

    }
}

(5)修改映射文件UserMapper.xml,在映射文件中使用<if>元素编写根据用户姓名(username)和职业(jobs)组合条件查询用户信息列表的动态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="com.ssm.mapper.UserMapper">
<!--<if>元素使用-->
    <select id="findUserByNameAndJobs" parameterType="com.ssm.po.User" resultType="com.ssm.po.User">
        select * from t_user where 1=1
    <if test="username !=null and username !=''">
        and username like concat('%', #{username},'%')
    </if>
    <if test="jobs !=null and jobs !=''">
        and jobs = #{jobs}
    </if>
    </select>
</mapper>

使用<if>元素的test属性分别对username和jobs进行了非空判断(test属性多用于条件判断语句中,用于判断真假,大部分的场景中都是进行非空判断的,有时也需要判断字符串、数字和枚举等),如果传入的查询条件非空,就进行动态SQL组装。

(6)在测试类MybatisTest中,编写测试方法findUserByNameAndJobsTest(),如下所示。


public class MybatisTest {
    /*
        *根据用户姓名和职业组合条件查询用户信息列表
     */
    @Test
    public void findUserByNameAndJobsTest() throws Exception {
        //通过工具类生成SqlSession对象
        SqlSession sqlSession = MybatisUtil.getSession();
        //创建User对象,封装需要组合查询的条件
        User user = new User();
        user.setUsername("zhangsan");
        user.setJobs("teacher");
        //执行SqlSession的查询办法,返回结果集
        List<User> users =
        sqlSession.selectList("com.ssm.mapper.UserMapper.findUserByNameAndJobsTest",user);
        //输出查询结果
        for (User u :users) {
            System.out.println((u.toString()));
        }
        sqlSession.close();
    }
   }

findUserByNameAndJobsTest()方法中,首先通过MybatisUtils工具类获取了SqlSession对象,然后使用User对象封装了用户名为zhangsan且职业为teacher的查询条件,并通过SqlSession对象的selectList()方法执行多条件组合的查询操作。最后,程序执行完毕时关闭了SqlSession对象。执行findUserByNameAndJobsTest()方法后,控制台的输出结果如图所示。

在这里插入图片描述

将封装到User对象中的zhangsan和teacher两行代码注释掉,然后再次执行findUserByNameAndJobsTest()方法,控制台的输出结果如图所示。

在这里插入图片描述

当未传递任何参数时,会将数据表中的所有数据查出来。这就是<if>元素的使用。

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

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

相关文章

Scala基本语法

1.注释 Scala注释使用和Java完全一样。 注释是一个程序员必须要具有的良好编程习惯。 将自己的思想通过注释先整理出来&#xff0c;再用代码去体现。 基本语法 单行注释&#xff1a;// 多行注释&#xff1a;/* */ 文档注释&#xff1a; /** * */ 2.变量和常量 基本语法 va…

【C++入门】auto关键字 与 基于范围的for循环(C++11)

目录 引言 类型别名的思考 一、概念 二、使用细则 1.auto与指针和引用结合起来使用 2.在同一行定义多个变量 三、auto不适用的场景 基于范围的for循环&#xff08;C11&#xff09; 一、范围for的语法 二、使用条件 1.for循环迭代的范围必须是确定的 2.迭代的对象要实现…

C++ map类成员介绍 (map与multimap)

目录 &#x1f914;map模板介绍&#xff1a; &#x1f914;特点&#xff1a; &#x1f914;map容器与哈希表&#xff1a; &#x1f914;map的成员函数&#xff1a; &#x1f642;map构造函数&#xff1a; 代码示例&#xff1a; 运行结果&#xff1a; &#x1f642;map赋…

chatgpt赋能python:Python中未被定义的SEO

Python中未被定义的SEO 介绍 Python是一种广泛使用的高级编程语言。它被广泛应用于Web开发、游戏开发、数据科学、机器学习等领域。虽然Python已经成为许多企业的首选语言之一&#xff0c;但是有一些Python特有的SEO问题仍然没有被完全解决。Python中未被定义的SEO问题会导致…

C++ 常用算数生成算法

&#x1f914;常用算数生成算法&#xff1a; 该算法函数需要调用<numeric>头文件 1.accumulate 计算总和 在 C STL 中&#xff0c;accumulate() 是一种常用的算法&#xff0c;用于计算指定范围内的元素之和。 accumulate() 的函数原型为&#xff1a; template<c…

CAPL(vTESTStudio) - CAPL、CANoe、Panel联动

目录 一、变量设置 ① dbc文件中的Environment variables变量

【C++入门】什么是内联函数?

目录 一、概念 为什么要有内联函数&#xff1f; 内联函数设计的初衷是为了替代部分 #define 宏定义 二、特性 1.空间换时间 2.编译器做主 3.声明定义放一起 总结 一、概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用函数的地方展开&#xff0c;没有…

C++ 拷贝替换算法

&#x1f914;拷贝替换算法&#xff1a; &#x1f642;1.copy 拷贝 在 C STL 中&#xff0c;copy()是一种常用的算法&#xff0c;用于将一个指定范围内的元素复制到目标位置中&#xff0c;不会改变原有序列的大小。 copy()的函数原型为&#xff1a; template<class Inp…

深度剖析 Vue.js 经典知识点之:SPA、SSR与MVVM

SPA 更多精彩内容&#xff0c;请微信搜索“前端爱好者“&#xff0c; 戳我 查看 。‘ 谈一谈你对 SPA 单⻚面的理解&#xff0c;它的优缺点分别是什么 SPA&#xff08; single-page application &#xff09;仅在 Web ⻚面初始化时加载相应的 HTML、JavaScript 和 CSS。 一旦…

如何创建springboot项目

SpringBoot 优点 可快速构建spring应用直接嵌入tomcat、jetty、undenrtow服务器&#xff08;无须部署war文件&#xff09;提供依赖启动器&#xff08;starter&#xff09;简化构建配置极大程度的自动化配置Spring和第三方库提供生产就绪功能&#xff0c;例如指标监控检测、外部…

讯飞星火认知大模型与ChatGPT的对比分析

引言&#xff1a; 人工智能是当今科技领域的热门话题&#xff0c;自然语言处理是人工智能的重要分支。自然语言处理的目标是让计算机能够理解和生成自然语言&#xff0c;实现人机交互和智能服务。近年来&#xff0c;随着深度学习的发展&#xff0c;自然语言处理领域出现了许多创…

桶排序 — 计数排序和基数排序

计数排序 int类型数组&#xff0c;其中存的是员工的年龄。比如说16 - 150。对于这样的数据来讲&#xff0c;数据状况是受限的。此时如果将数组从小到大进行排序&#xff0c;该如果实现&#xff1f; 这个实现很简单&#xff0c;实现一个统计数组范围从 0 ~ 150&#xff0c;遍历原…

UNIX网络编程卷一 学习笔记 第十七章 ioctl操作

ioctl函数传统上一直作为那些不适合归入现有已定义类别的特性的系统接口。POSIX正在通过创建特定的包装函数来代替ioctl函数的某些功能&#xff0c;以取而代之的是那些已被POSIX标准化的函数。例如&#xff0c;Unix终端接口传统上使用ioctl函数访问&#xff0c;而POSIX为终端创…

在idea中创建一个SpringBoot模块

方式一&#xff1a;自动创建&#xff08;需要联网&#xff09; 第一步&#xff1a;新建模块 按住ctrlshiftalts&#xff0c;打开项目结构&#xff0c;选择新建模块&#xff1b; 第二步&#xff1a;选择Spring Web &#xff08;1&#xff09;选择SpringBoot版本&#xff0c…

WebrtcNode, publish-sdp offer 流程(1)

1. AmqpClient - New message received sdp offer 的消息 AmqpClient - RpcServer New message received {method: onTransportSignaling,args: [aa230ce0863e42baa8bae5c14e91e809,{sdp: v0\r\n o- 2367615733001925388 2 IN IP4 127.0.0.1\r\n s-\r\n t0 0\r\n agroup:BUND…

quickstart Guide快速入门

本文档参考backtrader官方文档&#xff0c;是官方文档的完整中文翻译&#xff0c;可作为backtrader中文教程、backtrader中文参考手册、backtrader中文开发手册、backtrader入门资料使用。 快速入门章节目录 快速入门使用平台从0到100&#xff1a;一步一步的演示基本设置设置现…

C++ set类成员函数介绍 (set和multiset)

目录 &#x1f914;set模板介绍&#xff1a; &#x1f914;特点&#xff1a; &#x1f914;set的成员函数&#xff1a; &#x1f60a;set构造函数&#xff1a; &#x1f50d;代码实例&#xff1a; &#x1f50d;运行结果&#xff1a; &#x1f60a; set赋值函数&#xf…

IMX6ULL裸机篇之I2C相关寄存器

一. I2C实验 I2C时钟选择与传输速率 1. IMX6ULL的 I2C频率标准模式 100kbit/S&#xff0c;快速模式为 400Kbit/S 2. 时钟源选择 perclk_clk_rootipg_clk_root66MHz&#xff08;由之前的时钟实验章节可以知道是 66MHz&#xff09;。 二. I2C 寄存器配置 I2Cx_IFDR寄存器&…

《计算机组成原理》唐朔飞 第5章 输入输出系统 - 学习笔记

写在前面的话&#xff1a;此系列文章为笔者学习计算机组成原理时的个人笔记&#xff0c;分享出来与大家学习交流。使用教材为唐朔飞第3版&#xff0c;笔记目录大体与教材相同。 网课 计算机组成原理&#xff08;哈工大刘宏伟&#xff09;135讲&#xff08;全&#xff09;高清_…

chatgpt赋能python:Python中用什么表示空值?

Python中用什么表示空值&#xff1f; 在Python编程中&#xff0c;我们经常会遇到处理空值的场景。空值通常表示缺失的或未定义的值&#xff0c;这在数据处理和分析中尤其常见。那么&#xff0c;在Python中&#xff0c;究竟用什么来表示空值呢&#xff1f; None 在Python中&a…