当前位置:   article > 正文

MyBatis中foreach用法_mybatis foreach数组

mybatis foreach数组

foreach用法

SQL语句中有时会使用in关键字,如id in {1,2,3},我们可以使用${ids}方式直接获取值,但是这种方法不能防止SQL注入,想避免SQL注入的话就需要使用#{id}的方式,这时我们就可以配合使用foreach标签了。foreach可以对数组、Map或实现了Iterable接口(List、Set)的对象进行遍历。数组在处理时会转换为List对象,因此foreach遍历的对象可以分为两大类:Iterable类型和Map类型。

foreach实现in集合

foreach实现in集合或数组是最简单和最常用的一种情况。假设,我们需要根据传入的用户id集合来查询所有符合条件的用户。在接口类中写一个方法,selectByIdList(List<Long> idList)。

  1. package Interface;
  2. import pojo.User;
  3. import java.util.List;
  4. public interface UserMapper {
  5. //foreach实现in集合
  6. List<User> selectByIdList(List<Long> idList);
  7. }
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="Interface.UserMapper">
  6. <!--foreach实现in集合-->
  7. <select id="selectByIdList" resultType="pojo.User">
  8. select id,user_name userName,user_password userPassword,
  9. user_email userEmail,user_info userInfo,head_img headImg,create_time createTime
  10. from t_user where id in
  11. <foreach collection="list" open="(" close=")" separator="," item="id" index="i">
  12. #{id}
  13. </foreach>
  14. </select>
  15. </mapper>

foreach中包含以下属性:

  • collection:必填。值为要迭代循环的属性名。这个属性值的情况很多。
  • item:变量名,值为从迭代对象中取出的每一个值。
  • index:索引的属性名,在集合数组情况下值为当前索引值,当迭代循环的对象是Map类型时,这个值即为Map的key值。
  • open:整个循环内容开头的字符串。
  • close:整个循环内容结尾的字符串。
  • separator:每次循环的分隔符。

collection属性的设置:

  • 当只有一个数组参数或集合参数

当参数类型为集合的时候,默认会转换为Map类型,并添加一个key为collection的值,如果参数类型是List集合,那么就继续添加一个key为list的值,这样当collection = list时就能得到这个集合,并对它进行循环操作。当参数类型为数组的时候,也会转换成Map类型,默认的key值为array。如selectByIdList(List<Long> idList),collection属性值就为array。

  • 当有多个参数

当有多个参数的时候,就要使用@Param注解给每个参数指定一个名字,否则在SQL中使用参数时就会不方便,因此将collection设置为@Param注解指定的名字即可。

  • 当参数是Map类型

使用Map和使用@Param注解方式类似,将collection指定为对应Map中的key即可。如果要循环所传入的Map,推荐使用@Param注解指定名字,此时可将collection设置为指定的名字,如果不想指定名字,就是用默认值_parameter。

  • 当参数是一个对象

这种情况下指定为对象的属性名即可。当使用对象内多层嵌套的对象时,使用属性.属性(集合和数组可使用下标取值)的方法指定深层的属性值。

测试方法:

  1. @Test
  2. public void testSelectByIdList() {
  3. SqlSession sqlSession = getSqlSession();
  4. try {
  5. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  6. List<Long> idList = new ArrayList<Long>();
  7. idList.add(1001L);
  8. idList.add(1002L);
  9. idList.add(1003L);
  10. idList.add(1004L);
  11. List<User> userList = userMapper.selectByIdList(idList);
  12. for (User user : userList) {
  13. System.out.println(user);
  14. }
  15. } finally {
  16. sqlSession.close();
  17. }
  18. }

foreach实现批量插入

定义一个方法:insertList()

  1. package Interface;
  2. import pojo.User;
  3. import java.util.List;
  4. public interface UserMapper {
  5. //foreach实现批量插入
  6. int insertList(List<User> userList);
  7. }
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="Interface.UserMapper">
  6. <!--foreach实现批量插入-->
  7. <insert id="insertList">
  8. insert into t_user(user_name,user_password,user_email,user_info,head_img,create_time)
  9. values
  10. <foreach collection="list" item="user" separator=",">
  11. (#{user.userName},#{user.userPassword},#{user.userEmail},#{user.userInfo},
  12. #{user.headImg,jdbcType=BLOB},#{user.createTime,jdbcType=TIMESTAMP})
  13. </foreach>
  14. </insert>
  15. </mapper>
  1. @Test
  2. public void testInsertList() {
  3. SqlSession sqlSession = getSqlSession();
  4. try {
  5. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  6. List<User> userList = new ArrayList<User>();
  7. for(int i = 1; i <= 3; i++) {
  8. User user = new User();
  9. user.setUserName("study" + i);
  10. user.setUserPassword("!@#$%^");
  11. user.setUserEmail("study@study");
  12. user.setUserInfo("okokok");
  13. user.setHeadImg(new byte[]{1});
  14. user.setCreateTime(new Date());
  15. userList.add(user);
  16. }
  17. int res = userMapper.insertList(userList);
  18. if (res > 0) {
  19. System.out.println(res);
  20. System.out.println("插入成功!");
  21. }
  22. } finally {
  23. sqlSession.commit();
  24. sqlSession.close();
  25. }
  26. }

foreach实现动态update

当参数是Map,foreach标签的index属性值对应的不是索引值,而是Map中的key,利用这个key可以实现动态更新。

  1. package Interface;
  2. import pojo.User;
  3. import java.util.List;
  4. import java.util.Map;
  5. public interface UserMapper {
  6. //foreach实现动态更新
  7. int updateByMap(Map<String,Object> map);
  8. }
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="Interface.UserMapper">
  6. <!--foreach实现动态更新-->
  7. <update id="updateByMap">
  8. update t_user set
  9. <foreach collection="_parameter" item="val" index="key" separator=",">
  10. ${key} = #{val}
  11. </foreach>
  12. where id = #{id}
  13. </update>
  14. </mapper>

key作为列名,对应的值作为该列的值,通过foreach将需要更新的字段拼接在SQL语句中。

  1. @Test
  2. public void testUpdateByMap() {
  3. SqlSession sqlSession = getSqlSession();
  4. try {
  5. UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
  6. Map<String,Object> map = new HashMap<String, Object>();
  7. //查询条件,也是更新条件,必须保证值存在
  8. map.put("id",1007L);
  9. //要更新的其他字段
  10. map.put("user_password","testst");
  11. map.put("user_email","testst@study");
  12. int res = userMapper.updateByMap(map);
  13. if(res > 0) {
  14. System.out.println(res);
  15. System.out.println("更新成功!");
  16. }
  17. } finally {
  18. sqlSession.commit();
  19. sqlSession.close();
  20. }
  21. }

至此,foreach的用法就到此为止了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/749102
推荐阅读
相关标签
  

闽ICP备14008679号