java Mybatis使用生成的密钥进行批量插入

5ssjco0h  于 4个月前  发布在  Java
关注(0)|答案(3)|浏览(67)

我已经在Mybatis中做了批量插入,它工作得很好。但是我不确定如何在bean类中存储每行的生成的主键。下面是我的代码,
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 (name) values (#{element.name})
            </foreach>
            SELECT * FROM dual
        </insert>
    </mapper>

字符串
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;
}
}


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;
}
}


在上面的示例中,Employee是要持久化在数据库中的对象,其中包含Emp列表。

oxf4rvwz

oxf4rvwz1#

尝试在插入块中使用useGeneratedKeys="true" keyProperty="id" keyColumn="id"

<insert id="insertEmployeeList" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id"  keyColumn="id">
INSERT ALL
  <foreach collection="list" item="element" index="index">
    INTO EMPLOYEE (name) values (#{element.name})
  </foreach>
</insert>

字符串
为什么用select做内部插入?只是想知道。

fhity93d

fhity93d2#

但是我不确定如何在bean类中存储为每行生成的主键。
如果你想用pojoMap生成的主键,那么在insert xml中的foreach就不起作用了。你必须用useGeneratedKeys=“true”写一个简单的insert,并为你想持久化的每条记录调用它。
我已经给出了详细的回答here

omtl5h9j

omtl5h9j3#

对于任何使用@Annotations遇到此问题的人。
重点是使用“list”作为参数,并在生成的键中调用它。同时确保使用@Insert作为注解。

@Insert("""
                <script>
                INSERT INTO myTable (
                    value_x,
                    username
                    ) VALUES
                <foreach collection='list' item='item'  separator=','>
              ( #item.myValue, #{username} )
               </foreach>
               </script>
            """)
    @Options(useGeneratedKeys = true, keyColumn = "my_id_name_generated", keyProperty = "list.myNameVariableId")
    void insertAllObjects(@Param("list")List<Object> listObjects, String username);

字符串

相关问题