返回顶部
首页 > 资讯 > 数据库 >MyBatis foreach 标签常用方法总结
  • 489
分享到

MyBatis foreach 标签常用方法总结

mybatisjavamysql 2023-08-20 08:08:13 489人浏览 安东尼
摘要

一、前言   在 mybatis 中,常常会遇到集合类型的参数,虽然我们可以通过 OGNL 表达式来访问集合的某一个元素,但是 OGNL 表达式无法遍历集合。foreach 标签就是专门用来解决这类问题的,foreach 标签可以用来遍历数

一、前言

  在 mybatis 中,常常会遇到集合类型的参数,虽然我们可以通过 OGNL 表达式来访问集合的某一个元素,但是 OGNL 表达式无法遍历集合。foreach 标签就是专门用来解决这类问题的,foreach 标签可以用来遍历数组、列表和 Map 等集合参数,实现批量操作或一些简单 sql 操作。

二、foreach 元素属性简介

  foreach 元素的属性主要有 item,index,open,separator,close,collection。各属性含义如下所示。

2.1 item

  集合中元素迭代时的别名,该参数为必选。

2.2 index

  在 list 和数组中,index 是元素的序号;在 map 中,index 是元素的 key。该参数可选。

2.3 open

  foreach 代码的开始符号,一般是 ”(“,和 close=“)” 合用。常用在 in(),values() 时。该参数可选。

2.4 separator

  元素之间的分隔符,例如在 in() 的时候,separator=“,” 会自动在元素中间用 “,“ 隔开,避免手动输入逗号导致 SQL 错误,如 in(1, 2,) 这样。该参数可选。

2.5 close

  foreach 代码的关闭符号,一般是 ”)“,和 open=“(” 合用。常用在 in(),values()时。该参数可选。

2.6 collection

  要被 foreach 标签循环解析的对象。

  foreach 标签的 collection 属性在接受参数名时,有两种情况:

  • 匿名参数
    当在 java 方法中没有通过 @Param 注解指定参数名时,列表类型默认参数名为 ”list“,数组类型默认参数名为 ”array“,Map 对象没有默认值。

  • 具名参数
    java 方法中使用了 @Param 注解指定了参数名称,则 foreach 中的 collection 属性必须为参数名。

  在作为入参时可以使用 @Param(“keyName”) 来设置该键值,设置 keyName 后,list、array 将会失效。除了入参这种情况外,还有一种是作为参数对象的某个字段,例子如下。如果 User 有属性 List ids。入参是 User 对象,那么这个collection = “ids”。如果 User 有属性 Ids ids,其中 Ids 是个对象,Ids 有个属性 List id,入参是 User 对象,那么 collection = “ids.id”。

  注意点:在使用 foreach 的时候,最关键的就是 collection 属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有以下 3 种情况(未通过 @Param 指定别名时)。

  • 如果传入的是单参数且参数类型是一个 List 的时候,collection 属性值为 ”list“。
  • 如果传入的是单参数且参数类型是一个 array 数组的时候,collection 的属性值为 ”array“。
  • 如果传入的参数是多个的时候,我们可以把它们封装成一个 Map,当然单参数也可以封装成 map。实际上如果你在传入参数的时候,在 MyBatis 里面也是会把它封装成一个 Map 的,map 的 key 就是参数名,所以这个时候 collection 属性值就是传入的 List 或 array 对象在自己封装的 map 里面的 key。
三、#{} 与 ${} 的区别

  在使用参数的过程中,会遇到 #{} 与 ${} 的问题,因此简单总结下两者之间的区别。

  1. ${param} 传递的参数会被当成 SQL 语句中的一部分,比如传递表名,字段名,字段类型等数据。
    例如,传入值为 id,order by ${param} 则解析成 SQL:order by id。

  2. #{parm} 传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。
    例如,传入值为 id,select * from table where name = #{param} 则解析成 SQL:select * from table where name = ? (其中问号在执行时传入值 “id”)。

  为了安全,能用 # 的地方就用 # 方式传参,这样可以有效的防止 SQL 注入攻击。

  官方说明:mybatis 在处理 #{} 时,会将 SQL 中的 #{} 替换为 “?”,调用 PreparedStatement 的 set 方法来赋值;mybatis 在处理 ${} 时,就是把 ${} 替换成变量的值。使用 #{} 可以有效的防止 SQL 注入,提高系统安全性。

四、实例实战

  本文以如下几个例子简单总结下 foreach 是如何遍历列表、数组和 Map 的。

4.1 遍历 List 列表

  Java 层接口

List<Rule> selectRulesByList(List<String> ids);

  XML

  <select id="selectRulesByList" resultMap="BaseResultMap">    SELECT    <include refid="Base_Column_List" />    FROM tbl_test_rule WHERE rule_id IN    <foreach collection="list" open="(" close=")" separator="," item="item" index="index">      #{item}    foreach>  select>

  运行时 SQL 语句

==>  Preparing: SELECT rule_id, rule_name, rule_type FROM tbl_test_rule WHERE rule_id IN ( ? , ? )==> Parameters: 10001(String), 20002(String)<==      Total: 2
4.2 遍历 List 列表

  项目中定义了一个实体类 Rule,在批量插入时需要遍历 List,实现方式见下文。

  Java 层接口

int insertRules(@Param("rules") List<Rule> rules);

  XML

  <insert id="insertRules">    INSERT INTO tbl_test_rule (rule_id, rule_name, rule_type) VALUES    <foreach collection="rules" separator="," item="rule">      (#{rule.ruleId}, #{rule.ruleName}, #{rule.ruleType})    foreach>  insert>

  运行时 SQL 语句

==>  Preparing: INSERT INTO tbl_test_rule (rule_id, rule_name, rule_type) VALUES (?, ?, ?) , (?, ?, ?)==> Parameters: ruleId1(String), ruleName1(String), 1(String), ruleId2(String), ruleName2(String), 2(String)<==    Updates: 2
4.3 遍历数组

  Java 层接口

List<Rule> selectRulesByArray(String[] ids);

  如果 ids 参数使用 @Param 注解指定了参数名称,则 foreach 标签中的 collection 属性必须为该名称;但若未指定名称,则在 foreach 标签中使用默认数组名称 array,如下所示

  XML

  <select id="selectRulesByArray" resultMap="BaseResultMap">    SELECT    <include refid="Base_Column_List" />    FROM tbl_test_rule WHERE rule_id IN    <foreach collection="array" open="(" close=")" separator="," item="item" index="index">      #{item}    foreach>  select>

  运行时 SQL 语句

==>  Preparing: SELECT rule_id, rule_name, rule_type FROM tbl_test_rule WHERE rule_id IN ( ? , ? )==> Parameters: 10001(String), 20002(String)<==      Total: 2
4.4 遍历 Map 实现 insert into … on duplicate key update

  数据库表 tbl_test_discount,联合主键(cert_no, rule_id, cycle_id),存储了不同用户不同周期下的折扣金额。请求参数 Map 中存储了某一用户不同规则(key 为不同的 rule_id 值)和各个规则下的折扣值(value 为 dis_sum),如下方 Java 接口定义。需要实现:当数据库中无主键记录时,将记录插入数据库;如数据库中存在主键记录时,更新折扣值,将折扣值累加计算(即实现 insert into … on duplicate key update 操作)。过程示例如下。

  Java 层接口

    int saveOrUpd(@Param(value = "certNo") String certNo,                  @Param(value = "cycleId") String cycleId,                  @Param(value = "params") Map map);

  使用 foreach 标签遍历 Map 时,collection 属性值为 @param 注解指定的参数名,即 params,且 item 是 Map 的键值,index 是键名。

  XML

  <update id="saveOrUpd" parameterType="java.util.Map">    <foreach collection="params" index="key" item="value">      insert into tbl_test_discount (cert_no, rule_id, cycle_id, dis_sum) values      (#{certNo}, #{key}, #{cycleId}, #{value}) on duplicate key update dis_sum = dis_sum + #{value};    foreach>  update>

  mybatis 设置允许批量更新

  mybatis 会根据上述 XML 文件的配置,动态生成多条 SQL。要让 mybatis 成功执行多条语句,须开启允许批量查询设置,即在 jdbc-url 连接信息中添加 &allowMultiQueries=true,如下所示。

spring.datasource.jdbc-url=jdbc:Mysql://localhost:3306/testdb?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true

  mysql 连接数据库时,添加语句 &allowMultiQueries=true 的作用:可以在 SQL 语句后携带分号,实现多语句执行;可以执行批处理,同时发出多个 SQL 语句。

  运行时 SQL 语句

==>  Preparing: insert into tbl_test_discount (cert_no, rule_id, cycle_id, dis_sum) values (?, ?, ?, ?) on duplicate key update dis_sum = dis_sum + ?; insert into tbl_test_discount (cert_no, rule_id, cycle_id, dis_sum) values (?, ?, ?, ?) on duplicate key update dis_sum = dis_sum + ?; insert into tbl_test_discount (cert_no, rule_id, cycle_id, dis_sum) values (?, ?, ?, ?) on duplicate key update dis_sum = dis_sum + ?; insert into tbl_test_discount (cert_no, rule_id, cycle_id, dis_sum) values (?, ?, ?, ?) on duplicate key update dis_sum = dis_sum + ?;==> Parameters: testCertNo1(String), 30001(String), 202212(String), 225(Integer), 225(Integer), testCertNo2(String), 20002(String), 202212(String), 385(Integer), 385(Integer), testCertNo3(String), 20001(String), 202212(String), 553(Integer), 553(Integer), testCertNo4(String), 10001(String), 202212(String), 300(Integer), 300(Integer)<==    Updates: 1

  foreach 标签是使用非常广泛的一个标签,当使用 SQL 进行批量插入、查询时都可能使用到它。列表遍历的使用最为广泛,数组和 Map 则相对较少。

文章参考

来源地址:https://blog.csdn.net/piaoranyuji/article/details/128187911

您可能感兴趣的文档:

--结束END--

本文标题: MyBatis foreach 标签常用方法总结

本文链接: https://lsjlt.com/news/376331.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MyBatis foreach 标签常用方法总结
    一、前言   在 MyBatis 中,常常会遇到集合类型的参数,虽然我们可以通过 OGNL 表达式来访问集合的某一个元素,但是 OGNL 表达式无法遍历集合。foreach 标签就是专门用来解决这类问题的,foreach 标签可以用来遍历数...
    99+
    2023-08-20
    mybatis java mysql
  • MyBatis常用标签以及使用技巧总结
    前言 MyBatis常用标签及标签使用技巧 MyBatis的常用标签有很多,比如 <sql id="">:预定义可以复用的sql语句 <include refid=...
    99+
    2024-04-02
  • mybatis中foreach嵌套if标签方式
    目录mybatis foreach嵌套if标签xml文件 $和 #的区别union与union all区别mybatis if和foreach嵌套 (同一个列,不...
    99+
    2024-04-02
  • android nfc常用标签读取总结
    有几天没有更新博客了,不过本篇却准备了许久,希望能带给每一位开发者最简单高效的学习方式。废话到此为止,下面开始正文。 NFC(Near Field Communicatio...
    99+
    2022-06-06
    nfc 标签 Android
  • Mybatis的where标签使用总结梳理
    目录背景原始的手动拼接Mybatis where标签的使用进阶:自定义trim标签where语句的坑小结背景 在上篇文章,我们系统地学习了where 1...
    99+
    2024-04-02
  • mybatis的foreach标签语法报错的解决
    目录foreach标签语法报错动态sql中foreach标签使用foreach标签语法报错       开发中因为方便复制了其它的foreach标签,但...
    99+
    2024-04-02
  • mybatis <foreach>标签动态增删改查方式
    目录<foreach>标签动态增删改查mybatis<foreach>实战有了建表以及插入,当然少不了删除和更新mapper.xml中<foreach&...
    99+
    2024-04-02
  • MyBatis中foreach标签的collection属性的取值方式
    目录foreach标签的collection属性的取值传的是List列表传的是Array数组传的是Mapcollection属性总结MyBatis使用foreach标签报错原因解决方...
    99+
    2024-04-02
  • RedisTemplate常用方法总结
    目录String类型Hash类型 List类型 Set类型 zSet类型 参考: Redis常用的数据类型: String Hash List Se...
    99+
    2024-04-02
  • Python去除html标签的几种方法总结
    目录Python去除html标签的方法python正则表达式去除html标签的属性总结Python去除html标签的方法 最近小说看得比较多,但是很多小说网站都存在各种小广告,看起来...
    99+
    2023-01-03
    Python去除html标签 Python html标签 html标签去除
  • MyBatis常用动态sql大总结
    简介 相信大家没用Mybatis之前,都碰到过各种条件判断拼接SQL、需要去掉多余的逗号等痛苦,Mybatis中的动态SQL能很好的解决上面说的情况,可以很灵活的组装SQL语句,从...
    99+
    2024-04-02
  • 数组常用方法总结
    数组常用方法总结 一.获取数组长度1.1 使用length 二.数组转字符串2.1 Arrays是什么2.2 使用toString() 三. 数组拷贝3.1 使用 copyOf()3.2 copyOfRange() 四....
    99+
    2023-08-30
    java 排序算法 开发语言
  • Trim标签在Mybatis中的使用方法
    Trim标签在Mybatis中的使用方法?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。具体代码如下所示:<update id="updateAu...
    99+
    2023-05-31
    mybatis trim
  • Mybatis中where标签与if标签怎么结合使用
    这篇文章主要介绍“Mybatis中where标签与if标签怎么结合使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Mybatis中where标签与if标签怎么结合使用”文章能帮...
    99+
    2023-07-05
  • wordpress常用标签、方法解释
    'wp_top_valuehttps://blog.csdn.net/weixin_43576565/article/details/','meta_valuehttps://blog.c...
    99+
    2023-09-05
    数学建模 wordpress 前端 全文检索 后端 cms php
  • Springboot整合Mybatis传值的常用方式总结
    方式一:直接传 接口 public interface UserMapper { public List<User> getUserById(int id);...
    99+
    2024-04-02
  • 总结Python常用的魔法方法
    目录一、算数运算符的魔法方法二、反运算相关的魔法方法三、增量赋值运算四、一元操作符一、算数运算符的魔法方法 python2.2以后,对类和类型进行了统一,做法就是讲int(...
    99+
    2024-04-02
  • mybatis动态sql常用场景总结
    目录前言1.if2. choose、when、otherwise3. trim、where、set4. foreach前言 平时在开发中,针对动态sql这块目前是薄弱点,自...
    99+
    2024-04-02
  • Oracle常用的SQL方法总结
       在项目中一般需要对一些数据进行处理,以下提供一些基本的SQL语句:     1.基于条件的插入和修改:需要在表中插入一条记录,插入前根据key标识判断...
    99+
    2024-04-02
  • mybatis-plus中lambdaQuery()与lambdaUpdate()比较常见的使用方法总结
    目录简介前言学生类根据id查询带条件的查询 根据id查询对象查询学生集合常见的分页查询根据id删除带条件的删除 删除名称为张三 年龄等于15的学生修改 根据id修改修改 将学号为1的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作