[mybatis]动态sql_foreach_遍历集合&批量插入

Posted 唐火

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[mybatis]动态sql_foreach_遍历集合&批量插入相关的知识,希望对你有一定的参考价值。

foreach遍历集合

  • collection:指定要遍历的集合

  • list类型的参数会特殊处理封装在map中,map的key就叫list

  • item:将当前遍历出的元素赋值给指定的变量

  • #变量名就能取出变量的值也就是当前遍历出的元素

  • separator:每个元素之间的分隔符

  • open:遍历出所有结果拼接一个开始的字符

  • close:遍历出所有结果拼接一个结束的字符

  • index:索引。遍历list的时候 index就是索引
    遍历map的时候index表示的就是map的key,item就是map的值

  public List<Employee> getEmpsByConditionForeach(@Param("ids") List<Integer> ids);
<!--    public List<Employee> getEmpsByConditionForeach(@Param("ids")List<Integer> employee);-->
<select id="getEmpsByConditionForeach" resultType="com.atguigu.mybatis.bean.Employee">
    select * from tb1_employee

    <!--
        collection:指定要遍历的集合
        list类型的参数会特殊处理封装在map中,map的key就叫list
        item:将当前遍历出的元素赋值给指定的变量

        #变量名就能取出变量的值也就是当前遍历出的元素

        separator:每个元素之间的分隔符

        open:遍历出所有结果拼接一个开始的字符

        close:遍历出所有结果拼接一个结束的字符

        index:索引。遍历list的时候 index就是索引
        遍历map的时候index表示的就是map的key,item就是map的值

    -->

    <foreach collection="ids" item="item_id" separator="," open = "where id in (" close = ")">
        #item_id
    </foreach>

</select>
  • 注意:这里的collection只能填list或者是map,如果想填ids,需要在参数上加@Param注解
    @Test
    public void test02() throws IOException 

        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

        SqlSession sqlSession = sqlSessionFactory.openSession();

        try
        
            EmployeeMapperDynamicSQL mapper = sqlSession.getMapper(EmployeeMapperDynamicSQL.class);

            List<Employee> list = mapper.getEmpsByConditionForeach(Arrays.asList(1, 2, 3, 4));

            for (Employee emp : list)
            
                System.out.println(emp);
            

            //手动提交数据
            sqlSession.commit();


        finally 

            sqlSession.close();

        


    

foreach批量插入

  • 方式一
  public void addEmps(@Param("emps") List<Employee> emps);
 <insert id="addEmps">


        INSERT INTO tb1_employee(last_name,email,gender,d_id)
        values
        <foreach collection="emps" item = "emp" separator=",">
            (#emp.lastName,#emp.email,#emp.gender,#emp.dept.id)
        </foreach>

    </insert>
 @Test
    public void test04() throws IOException 
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

        SqlSession sqlSession = sqlSessionFactory.openSession();

        try
        
            EmployeeMapperDynamicSQL mapper = sqlSession.getMapper(EmployeeMapperDynamicSQL.class);


            List<Employee> emps = new ArrayList<>();

            emps.add(new Employee(null,"smitdash","smitadsh@qq.com","1",new Department(1)));
            emps.add(new Employee(null,"allsadasen","allesadn@qq.com","0",new Department(1)));



            mapper.addEmps(emps);

            sqlSession.commit();


        finally 

            sqlSession.close();

        
    
  • 方式二
    这种方式需要数据库连接属性allowMultiQueries=true

dbconfig.properties:

jdbc.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&allowMultiQueries=true
 <insert id="addEmps">

        <foreach collection="emps" item = "emp" separator=";">
            INSERT INTO tb1_employee(last_name,email,gender,d_id)
            values
            (#emp.lastName,#emp.email,#emp.gender,#emp.dept.id)
        </foreach>

    </insert>

以上是关于[mybatis]动态sql_foreach_遍历集合&批量插入的主要内容,如果未能解决你的问题,请参考以下文章

MyBatis学习总结_11_MyBatis动态Sql语句

[刘阳Java]_MyBatis_动态SQL标签用法_第7讲

MyBatis_动态SQL

Mybatis之foreach用法----ListArrayMap三种类型遍历

[mybatis]动态sql_内置参数_parameter&_databaseid

mybatis动态sql中的两个内置参数(_parameter和_databaseId)