MyBatis批量插入返回主鍵


  網上有很多人說MyBatis不支持批量插入並且返回主鍵,其實這種說法有一定的誤解,如果你想讓MyBatis直接返回一個包含主鍵的list,即mapper接口中批量插入方法的返回值為List<Integer>,這樣的確是不行的

  例如:錄入學生成績

  數據庫:mysql

//錯誤的寫法
public List<Integer> batchInsert(List<Student> students);

  這種想法是錯誤的,為了把這個錯誤解釋得明白一點,我們還是先看看單條插入的時候是如何返回主鍵的吧,下面是MyBatis官方文檔

  也就是說只要在insert標簽里加入useGeneratedKeys="true"和keyProperty="id"即可,mapper接口這樣寫

public int insert(Student student);

  xml

<insert id="insert" useGeneratedKeys="true" keyProperty="id">
    insert into student (name, score) values (#{name}, #{score})
</insert>

  運行之后會發現,返回值始終是1,也就是返回值是受影響的行數。返回的主鍵實際上被映射到了參數student的id屬性中,只需student.getId()即可得到

Student student = new Student("小明", 77);
int line = mapper.insert(student);
System.out.println("受影響的行數:" + line);
System.out.println("返回的主鍵:" + student.getId());

  運行結果:

  接下來說批量插入,其實一樣的原理,下面是官方文檔,使用foreach批量插入,返回主鍵的方法還是那樣

  mapper接口

public int batchInsert(List<Student> students);

  xml

<insert id="batchInsert" useGeneratedKeys="true" keyProperty="id">
    insert into student (name, score) values
    <foreach collection="list" item="item" index="index" separator=",">
        (#{item.name}, #{item.score})
    </foreach>
</insert>

  測試插入

復制代碼
List<Student> students = new ArrayList<Student>();
Student tom = new Student("Tom", 88);
Student jerry = new Student("Jerry", 99);
students.add(tom);
students.add(jerry);
int line = mapper.batchInsert(students);
System.out.println("受影響的行數:" + line);
for (Student student : students) {
    System.out.println("返回的主鍵:" + student.getId());
}
復制代碼

  運行結果

  綜上,MyBatis是可以批量插入並返回主鍵的,不過返回的主鍵不是在mapper接口的返回值里面(有點繞,其實很簡單),而是映射到了參數的id屬性里面。因此keyProperty的值必須和參數的主鍵屬性保持一致。

 內容轉自 https://www.cnblogs.com/zephyrus/archive/2017/08/21/7403127.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM