Mapper.xml (fichier xml Mapper)
<?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;
}
}
Emp.Java
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;
}
}
TestDAO.Java
public interface TestDAO {
public Integer insertEmployeeList(List<Emp> empList) throws SQLException;
}
Main.Java
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());
}
}
L'exception que je reçois est:
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
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>
Voici comment la requête devrait être là dans Mapper xml
Comme j'utilise MySQL comme base de données, après quelques essais, c'est ainsi que cela a fonctionné pour moi.
<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>
Vous pouvez utiliser des annotations (@ org.Apache.ibatis.annotations.Insert) pour exécuter une seule insertion pour l'ensemble de votre liste.
N'oubliez pas: Vous n'aurez pas besoin d'une classe de fournisseur 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);
}
Sortie SQL si vous avez 2 éléments:
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(?)), ?)
P.S.
@ Insert reçoit une chaîne [], donc pour chaque valeur, il ajoutera un espace entre les chaînes.
Configurez votre système de journalisation pour imprimer les requêtes générées, puis essayez de les exécuter directement dans votre base de données.
Dans votre cas, la requête attendue DEVRAIT être
INSERT INTO EMPLOYEE (id, name) VALUES
(123, "abc")(456, "def")
pour autant que je me souvienne, ce n'est pas valable. INSERT INTO
ne prend qu'un seul jeu de VALUES
. J'ai recherché le documentation et ça ressemble à ça là aussi.
Voir cette réponse sur la façon de INSERT
plusieurs lignes dans Oracle.
[histoire] http://woniperstory.tistory.com/194 : Ce lien montre la bonne réponse !!!
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>