在MyBatis的
元素中,collection
、item
、open
、close
、separator
和index
这些属性都有特定的含义,它们一起定义了如何迭代集合并为SQL语句生成相应的片段。下面是对这些属性的详细解释:
collection:
意义: 指定要遍历的集合或数组的名称。
用途: 告诉MyBatis从哪个集合或数组中获取元素来构建SQL。
示例: 如果你的参数是一个Map,并且你想遍历这个Map的键,那么你可以这样写:collection="map.keys"
。
如果参数是一个List,那么你可以直接写:collection="list"
。
item:
意义: 指定每次迭代时的当前元素的变量名。
用途: 在
标签内部,你可以使用这个变量来引用当前迭代到的元素。
示例: 如果你的集合包含字符串,你可以写:item="str"
,然后在
内部使用${str}
来引用当前字符串。
open和close:
意义: 这两个属性分别指定了生成的SQL片段的开始和结束字符串。
用途: 当你想要包裹整个遍历生成的SQL片段时,这两个属性非常有用。
示例: 对于一个IN子句,你可能会这样写:open="("
和 close=")"
,这会生成一个被括号包裹的列表。
separator:
意义: 指定迭代过程中生成的每个元素之间的分隔符。
用途: 当你想要把多个元素连接起来时,比如在IN子句中,你需要用逗号分隔不同的值。
示例: 对于IN子句,你可以写:separator=","
,这样每个值之间都会用逗号分隔。
index:
意义: 当遍历集合时,指定用于引用当前元素索引的变量名。
用途: 对于某些集合,比如List或数组,你可能想要引用元素的索引(位置)。
示例: 如果你正在遍历一个List,并且想要同时获取元素的值和它的索引,你可以写:index="idx"
和 item="value"
,然后在
内部使用${idx}
和#{value}
。
这些属性通常一起使用,以便能够灵活地构建各种SQL语句片段。通过组合这些属性,你可以创建复杂的SQL语句,这些语句在运行时可以动态地根据输入数据变化。
foreach
`循环标志
collection
、 拿到的集合。List 或 Map
index
集合中的每一个对象 的 下标 或 键
item
、 集合中的每一个对象 的 值
open
、 循环开始前
close
、 循环结束后
separator
每层循环的分隔符
(#{user.id}, #{user.name}, #{user.age}) ${key} = #{map[key]} ${key} = #{value}
下面我将给出几个使用MyBatis
元素属性的具体例子,这些例子展示了如何根据提供的集合或数组动态构建SQL语句。
假设我们有一个用户列表,并且想要一次性插入这些用户到数据库中。
Mapper XML:
INSERT INTO users (id, name, age) VALUES (#{user.id}, #{user.name}, #{user.age})
在这个例子中,collection="list"
指定了我们要遍历的集合,item="user"
是每次迭代时当前元素的变量名。separator=","
表示每个插入的元组之间用逗号分隔。
如果我们想要根据ID列表查询用户,我们可以使用IN子句。
Mapper XML:
在这个例子中,open="("
和 close=")"
分别指定了IN子句的开始和结束括号。separator=","
表示每个ID之间用逗号分隔。
假设我们有一个Map,其中键是列名,值是对应的值,我们想要根据这个Map动态构建UPDATE语句。
Mapper XML:
UPDATE users ${key} = #{value} WHERE id = #{id}
在这个例子中,collection="map"
指定了我们要遍历的Map,item="value"
是每次迭代时当前值的变量名,index="key"
是每次迭代时当前键的变量名。separator=","
表示每个字段的更新语句之间用逗号分隔。
如果我们有一个ID数组,并想要根据这些ID插入到另一个表中,可以这样做:
Mapper XML:
INSERT INTO related_ids (user_id) VALUES (#{id})
在这个例子中,collection="array"
指定了我们要遍历的是数组。其他属性和之前例子中的用法相同。
这些例子展示了如何灵活地使用MyBatis的
元素来构建动态SQL语句。你可以根据实际需求调整collection
、item
、open
、close
、separator
和index
等属性的值。
Integer insertBathData(@Param("tableName")String tableName,@Param("paramMap")MapparamMap,@Param("dataList")List INSERT INTO ${tableName}${key} //遍历map的键 values//遍历list
效果:
INSERT INTO some_table (name, age)
VALUES (value1_for_name, value1_for_age), (value2_for_name, value2_for_age)