1. 程式人生 > >MyBatis_動態sql_foreach_mysql下foreach批量插入的兩種方式

MyBatis_動態sql_foreach_mysql下foreach批量插入的兩種方式

方法1:

筆記要點
出錯分析與總結
工程組織
資料庫組織
0.重新修改Bean類    修改
1.定義介面

//批量插入
    public void addEmps(@Param("emps")List<Employee> emps);

2.定義XML對映檔案

<!--//批量插入-->
    <!--public void addEmps(@Param("emps")List<Employee> emps);-->
    <insert id="addEmps">
        INSERT INTO tbl_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>

3.編寫測試程式碼

public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream 
= Resources.getResourceAsStream(resource); return new SqlSessionFactoryBuilder().build(inputStream); } @Test public void test12() throws Exception { SqlSession openSession = getSqlSessionFactory().openSession(); try { System.out.println("++++++++++---- 2.測試動態SQL: mysql下的foreach的批量插入"); EmployeeMapper_DynamicSQL mapper
= openSession.getMapper(EmployeeMapper_DynamicSQL.class); List<Employee> emps=new ArrayList<>(); emps.add(new Employee(null,"smith" ,"[email protected]" , "1", new Department(1))); emps.add(new Employee(null,"aliex" ,"[email protected]" , "0", new Department(1))); mapper.addEmps(emps); openSession.commit(); } finally { openSession.close(); } }

測試結果

++++++++++---- 2.測試動態SQL: mysql下的foreach的批量插入
DEBUG 12-05 16:43:52,848 ==>  Preparing: INSERT INTO tbl_employee(`last_name`,`email`,`gender`,`d_id`) VALUES (?,?,?,?) , (?,?,?,?)   (BaseJdbcLogger.java:145) 
DEBUG 12-05 16:43:52,873 ==> Parameters: smith(String), [email protected](String), 1(String), 1(Integer), aliex(String), [email protected](String), 0(String), 1(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 12-05 16:43:52,875 <==    Updates: 2  (BaseJdbcLogger.java:145) 

方法2:     使用多條mysql語句

1.開啟allowMultiQueries=true屬性--支援一次查詢多條語句, 進入全域性配置檔案中

2.定義XML對映檔案

   <insert id="addEmps">

        <foreach collection="emps" item="emp" separator=";">
            INSERT INTO tbl_employee(last_name,email,gender,d_id)
            VALUES (#{emp.lastName},#{emp.email},#{emp.gender},#{emp.dept.id});
        </foreach>
    </insert>

 

3.編寫測試程式碼

@Test
    public void test12() throws Exception {
        SqlSession openSession = getSqlSessionFactory().openSession();
        try {
            System.out.println("++++++++++---- 2-2.測試動態SQL: mysql下的foreach的批量插入");
            EmployeeMapper_DynamicSQL mapper = openSession.getMapper(EmployeeMapper_DynamicSQL.class);
            List<Employee> emps=new ArrayList<>();
            emps.add(new Employee(null,"smith2" ,"[email protected]" , "1",
                    new Department(1)));
            emps.add(new Employee(null,"aliex2" ,"[email protected]" , "0",
                    new Department(1)));
            mapper.addEmps(emps);

            openSession.commit();
        } finally {
            openSession.close();
        }
    }

 


測試結果

  idea環境下, 測試失敗!原因如下:

++++++++++---- 2-2.測試動態SQL: mysql下的foreach的批量插入
DEBUG 12-05 17:14:10,399 ==>  Preparing: INSERT INTO tbl_employee(last_name,email,gender,d_id) VALUES (?,?,?,?); ; INSERT INTO tbl_employee(last_name,email,gender,d_id) VALUES (?,?,?,?);   (BaseJdbcLogger.java:145) 
DEBUG 12-05 17:14:10,424 ==> Parameters: smith2(String), [email protected](String), 1(String), 1(Integer), aliex2(String), [email protected](String), 0(String), 1(Integer)  (BaseJdbcLogger.java:145) 

org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; 
            INSERT INTO tbl_employee(last_name,email,gender,d_id)
           ' at line 3
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: INSERT INTO tbl_employee(last_name,email,gender,d_id)             VALUES (?,?,?,?);          ;              INSERT INTO tbl_employee(last_name,email,gender,d_id)             VALUES (?,?,?,?);
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; 
            INSERT INTO tbl_employee(last_name,email,gender,d_id)
           ' at line 3
........
....