MyBatis?實現(xiàn)多對多中間表插入數(shù)據(jù)
多對多中間表插入數(shù)據(jù)
在做這個員工管理系統(tǒng)demo的時候,由于user和role是多對多關(guān)系,且user主鍵是自增的,所有我們沒辦法提前知曉這個user_id,所以插入的時候,就需要先插入user,然后再找到剛插入的id拿出來,再插入中間表user_role,這樣才能將表關(guān)系對應(yīng)起來,才能算一個完整的插入的過程。
所以現(xiàn)在的問題就是怎么知道這個user_id,再怎么拿出來,再插入中間表user_role。
方法
在MyBatis中要用到insert和update元素下的3個屬性:
useGeneratedKeys
(僅對 insert 和 update 有用)這會令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由數(shù)據(jù)庫內(nèi)部生成的主鍵(比如:像 MySQL 和 SQL Server 這樣的關(guān)系數(shù)據(jù)庫管理系統(tǒng)的自動遞增字段),默認值:false。keyProperty
(僅對 insert 和 update 有用)唯一標記一個屬性,MyBatis 會通過 getGeneratedKeys 的返回值或者通過 insert 語句的 selectKey 子元素設(shè)置它的鍵值,默認:unset。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。keyColumn
(僅對 insert 和 update 有用)通過生成的鍵值設(shè)置表中的列名,這個設(shè)置僅在某些數(shù)據(jù)庫(像 PostgreSQL)是必須的,當主鍵列不是表中的第一列的時候需要設(shè)置。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。
具體實現(xiàn)
1.插入user表,可以看到我們并沒有插入user_id這個屬性,因為是自增的。
<insert id="insert" useGeneratedKeys="true" keyProperty="user_id" keyColumn="user_id"> insert into user (user_name,user_gender,user_email,user_phone,user_address,user_birthday,department_id) values(#{user_name},#{user_gender},#{user_email},#{user_phone},#{user_address},#{user_birthday},#{department_id}) </insert>
2.重點是中間表user_role ,可以看到,我們直接就使用user下面的user_id了,我們也沒有做查詢操作,所以我們并不知曉它的具體值。
<insert id="insertUserRole"> insert into user_role values(#{user.user_id},#{role.role_id}) </insert>
3.test類,為了方便大家更好的理解,我們可以做一次測試。
通過下面代碼可以看到:我們在插入user后,就能夠把user_id打印出來,再插入到中間表中,并沒做其他諸如查詢的操作。
Date date = new Date(); User user = new User("mike33", "male", "axxxx@163.com", "183xxxxxxxx", "chengdu", date, 1); Role role = new Role(); role.setRole_id(4); //插入user service.insert(user); //打印user_id System.out.println("user_id----->>>>" + user.getUser_id()); //插入中間表 service.insertUserRole(user, role);
結(jié)果:可以看到我們直接插入后,就能取得user_id了,然后再插入中間表,這就解決了這個問題。
當然由于插入一個新的user,必須同時滿足user和role的映射,所以這里使用Spring transaction來保證這個插入過程的完整性。
使用注解方式實現(xiàn)。
@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED) public void insertUserRole(User user, Role role) { this.insert(user); mapper.insertUserRole(user, role); }
多對多的關(guān)聯(lián)表中,如何同時插入數(shù)據(jù)的學(xué)習(xí)心得
今天在寫學(xué)校的實訓(xùn)項目時,遇到如下問題,一個實體類與另一個實體類是多對多的關(guān)系,且有個實體類中所存儲的是另一個實體類的集合,所以在進行插入操作是,要同時向兩張表中插入數(shù)據(jù),現(xiàn)在已經(jīng)得到解決辦法。
Student類:
?? ?public class Student implements Serializable { ?? ? ? ?private Integer id; ?? ? ? ?private String name; ?? ? ? ?private Integer age; ?? ? ? ?private String bir; ?? ? ? ?private String phone; ?? ? ? ?private String qq; ?? ? ? ?private String attr; ?? ? ? ?private String starts; ?? ? ? ?private String mark; ?? ? ? ?private Integer cityId; ?? ? ? ?private Integer clazzId; ?? ? ? ?private Integer groupId; ?? ? ? ?private String cityName; ?? ? ? ?private String clazzName; ?? ? ? ?private String groupName; ?? ? ? ?private List<Tag> tagList; ?? ?}
Tag表:
public class Tag implements Serializable { ? ? private Integer id; ? ? private String name; ? ? private String type; ? ? private Date createtime; }
有如下需求,在插入學(xué)生時,學(xué)生會有很多的標簽(tag),在頁面?zhèn)骰財?shù)據(jù)是,用了一個tagList集合來接收,現(xiàn)在要將學(xué)生的信息插入到學(xué)生表中,然后將學(xué)生的標簽放在另一張關(guān)聯(lián)表中。
插入步驟
步驟一:
先插入學(xué)生信息:
<insert id="save" useGeneratedKeys="true" keyProperty="id" keyColumn="id" > insert into t_student(name, age, bir, phone, qq, attr, starts, mark, cityid, clazzid, groupid) values(#{name}, #{age}, #{bir},#{phone},#{qq},#{attr},#{starts},#{mark},#{cityId},#{clazzId},#{groupId}) </insert> // useGeneratedKeys 是否以jdbc的方式將插入后的自增主鍵又返回個實體類 // keyProperty 實體類中對應(yīng)的主鍵屬性名 // keyCloumn 數(shù)據(jù)庫中對應(yīng)的主鍵屬性名
2.插入關(guān)聯(lián)表數(shù)據(jù)
<insert id="saveStudentTag" parameterType="com.lbw.ems.entity.Student"> insert into t_student_tag(studentid, tagid) values <foreach collection="tagList" item="tag" separator=","> (#{id}, #{tag.id}) </foreach> </insert> // 因為此時我們需要當前的學(xué)生的Id,所以我們的參數(shù)類型還是一個Student類,在插入是,我們需要的是Student類中tagList集合中所有的id 所以使用了foreach標簽 // foreach標簽 遍歷array、list、map(我只用過list) // collection 填你想要遍歷的集合在實體類中對應(yīng)的屬性名 // item 將每次遍歷出來的對象取一個名字,不然不好取值,尤其是在兩個實體類的字段名相同的時候,真的難頂 // sparator="," 每遍歷一次后,在后面加上你所填的符
結(jié)果測試
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決Mybatis中mapper.xml文件update,delete及insert返回值問題
這篇文章主要介紹了解決Mybatis中mapper.xml文件update,delete及insert返回值問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11Java深入了解數(shù)據(jù)結(jié)構(gòu)之棧與隊列的詳解
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊列,在Java的時候,對于棧與隊列的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學(xué)習(xí)時候能夠有扎實的基礎(chǔ)能力。本文小編就來詳細說說Java中的棧與隊列,需要的朋友可以參考一下2022-01-01SpringBoot實現(xiàn)短鏈接系統(tǒng)的使用示例
由于短鏈接可能涉及到用戶隱私和安全問題,所以短鏈接系統(tǒng)也需要符合相關(guān)的數(shù)據(jù)保護和安全標準,本文主要介紹了SpringBoot實現(xiàn)短鏈接系統(tǒng)的使用示例,感興趣的可以了解一下2023-09-09java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):單,雙向鏈表
這篇文章主要介紹了Java的數(shù)據(jù)解構(gòu)基礎(chǔ),希望對廣大的程序愛好者有所幫助,同時祝大家有一個好成績,需要的朋友可以參考下,希望能給你帶來幫助2021-07-07