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

动态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 {/**根据用户姓名和职业组合条件查询用户信息列表*/@Testpublic 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://xiahunao.cn/news/254899.html

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

相关文章

数组及详解冒泡排序

数组及详解冒泡排序 一维数组的创建和初始化一维数组的创建一维数组的初始化一维数组的应用一维数组在内存中的存储 二维数组的创建和初始化二维数组的创建二维数组的初始化二维数组的应用二维数组在内存中的存储 数组越界问题数组作为函数参数数组名的含义及特殊两个例子 冒泡…

chatgpt赋能python:Python中累乘的作用和用法

Python中累乘的作用和用法 在Python编程语言中&#xff0c;累乘指的是连续乘法&#xff0c;或者说是一系列数字的乘积。累乘的概念非常简单&#xff0c;但是实际上它在编程中有着广泛的应用。 累乘在Python中的实现方式 Python中&#xff0c;累乘可以通过多种方式来实现&…

25条关于人生感悟的经典句子

1.活得糊涂的人&#xff0c;容易幸福&#xff1b;活得清醒的人&#xff0c;容易烦恼。这是因为&#xff0c;清醒的人看得太真切&#xff0c;一较真&#xff0c;生活中便烦恼遍地&#xff1b;而糊涂的人&#xff0c;计较得少&#xff0c;虽然活得简单粗糙&#xff0c;却因此觅得…

佛家经典禅语语录句子

【1】&#xff1a;在天地之间觅得一方安详&#xff0c;听风雨&#xff0c;听山语&#xff0c;听禅语。 【2】&#xff1a;心是一方砚&#xff0c;不空亦不满。眼是一片天&#xff0c;不奢亦不贪。字是一盘餐&#xff0c;不腻亦不淡。深邃梅婷花向晚&#xff0c;零落幻影墨里寒。…

知足常乐--每日十问

如果你想走出常规&#xff0c;放松心情&#xff0c;以积极的的心态开始新的一天&#xff0c;那就很有必要以自问的方式开始一天&#xff0c;这些问题会给我们带来力量和好心情. 1、我拥有什么&#xff1f; 通常我们会为自己没有的东西而苦恼&#xff0c;却看不到自己拥有的&…

chatgpt赋能python:Python中的“5“+“5“:了解运算符重载和字符串拼接

Python中的 “5”“5”: 了解运算符重载和字符串拼接 Python中的运算符重载允许我们自定义类型的操作符行为。当我们使用加号运算符将两个对象相加时&#xff0c;Python会动态地确定该使用哪种类型的操作符行为。在使用字符串时&#xff0c;加号可以用于字符串的连接&#xff…

chatgpt赋能python:Python中的提取函数——数据清洗中必不可少的利器

Python中的提取函数——数据清洗中必不可少的利器 数据清洗是数据分析过程中不可或缺的一步&#xff0c;而Python中的提取函数则是数据清洗中必不可少的利器。本文将重点介绍一些Python中常用的提取函数&#xff0c;以帮助数据分析师更好地应对实际问题。 什么是提取函数&…

chatgpt赋能python:Python中的“或”语句:使用方法和示例

Python中的“或”语句&#xff1a;使用方法和示例 在Python编程中&#xff0c;“或"语句表示为"or”&#xff0c;它是逻辑运算符的一种形式。"或"语句可以用于组合两个或多个条件&#xff0c;只要其中一个条件成立&#xff0c;整个语句就会返回True。在本…

css3和h5的新特性

H5的新特性 1. 用于绘画 canvas 元素。 2. 用于媒介回放的 video 和 audio 元素。 3. 本地离线存储 localStorage 长期存储数据&#xff0c;浏览器关闭后数据不丢失&#xff1b; sessionStorage 的数据在浏览器关闭后自动删除。 4. 语意化更好的内容元素&#xf…

六、H5新特性

文章目录 一、H5的兼容二、H5新增特性2.1 语义化标签2.2 增强表单2.3 音频、视频 一、H5的兼容 支持 HTML5的浏览器包括Firefox(火狐浏览器)&#xff0c;IE9及其更高版本&#xff0c;Chrome(谷歌浏览器)&#xff0c;Safari,Opera等&#xff0c;国内的遨游浏览器&#xff0c;以…

h5简介和新特性

h5简介和新特性 语义化标签表单新增的type属性表单元素的其他属性新增的表单元素&#xff0c;datalisth5新增表单事件meter标签fieldset标签和legend标签自定义属性规范全屏接口上传图片实时预览进度条参考手册 学习资源推荐 https://blog.csdn.net/qq_42813491/article/detai…

最详细H5新特性

1. 语义化标签 &#xff08;1&#xff09;比如&#xff1a;header、conent、footer、aside、nav、section、article等语义化标签。 &#xff08;2&#xff09;语义化标签的好处&#xff1a;结构清楚&#xff0c;易于阅读&#xff0c;可维护性更高&#xff0c;有利于SEO的优化…

H5新增了哪些新特性

目录 前言 1.语义化标签 2.form表单增强 3.视频和音频 4.Canvas绘图 5.SVG绘图 6.地理位置定位&#xff08;Geolocation API &#xff09; 7.拖放API 8.Web Worker 9.Web Storage 10.Web Socket 总结 前言 本期为大家总结面试时常被问到的一个问题&#xff0c;那就…

HTML 5 的十大新特性

HTML5 十大新特性总结 一、语义标签 二、增强型表单 三、视频和音频 四、Canvas绘图 五、SVG绘图 六、拖拉API 七、WebWorker 八、WebStorage 九、WebSocket 十、地理定位 一、语义化标签 1.1 什么是语义化标签? 语义化标签既是使标签有自己的含义 1.2 语义化标签…

【靶场实战】Vulnhub - JANGOW: 1.0.1 靶标实战

靶场地址&#xff1a;https://www.vulnhub.com/entry/jangow-101,754/ 靶场IP&#xff1a;192.168.160.215 信息收集 使用Nmap对目标进行扫描 Nmap -sV -O -p- 192.168.160.215 经过漫长的等待扫描完成&#xff0c;该靶标开启了21、80两个端口&#xff0c;21端口运行服务为f…

什么样的打码网站算正规的打码网站

自动打码平台是通过计算机语言对图片图片验证码的一种识别&#xff0c;将图片验证码通过系统自动的识别出来&#xff0c;并且通过一定的途径自动输入需要填写图片验证码的框。这样的平台就成为打码平台平台。实际上就是对于图片验证码的识别破解。答题吧打码平台平台就是利用的…

自动打码神器的准确率你担心么?

现在干什么都需要验证码&#xff0c;比如注册账号、登录账号等一些日常上网操作经常要输入验证码&#xff0c;而很多网站的验证码越来越难看懂。这样对于需要批量操作的人来说真的是折磨啊&#xff0c;但是有了这款验证码自动识别软件之后&#xff0c;大家就可以轻松识别复杂的…

JAVA 实现对图片打码,打马赛克

一. 图片区域类 package com.example.demo.xxx;/*** 图片区域类* author jlm**/ public class ImageArea {int x; //指定区域左上角横坐标int y; //指定区域左上角纵坐标int width; //指定区域宽度int height; //指定区域高度public ImageArea(int x, int y, int width, int h…

基于OpenCV_C++人脸检测打码技术

人脸检测并打码的关键&#xff0c;首先需要定位人脸区域&#xff0c;再修改人脸区域像素灰度值。 一 定义马赛克函数 定义生成马赛克函数 Generate_Mosaic&#xff0c;对图形 Mat& src 做操作&#xff0c;将需要操作的块&#xff08;faces&#xff09;存入数组 vector<…

Python可以解码吗,解码打码是如何实现的

前言 咳咳&#xff0c;进来的铁汁都是抱着学习的心态进来看的吧&#xff0c;咱今天不讲解解码&#xff0c;咱来说说python如何来实现打码功能~ 这一个个进来的 都是标题党吧哈哈哈 有兴趣的可以继续看看哦 最近重温了一档综艺节目 至于叫什么 这里就不细说了 老是看着看着就…