当前位置: 首页 > news >正文

MyBatis (where、set、foreach)标签

where标签

 在上一节SQL 语句中加入了一个条件“1=1”,如果没有加入这个条件,那么可能就会变成下面这样一条错误的语句。

SELECT id,name,url,age,country FROM website AND name LIKE CONCAT('%',#{name},'%')

显然以上语句会出现 SQL 语法异常,但加入“1=1”这样的条件又非常奇怪,所以 MyBatis 提供了 where 标签。
where 标签主要用来简化 SQL 语句中的条件判断,可以自动处理 AND/OR 条件,语法如下

<where><if test="判断条件">AND/OR ...</if>
</where>

if 语句中判断条件为 true 时,where 关键字才会加入到组装的 SQL 里面,否则就不加入。where 会检索语句,它会将 where 后的第一个 SQL 条件语句的 AND 或者 OR 关键词去掉。

示例:

<select id="selectWebsite" resultType="net.cc.po.Website">select id,name,url from website<where><if test="name != null">AND name like #{name}</if><if test="url!= null">AND url like #{url}</if></where>
</select>

测试

public class Test {public static void main(String[] args) throws IOException {// 读取配置文件mybatis-config.xmlInputStream config = Resources.getResourceAsStream("mybatis-config.xml"); // 根据配置文件构建SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);// 通过SqlSessionFactory创建SqlSessionSqlSession ss = ssf.openSession();Website site = new Website();site.setname("编程");List<Website> siteList = ss.selectList("net.cc.mapper.WebsiteMapper.selectWebsite", site);for (Website ws : siteList) {System.out.println(ws);}}
}

set标签

在 Mybatis 中,update 语句可以使用 set 标签动态更新列。set 标签可以为 SQL 语句动态的添加 set 关键字,剔除追加到条件末尾多余的逗号。

示例:

<?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="net.cc.mapper.WebsiteMapper"><select id="selectWebsite" resultType="net.cc.po.Website">SELECT * FROM website<where><if test="id!=null and id!=''">id=#{id}</if></where></select><!--使用set元素动态修改一个网站记录 --><update id="updateWebsite"parameterType="net.cc.po.Website">UPDATE website<set><if test="name!=null">name=#{name}</if><if test="url!=null">url=#{url}</if></set>WHERE id=#{id}</update>
</mapper>

测试

public class Test {public static void main(String[] args) throws IOException {InputStream config = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);SqlSession ss = ssf.openSession();Website site = new Website();site.setId(1);site.setUrl("www.cc.net");// 执行update语句前List<Website> siteList = ss.getMapper(WebsiteMapper.class).selectWebsite(site);for (Website st : siteList) {System.out.println(st);}int num = ss.getMapper(WebsiteMapper.class).updateWebsite(site);System.out.println("影响数据库行数" + num);// 执行update语句后List<Website> siteList2 = ss.getMapper(WebsiteMapper.class).selectWebsite(site);for (Website st : siteList2) {System.out.println(st);}ss.commit();ss.close();}
}

foreach标签

对于一些 SQL 语句中含有 in 条件,需要迭代条件集合来生成的情况,可以使用 foreach 来实现 SQL 条件的迭代。 

Mybatis foreach 标签用于循环语句,它很好的支持了数据和 List、set 接口的集合,并对此提供遍历的功能。语法格式如下。

<foreach item="item" index="index" collection="list|array|map key" open="(" separator="," close=")">参数值
</foreach>

foreach 标签主要有以下属性,说明如下。

  • item:表示集合中每一个元素进行迭代时的别名。
  • index:指定一个名字,表示在迭代过程中每次迭代到的位置。
  • open:表示该语句以什么开始(既然是 in 条件语句,所以必然以(开始)。
  • separator:表示在每次进行迭代之间以什么符号作为分隔符(既然是 in 条件语句,所以必然以,作为分隔符)。
  • close:表示该语句以什么结束(既然是 in 条件语句,所以必然以)开始)。


使用 foreach 标签时,最关键、最容易出错的是 collection 属性,该属性是必选的,但在不同情况下该属性的值是不一样的,主要有以下 3 种情况:

  • 如果传入的是单参数且参数类型是一个 List,collection 属性值为 list。
  • 如果传入的是单参数且参数类型是一个 array 数组,collection 的属性值为 array。
  • 如果传入的参数是多个,需要把它们封装成一个 Map,当然单参数也可以封装成 Map。Map 的 key 是参数名,collection 属性值是传入的 List 或 array 对象在自己封装的 Map 中的 key。

示例

<select id="selectWebsite"parameterType="net.cc.po.Website"resultType="net.biancheng.po.Website">SELECT id,name,url,age,countryFROM website WHERE age in<foreach item="age" index="index" collection="list" open="("separator="," close=")">#{age}</foreach>
</select>

 测试

public class Test {public static void main(String[] args) throws IOException {// 读取配置文件mybatis-config.xmlInputStream config = Resources.getResourceAsStream("mybatis-config.xml"); // 根据配置文件构建SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);// 通过SqlSessionFactory创建SqlSessionSqlSession ss = ssf.openSession();List<Integer> ageList = new ArrayList<Integer>();ageList.add(10);ageList.add(12);List<Website> siteList = ss.selectList("net.cc.mapper.WebsiteMapper.selectWebsite", ageList);for (Website ws : siteList) {System.out.println(ws);}}
}

在使用 foreach 标签时,应提前预估一下 collection 对象的长度。因为大量数据的 in 语句会影响性能,且还有一些数据库会限制执行的 SQL 语句长度。 

http://www.lryc.cn/news/196404.html

相关文章:

  • flutter开发之安装dart
  • 向量召回:深入评估离线体系,探索优质召回方法
  • 播放器缓存队列bug解决方案
  • React拖拽实践
  • Stable Diffusion绘图,lora选择
  • kube-controller-manager和kube-scheduler不能正常启动
  • Mac OS m1 下安装Gradle5.1
  • JUC并发编程面试题(自用)
  • Redis分布式会话
  • 程序员大厂之鹅厂探秘
  • 【Java 进阶篇】深入理解 JavaScript DOM Node 对象
  • 测试用例基础
  • “Flex弹性布局、轮播图mock遍历数据和首页布局解析与实践“
  • 自动化办公篇之python
  • 华为云云耀云服务器L实例评测|使用sysbench对云耀云服务器mysql的性能测试
  • 【译】快速开始 Compose 跨平台项目
  • 高性能服务器之mysql数据库连接池设计与实现
  • 黑客技术(自学)——网络安全
  • day06-前后端项目上传到gitee、后端多方式登录接口、发送短信功能、发送短信封装、短信验证码接口、短信登录接口
  • 【SA8295P 源码分析 (一)】83 - SA8295P HQNX + Android 完整源代码下载方法介绍
  • 文献阅读快速法-ChatPDF
  • Jenkins 内存占用
  • 1. vue-sy-admin: 基于vue3+TypeScript的全局过滤器(filters) 封装及示例
  • 操作系统监控:守护您的计算机系统稳定运行的坚实防线
  • PostgreSQL | CTE | 使用with子句的通用表达式
  • A Close Look into the Calibration of Pre-trained Language Models
  • 【控制台】报错:Uncaught ReferenceError: process is not defined
  • Android自定义AppGlideModule,DataFetcher ,ModelLoaderFactory,ModelLoader,Kotlin(1)
  • uni-app--》基于小程序开发的电商平台项目实战(五)
  • 新型的终端复用器 tmux