欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis?實(shí)現(xiàn)多對(duì)多中間表插入數(shù)據(jù)

 更新時(shí)間:2022年02月28日 09:29:11   作者:黃國攀  
這篇文章主要介紹了MyBatis?實(shí)現(xiàn)多對(duì)多中間表插入數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

多對(duì)多中間表插入數(shù)據(jù)

在做這個(gè)員工管理系統(tǒng)demo的時(shí)候,由于user和role是多對(duì)多關(guān)系,且user主鍵是自增的,所有我們沒辦法提前知曉這個(gè)user_id,所以插入的時(shí)候,就需要先插入user,然后再找到剛插入的id拿出來,再插入中間表user_role,這樣才能將表關(guān)系對(duì)應(yīng)起來,才能算一個(gè)完整的插入的過程。

所以現(xiàn)在的問題就是怎么知道這個(gè)user_id,再怎么拿出來,再插入中間表user_role。

方法

在MyBatis中要用到insert和update元素下的3個(gè)屬性:

  • useGeneratedKeys (僅對(duì) insert 和 update 有用)這會(huì)令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法來取出由數(shù)據(jù)庫內(nèi)部生成的主鍵(比如:像 MySQL 和 SQL Server 這樣的關(guān)系數(shù)據(jù)庫管理系統(tǒng)的自動(dòng)遞增字段),默認(rèn)值:false。
  • keyProperty (僅對(duì) insert 和 update 有用)唯一標(biāo)記一個(gè)屬性,MyBatis 會(huì)通過 getGeneratedKeys 的返回值或者通過 insert 語句的 selectKey 子元素設(shè)置它的鍵值,默認(rèn):unset。如果希望得到多個(gè)生成的列,也可以是逗號(hào)分隔的屬性名稱列表。
  • keyColumn (僅對(duì) insert 和 update 有用)通過生成的鍵值設(shè)置表中的列名,這個(gè)設(shè)置僅在某些數(shù)據(jù)庫(像 PostgreSQL)是必須的,當(dāng)主鍵列不是表中的第一列的時(shí)候需要設(shè)置。如果希望得到多個(gè)生成的列,也可以是逗號(hào)分隔的屬性名稱列表。

具體實(shí)現(xiàn)

1.插入user表,可以看到我們并沒有插入user_id這個(gè)屬性,因?yàn)槭亲栽龅摹?/p>

<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.重點(diǎn)是中間表user_role ,可以看到,我們直接就使用user下面的user_id了,我們也沒有做查詢操作,所以我們并不知曉它的具體值。

<insert id="insertUserRole">
        insert into user_role values(#{user.user_id},#{role.role_id})
    </insert>

3.test類,為了方便大家更好的理解,我們可以做一次測試。

通過下面代碼可以看到:我們?cè)诓迦雞ser后,就能夠把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了,然后再插入中間表,這就解決了這個(gè)問題。

當(dāng)然由于插入一個(gè)新的user,必須同時(shí)滿足user和role的映射,所以這里使用Spring transaction來保證這個(gè)插入過程的完整性。

使用注解方式實(shí)現(xiàn)。

@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED)
    public void insertUserRole(User user, Role role) {
        this.insert(user);
        mapper.insertUserRole(user, role);
    }

多對(duì)多的關(guān)聯(lián)表中,如何同時(shí)插入數(shù)據(jù)的學(xué)習(xí)心得

今天在寫學(xué)校的實(shí)訓(xùn)項(xiàng)目時(shí),遇到如下問題,一個(gè)實(shí)體類與另一個(gè)實(shí)體類是多對(duì)多的關(guān)系,且有個(gè)實(shí)體類中所存儲(chǔ)的是另一個(gè)實(shí)體類的集合,所以在進(jìn)行插入操作是,要同時(shí)向兩張表中插入數(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é)生時(shí),學(xué)生會(huì)有很多的標(biāo)簽(tag),在頁面?zhèn)骰財(cái)?shù)據(jù)是,用了一個(gè)tagList集合來接收,現(xiàn)在要將學(xué)生的信息插入到學(xué)生表中,然后將學(xué)生的標(biāo)簽放在另一張關(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的方式將插入后的自增主鍵又返回個(gè)實(shí)體類
// keyProperty 實(shí)體類中對(duì)應(yīng)的主鍵屬性名
// keyCloumn 數(shù)據(jù)庫中對(duì)應(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>
// 因?yàn)榇藭r(shí)我們需要當(dāng)前的學(xué)生的Id,所以我們的參數(shù)類型還是一個(gè)Student類,在插入是,我們需要的是Student類中tagList集合中所有的id
所以使用了foreach標(biāo)簽
// foreach標(biāo)簽 遍歷array、list、map(我只用過list)
// collection 填你想要遍歷的集合在實(shí)體類中對(duì)應(yīng)的屬性名
// item 將每次遍歷出來的對(duì)象取一個(gè)名字,不然不好取值,尤其是在兩個(gè)實(shí)體類的字段名相同的時(shí)候,真的難頂
// sparator="," 每遍歷一次后,在后面加上你所填的符

結(jié)果測試

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決Mybatis中mapper.xml文件update,delete及insert返回值問題

    解決Mybatis中mapper.xml文件update,delete及insert返回值問題

    這篇文章主要介紹了解決Mybatis中mapper.xml文件update,delete及insert返回值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Springmvc國際化自動(dòng)配置代碼實(shí)現(xiàn)

    Springmvc國際化自動(dòng)配置代碼實(shí)現(xiàn)

    這篇文章主要介紹了Springmvc國際化自動(dòng)配置代碼實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • java線程組構(gòu)造方法源碼解析

    java線程組構(gòu)造方法源碼解析

    這篇文章主要為大家介紹了java線程組構(gòu)造方法源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Netty實(shí)現(xiàn)簡易版的RPC框架過程詳解

    Netty實(shí)現(xiàn)簡易版的RPC框架過程詳解

    這篇文章主要為大家介紹了Netty實(shí)現(xiàn)簡易版的RPC框架過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Java深入了解數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列的詳解

    Java深入了解數(shù)據(jù)結(jié)構(gòu)之棧與隊(duì)列的詳解

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)中的棧與隊(duì)列,在Java的時(shí)候,對(duì)于棧與隊(duì)列的應(yīng)用需要熟練的掌握,這樣才能夠確保Java學(xué)習(xí)時(shí)候能夠有扎實(shí)的基礎(chǔ)能力。本文小編就來詳細(xì)說說Java中的棧與隊(duì)列,需要的朋友可以參考一下
    2022-01-01
  • SpringBoot實(shí)現(xiàn)短鏈接系統(tǒng)的使用示例

    SpringBoot實(shí)現(xiàn)短鏈接系統(tǒng)的使用示例

    由于短鏈接可能涉及到用戶隱私和安全問題,所以短鏈接系統(tǒng)也需要符合相關(guān)的數(shù)據(jù)保護(hù)和安全標(biāo)準(zhǔn),本文主要介紹了SpringBoot實(shí)現(xiàn)短鏈接系統(tǒng)的使用示例,感興趣的可以了解一下
    2023-09-09
  • java實(shí)現(xiàn)文件下載的兩種方式

    java實(shí)現(xiàn)文件下載的兩種方式

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件下載的兩種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java中Lambda表達(dá)式使用詳細(xì)解讀

    Java中Lambda表達(dá)式使用詳細(xì)解讀

    這篇文章主要介紹了Java中Lambda表達(dá)式使用及詳解,lambda運(yùn)行將函數(shù)作為一個(gè)方法的參數(shù),也就是函數(shù)作為參數(shù)傳遞到方法中,使用lambda表達(dá)式可以讓代碼更加簡潔,需要的朋友可以參考下
    2023-04-04
  • java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):單,雙向鏈表

    java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):單,雙向鏈表

    這篇文章主要介紹了Java的數(shù)據(jù)解構(gòu)基礎(chǔ),希望對(duì)廣大的程序愛好者有所幫助,同時(shí)祝大家有一個(gè)好成績,需要的朋友可以參考下,希望能給你帶來幫助
    2021-07-07
  • SpringBoot?屬性配置中獲取值的方式

    SpringBoot?屬性配置中獲取值的方式

    這篇文章主要介紹了SpringBoot?屬性配置中獲取值的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評(píng)論