programing

MyBatis 목록 삽입 값

instargram 2023. 7. 21. 20:33
반응형

MyBatis 목록 삽입 값

Mapper.xml(Mapper xml 파일)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="TestDAO">
<insert id="insertEmployeeList" parameterType="java.util.List">
INSERT INTO EMPLOYEE (id, name) VALUES
<foreach collection="list" item="element" index="index" open="(" separator=","  close=")">
#{element.id}, #{element.name}
</foreach>
</insert>
</mapper>

Employee.java

public class Employee {
  private List<Emp> list = new ArrayList<Emp>();
  public List<Emp> getList() {
    return list;
  }
  public void setList(List<Emp> list) {
    this.list = list;
  }
}

자바 황후

public class Emp {
  public Emp(int id, String name) {
    this.id = id;
    this.name = name;
  }
  private int id;
  private String name;
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

DAO.java 테스트

public interface TestDAO {
public Integer insertEmployeeList(List<Emp> empList) throws SQLException;
}

메인.자바

public class Main {
   public static void main (String args[]) {
       TestDAO tm = session.getMapper(TestDAO.class);
       Employee e = new Employee();
       Emp e11 = new Emp(123,"abc");
       Emp e12 = new Emp(456,"def");
       e.getList().add(e11);
       e.getList().add(e12);
       tm.insertEmployeeList(e.getList());
   }
}

예외는 다음과 같습니다.

Error updating database.  Cause: java.sql.SQLSyntaxErrorException: ORA-00913: too many values
The error may involve com.XXXX.sample.test.dao.TestDAO.insertEmployeeList-Inline
The error occurred while setting parameters
Cause: java.sql.SQLSyntaxErrorException: ORA-00913: too many values

MySQL을 데이터베이스로 사용하면서 몇 번 시도한 결과 이렇게 되었습니다.

<insert id="insert" parameterType="java.util.List">
    INSERT INTO games (
    id,
    game_id,
    game_vendor,
    game_code,
    game_name,
    game_type)
    VALUES
    <foreach collection="list" item="element" index="index" open="(" separator="),("  close=")">
        #{element.id},
        #{element.gameId},
        #{element.gameVendor},
        #{element.gameCode},
        #{element.gameName},
        #{element.gameType},
    </foreach>
</insert>

Mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.xxxx.sample.test.dao.TestDAO">
  <insert id="insertEmployeeList" parameterType="java.util.List">
   INSERT ALL  
    <foreach collection="list" item="element" index="index" >
     INTO EMPLOYEE (id,name) values (#{element.id},#{element.name})
    </foreach>
   SELECT * FROM dual
 </insert>
</mapper>

이것이 매퍼 xml에서 쿼리가 있어야 하는 방식입니다.

주석(@org.apache.ibatis)을 사용할 수 있습니다.주석삽입)은 전체 목록에 대해 단일 삽입을 실행합니다.

기억: SQL 공급자 클래스가 필요하지 않습니다.

public interface SomethingMapper {

    @Insert({
        "<script>",
        "INSERT INTO your_database_name.your_table_name",
            "(column1_int, column2_str, column3_date, column4_time)",
        "VALUES" +  
            "<foreach item='each_item_name' collection='theCollection' open='' separator=',' close=''>" +
                "(" +
                    "#{each_item_name.column1,jdbcType=INTEGER},",
                    "#{each_item_name.column2,jdbcType=VARCHAR},",
                    "(SELECT SOME_DB_FUNCTION(#{each_item_name.column3,jdbcType=DATE})),",
                    "#{each_item_name.period.start,jdbcType=TIME}" +
                ")" +
            "</foreach>",
    "</script>"})
    void insertBatchSomething(@Param("theCollection") List<Something> theCollection);

}

두 가지 항목이 있는 경우 SQL 출력:

SQL: INSERT INTO your_database_name.your_table_name (column1_int, column2_str, column3_date, column4_time) VALUES (?, ?, (SELECT SOME_DB_FUNCTION(?)), ?), (?, ?, (SELECT SOME_DB_FUNCTION(?)), ?)

추신.

@Insert는 String[]을 수신하므로 각 값에 대해 Strings 사이에 공백을 추가합니다.

생성된 쿼리를 출력하도록 로깅 시스템을 구성한 다음 DB로 직접 실행해 보십시오.

당신의 경우, 예상되는 쿼리는

INSERT INTO EMPLOYEE (id, name) VALUES
(123, "abc")(456, "def")

제가 기억하는 한 그것은 유효하지 않습니다.INSERT INTO한 세트만 사용VALUES제가 서류를 찾아봤는데 거기도 이렇게 나와 있어요.

방법에 대한 다음 답변 참조INSERT오라클의 여러 행입니다.

[tistory]http://woniperstory.tistory.com/194 : 이 링크는 정답을 보여줍니다!!!

public  someClass {

    public void someMethod() {

        Map<String,Object> map =  new HashMap<String,Object>() ;
        List<Emp> list =  new ArrayList<Emp>() ;

        ::::  add Emp Objects to list

        map.put("list", list)

        public Integer insertEmployeeList(map) ;
    }
}

public interface TestDAO {
    public Integer insertEmployeeList(Map<String,Object> map) throws SQLException;
}

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"  
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
<mapper namespace="TestDAO">  
<insert id="insertEmployeeList" parameterType="java.util.Map">  
INSERT INTO EMPLOYEE (id, name) VALUES  
<foreach collection="list" item="element" index="index" separator=",">  
    ( #{element.id}, #{element.name} )  
</foreach>  
</insert>  
</mapper>  

언급URL : https://stackoverflow.com/questions/17563463/mybatis-insert-list-values

반응형