반응형
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
반응형
'programing' 카테고리의 다른 글
서로 다른 마이크로 서비스 간의 데이터 검증 (0) | 2023.07.21 |
---|---|
봄 웹 플럭스에서 반응형 전자 메일을 보내는 방법 (0) | 2023.07.21 |
postgresql의 권고 잠금 시간 초과 (0) | 2023.07.21 |
es6 스타일 가져오기를 사용하여 MongoDB를 가져오는 방법은 무엇입니까? (0) | 2023.07.16 |
워크시트 기능과 함께 1004 오류를 처리하는 방법.V 룩업? (0) | 2023.07.16 |