JavaWeb学习笔记(动态SQL)_ジ時光不老的博客-程序员秘密

技术标签: 学习  Javaweb学习  

动态SQL中的元素

动态SQL消除了之前版本需要了解的大多数元素,使用不道原来一半的元素就能完成所需的工作。
MyBatis动态SQL中的主要元素

元素 说明
< if> 判断语句,用于单条件分支判断
< choose>(< when>、< otherwise>) 相当于Java中的switch…case…default语句,用于多条件分支判断
< where>、< tirm>、< set> 辅助元素,用于处理一些SQL拼装、特殊字符问题
< foreach> 循环语句,常用于int语句等列举条件中。
< bind> 从OGNL表达式中创建一个变量,并将其绑定到上下文,常用于模糊查询的sql中

< if>元素

< if>是MyBatis中最常用的元素,类似于Java中的if语句,主要用于实现某些简单的条件选择。
示例
(1)创建一个名为dongtaisql的Web项目,将之前mybatis项目中的src导入到其中
(2)创建一个com.itheima.utils包,创建一个MyBatisUtils工具类。

package com.itheima.utils;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.*;
public class MybatisUtils {
	private static SqlSessionFactory sqlSessionFactory=null;
	static{
		try{
			Reader reader=Resources.getResourceAsReader("mybatis-config.xml");
			sqlSessionFactory=new SqlSessionFactoryBuilder().build(reader);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	public static SqlSession getSession(){
		return sqlSessionFactory.openSession();
	}
}

(3)修改映射文件CustomerMapper.xml在映射文件中使用< if>元素编写根据客户姓名和职业组合条件查询客户信息列表的SQL

<select id="findCustomerByNameAndJobs"
	parameterType="com.itheima.po.Customer" resultType="com.itheima.po.Customer">
	select *from t_customer 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>

(4)在测试类MyBatisTest中,编写测试方法。

@Test
	public void findCustomerByNameAndJobsTest(){
		SqlSession session=MybatisUtils.getSession();
		Customer customer=new Customer();
		customer.setuserName("jack");
		customer.setJobs("teacher");
		List <Customer> customers=session.selectList("com.itheima.mapper"+".CustomerMapper.findCustomerByNameAndJobs",customer);
		for(Customer customer2:customers){
			System.out.println(customer2);
		}
		session.close();
	}

在这里插入图片描述
如果将封装到Customer对象中的javk和两行代码注释掉
在这里插入图片描述

< choose>、< when>、< otherwise>元素

在使用< if>元素时,只要test属性中的表达式为true,就会执行元素中的条件语句,但在实际中有时字需要从多个选项中选择一个去执行。
示例:
“当客户名称不为空,只根据客户名称进行客户筛选;当客户名称为空,而客户职业不为空,则只要根据用户职业进行客户筛选,当客户名称和客户职业都为空,则要求查询出所有电话不为空的客户信息。”
(1)在映射文件CustomerMapper.ml中使用< choose>、< when>、< otherwise>元素执行上述情况的动态SQL代码

<select id="findCustomerByNameOrJobs" parameterType="com.itheima.po.Customer" resultType="com.itheima.po.Customer">
	select *from t_customer where 1=1
	<choose>
		<when test="username !=null and username!=''">
			and username like concat('%',#{username},'%')
		</when>
		<when test="jobs !=null and jobs!=''">
			and jobs =#{jobs}
		</when>
		<otherwise>
			and phone is not null
		</otherwise>
	</choose>
	</select>

(2)在测试类中添加测试方法

	@Test
	public void findCustomerByNameOrJobsTest(){
		SqlSession session=MybatisUtils.getSession();
		Customer customer=new Customer();
		customer.setuserName("jack");
		customer.setJobs("teacher");
		List <Customer> customers=session.selectList("com.itheima.mapper"+".CustomerMapper.findCustomerByNameOrJobs",customer);
		for(Customer customer2:customers){
			System.out.println(customer2);
		}
		session.close();
	}

在这里插入图片描述

(3)注释掉customer.setuserName(“jack”);
在这里插入图片描述
(4)注释掉customer.setJobs(“teacher”);
在这里插入图片描述

< where>、< tirm>元素

上述两个示例都用到了where 1=1,我们可以将其的1=1去掉,MyBatis提供了< where>元素。< where>会自动判断组合条件下拼装的SQL语句,只有< where>元素内条件成立是,才会拼接SQL中加入where关键字,否则将不会添加,即使where后面有多余的"AND"或"OR",< where>元素也会自动将他们去除。
上上<select id=“findCustomerByNameAndJobs”

<select id="findCustomerByNameAndJobs"
	parameterType="com.itheima.po.Customer" resultType="com.itheima.po.Customer">
	select *from t_customer 
	<where>
	<if test="username!=null and username !=''">
		and username like concat('%',#{username},'%')
	</if>
	<if test="jobs!=null and jobs !=''">
		and jobs=#{jobs}
	</if>
	<where>
	</select>

除了使用< where>元素,我们还可以使用< tirm>元素来定制需要的功能,上述代码可以修改为:

<select id="findCustomerByNameAndJobs"
	parameterType="com.itheima.po.Customer" resultType="com.itheima.po.Customer">
	select *from t_customer 
	<tirm prefix="where" prefixOverrides="and">
	<if test="username!=null and username !=''">
		and username like concat('%',#{username},'%')
	</if>
	<if test="jobs!=null and jobs !=''">
		and jobs=#{jobs}
	</if>
	</tirm>
	</select>

< tirm>的作用是去除一些特殊字符串,其中prefix表示语句的前缀,而prefixOverride属性代表的是需要去除的那些特殊字符串。

< set>元素

如果想要更新一个对象,就需要发送所有的字段给持久化对象,实际应用中只是更新某一个字段或几个字段,执行效率非常的差,< set>方法可以让程序只更新需要更新的字段。
示例:
(1)修改CustomerMapper.xml,

<update id="updateCustomer" parameterType="com.itheima.po.Customer">
		update t_customer 
		<set>
			<if test="username !=null and username !=''">
				username=#{username},
			</if>
			<if test="jobs !=null and jobs !=''">
				jobs=#{jobs},
			</if>
			<if test="phone !=null and phone !=''">
				phone =#{phone},
			</if>
		</set>
		where id=#{id}
	</update>

(2)在测试类中编写测试方法

	@Test
	public void updateCustmoerTest() throws IOException{
		String resource="mybatis-config.xml";
		InputStream inputStream=Resources.getResourceAsStream(resource);
		SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
		SqlSession sqlSession=sqlSessionFactory.openSession();
		Customer customer=new Customer();
		customer.setId(3);
		customer.setPhone("13311111234");
		int rows=sqlSession.update("com.itheima.mapper"+".CustomerMapper.updateCustomer",customer);
		if(rows>0){
			System.out.println("你成功修改了"+rows+"条数据");
		}
		else{
			System.out.println("执行修改操作失败");
		}
		sqlSession.commit();
		sqlSession.close();
	}

在这里插入图片描述
在这里插入图片描述

< foreach>元素

< foreach>元素提供了一种用于数组和集合循环遍历的方式。
< foreach>元素通常在构建IN条件语句时使用,使用方式如下:

<select id="findCustomerByIds" parameterType="List" resultType="com.itheima.po.Customer">
		select *from t_customer where id in
		<foreach item="id" index="index" collection="list"
	 				open="(" separator="," close=")">
	 					#{id}
	 	</foreach>
	</select>

< foreach>有几种属性
1.item:配置循环中当前的元素
2.index:配置的是当前元素在集合位置的下标
3.collection:配置list是传递过来的参数类型,可以是一个array、list等
4.open和close:配置的是以什么符号将这些集合元素包装起来
5.separator:配置各个元素的间隔符
在测试类中添加测试方法

	@Test
	public void findCustomerByIdTest(){
		SqlSession session=MybatisUtils.getSession();
		List<Integer> ids=new ArrayList<Integer>();
		ids.add(1);
		ids.add(2);
		List <Customer> customers=session.selectList("com.itheima.mapper"+".CustomerMapper.findCustomerByIds",ids);
		for(Customer customer:customers){
			System.out.println(customer);
		}
		session.close();
	}

在这里插入图片描述

< bind>元素

< bind>元素常用来进行模糊查询,MyBatis的< bind>元素可以通过OGNL表达式来创建一个上下文变量,使用方法如下:

</select>
	<select id="findCustomerByNames" parameterType="com.itheima.po.Customer" resultType="com.itheima.po.Customer">
		<bind name="pattern_username" value="'%'+_parameter.getUsername()+'%'"/>
		select *from t_customer
		where username like #{pattern_username}
	</select>

其中有几个属性< value>属性就是拼接的查询字符串,其中_parameter.getUsername()表示传递进来的参数。
编写测类

	@Test
	public void findCustomerByNameTest(){
		SqlSession session=MybatisUtils.getSession();
		Customer customer=new Customer();
		customer.setuserName("j");
		List <Customer> customers=session.selectList("com.itheima.mapper"+".CustomerMapper.findCustomerByNames",customer);
		for(Customer customer2:customers){
			System.out.println(customer2);
		}
		session.close();
	}

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_50834939/article/details/123689360

智能推荐

自己写一个ROS程序_穿着帆布鞋也能走猫步的博客-程序员秘密

ROS版本: kinetic Linux版本:Ubuntu 15.10 在开始第一个ROS(Robot Operating System)程序之前,确保已经按照官方教程(点击打开链接)成功安装了ROS。本文建立的是一个非常简单的发布(Publisher)、订阅(Subscriber)程序。1 创建一个工作区(workspace) $ mkdir -p ~/catkin_ws/src

前端部署项目工具 bgwd-deploy 简单方便, 不瞧瞧?_波哥无敌的博客-程序员秘密

前端部署项目工具 bgwd-deploy 简单方便, 不瞧瞧?bgwd-deploy第一步第二步第三步bgwd-deploy一个简单方便的前端自动部署工具说到部署很多人想到 Jenkins docker 等, 但学习使用成本 可能让很多人望而却步.倒不如试试我这个? 三步曲项目github 地址npm 地址项目代码讲解第一步npm i bgwd-deploy -D第二步在你项目 package.json 文件 scripts 脚本下加上下面一行(比较粗暴,有更好的方法望不吝赐教)

sed用法总结_weixin_34245169的博客-程序员秘密

目录:    ★ 命令行参数简介    ★ 首先假设我们有这样一个文本文件 sedtest.txt    ★ 输出指定范围的行 p    ★ 在每一行前面增加一个制表符(^I)    ★ 在每一行后面增加--end    ★ 显示指定模式匹配行的行号 [/pattern/]=    ★ 在匹配行后面增加文本 [/pattern/]a\ 或者 [address]a\    ★ 删除匹配行 [/pat...

国开电大 道路工程技术 形考任务_普通网友的博客-程序员秘密

题目1:棋盘式道路网指的是( )环形放射式道路网混合式道路网自由式道路网方格网式道路网题目2:道路起讫点间的实际交通距离与此两点的空间直线距离之比,称为( )非直线系数干道网密度道路占有率道路面积密度题目3:作为街坊线与的次干路连接线的城市道路是( )次干路主干路快速路支路题目4:在平面线形中,使用最多的基本线形是( )直线圆曲线折线竖曲线题目5:下列关于汽车在弯道上行使时,说法有误的一项是( )离心力越大,汽车行驶越安全离心力与车速的平方成正

base64转化为二进制存储在指定的位置_秃秃头头的博客-程序员秘密

/** * base64转化为二进制存储在指定的位置 * @param base64 * @param fileName * @param filePath * @return * @throws Exception */ public static File base64ToFile(String base64, String fileName, String filePath) throws Exception {

随便推点

@Scheduled cron表达式_weixin_30596735的博客-程序员秘密

一、Cron详解:Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:1.Seconds Minutes Hours DayofMonth Month DayofWeek Year2.Seconds Minutes Hours DayofMonth Month DayofWeek每一个域可出现的字符如下:Secon...

【面试】Liveramp 面试题 面经 子序列问题_绝世好阿狸的博客-程序员秘密

以上参考:http://www.1point3acres.com/bbs/forum.php?mod=viewthread&tid=138979&extra=page%3D1%26filter%3Dsortid%26sortid%3D311%26searchoption%5B3089%5D%5Bvalue%5D%5B5%5D%3D5%26searchoption%5B3089%5D%5Btype%

【开发工具】Git的简单使用,创建版本库、提交代码、更新代码_恬静的小魔龙的博客-程序员秘密_开发工具git

一、前言博主的Git学的也不是特别精通,本着学习记录的想法梳理了这篇文章,有什么不对的还希望能指出来。本篇文章也是根据日常使用的习惯,整理出来两条路线:一、在本地已经开始制作了项目,或者项目已经完成,想要将项目上传到云端二、准备在云端新建一个项目,然后更新到本地然后进行项目开发其实这两种思路是相同的,都需要在Github或者GitLab新建项目库之后,将云端的项目库和本地的项目进行连接,之后再添加、提交、推送,三连。OK,开始二、前期准备1、邮箱注册在git bash界面输入如下内容即可完

xprobe2_ronghua_liu的博客-程序员秘密_xprobe2安装

<br />xprobe2  踩点工具,<br />特点:隐蔽踩点,获取可能操作系统列表<br />sudo apt-get install xprobe2<br /> <br />sudo xprobe2 www.xxx.com<br />[+] Loading modules.[+] Following modules are loaded:[x] [1] ping:icmp_ping - ICMP echo discovery module[x] [2] ping:tcp_ping

GD32F103学习笔记(7)——USART串口使用_Leung_ManWah的博客-程序员秘密_usart_interrupt_flag_get

一、简介通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter) 是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个 UART(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。

Android中Activity的四种启动模式_xy7788521的博客-程序员秘密

在实际开发中,应根据特定的需求为每个Activity指定恰当的启动模式。Activity的启动模式有4种,分别是standard,singleTop,singleTask和singleInstance。在AndroidManifext.xml中,通过标签的Android:launchMode属性可以设置启动模式。以下针对这4种启动模式分别进行详细的解释:1、standard模式