亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

mybatis如何批量添加一對多中間表

 更新時間:2022年02月28日 08:54:37   作者:菜雞rick  
這篇文章主要介紹了mybatis如何批量添加一對多中間表,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

批量添加一對多中間表

建立中間表A,一個id對應多個lid;

傳入兩條參數(shù)

long id;//單個數(shù)值
List lid;//集合數(shù)值

dao層語句

int insertb(@Param("id")long id,@Param("lid")List lid);

mybatis中的寫法

insert into A(id,lid) values
? ? ? ? <foreach collection="lid" item="data" separator=",">
? ? ? ? ? ? (#{id},#{data})
? ? ? ? </foreach>

多對多條件下插入中間表(使用insert標簽的屬性)

說下需求

我的數(shù)據(jù)庫中有兩張表,一張是Blog表,一張是Type表,分別代表了博客和博客類別,它們之間是多對多關系,它們由一張中間表blog_type維護。

(簡單起見,blog表只有兩個數(shù)據(jù),id和title。type表只有id和name)

那么需求就是:

現(xiàn)在我想插入一條Blog數(shù)據(jù),因為blog和type是多對多關系,想插入其中一個數(shù)據(jù),就得維護他們之間那個中間表blog_type的關系(插入中間表字段)。

解決方案

那么我能想到的解決方案是:

寫兩段insert標簽,第一段sql語句插入blog表,第二段sql語句插入insert表:

    <insert id="insertBlogWithoutType" parameterType="blog">
        insert into t_blog (title)
        values (#{title});
    </insert>
    <insert id="insertBlog_Type">
        insert into blog_type (bid, tid) values(#{blog.id},#{type.id})
    </insert>

但是這么做會有它的問題

由于blog表id為自增,所以我并沒有插入id。如何在第二個insert查詢語句中獲取剛剛插入的id呢?

經(jīng)過多方查找我發(fā)現(xiàn)了解決方案:

要用到MyBatis中insert標簽的三個屬性:

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

重新生成的代碼如下所示:

    <insert id="insertBlogWithoutType" parameterType="blog" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
        insert into t_blog (title)
        values (#{title});
    </insert>
    <insert id="insertBlog_Type">
        insert into blog_type (bid, tid) values(#{blog.id},#{type.id})
    </insert>

注意!keyProperty是Java對象的屬性名!不是數(shù)據(jù)庫表中字段名!

測試

編寫Dao層

//分成兩個方法,但是他們兩個將在Service層合二為一
    int insertBlogWithoutType(Blog blog);
    int insertBlog_Type(@Param("blog")Blog blog, @Param("type")Type type);

Dao層就是對應的前面mapper文件里的兩個方法

Service層

public void insertBlog(Blog blog, List<Type> types) {
        blogDao.insertBlogWithoutType(blog);
        for (Type type : types) {
            blogDao.insertBlog_Type(blog, type);
        }
    }

這里的意思是,先插入一個傳進來的blog(第一個參數(shù))。然后插入之后根據(jù)插進來的blog的主鍵(blog的id)和傳入的type的主鍵(type的id),插入中間表。

Test類

@Test
    public void test2(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        BlogService blogServiceImpl = (BlogService) context.getBean("BlogServiceImpl");
        //設置blog
        Blog blog = new Blog();
        blog.setTitle("【MyBatis】多對多條件下插入中間表(使用insert標簽的屬性)");
        
        //設置該blog對應的type
        List<Type> types = new ArrayList<Type>();
        types.add(new Type(1,"數(shù)據(jù)庫"));
        types.add(new Type(2,"Debug專題"));
        blogServiceImpl.insertBlog(blog, types);
    }

可以看到,設置blog的時候,并沒有設置blog的id屬性,但是調用insertBlog時,插入中間表卻已經(jīng)知道了blog的id屬性。這就是MyBatis中insert標簽的三個屬性的作用了!

執(zhí)行完上面的代碼,數(shù)據(jù)庫里既插入了一條新的blog,又維護了他們之間那個中間表blog_type的關系(插入了中間表),至此問題解決。

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

相關文章

  • DragChartPanel可拖拽曲線應用詳解

    DragChartPanel可拖拽曲線應用詳解

    這篇文章主要為大家詳細介紹了DragChartPanel可拖拽曲線的應用,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Springboot的yml配置文件用法

    Springboot的yml配置文件用法

    這篇文章主要介紹了Springboot的yml配置文件用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Spring Boot 動態(tài)數(shù)據(jù)源示例(多數(shù)據(jù)源自動切換)

    Spring Boot 動態(tài)數(shù)據(jù)源示例(多數(shù)據(jù)源自動切換)

    本篇文章主要介紹了Spring Boot 動態(tài)數(shù)據(jù)源示例(多數(shù)據(jù)源自動切換),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • spring boot 如何請求后綴匹配

    spring boot 如何請求后綴匹配

    這篇文章主要介紹了spring boot 請求后綴匹配的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 簡單的java讀取文件示例分享

    簡單的java讀取文件示例分享

    這篇文章主要介紹了java讀取txt文件內容,示例很簡單,代碼里有注釋,大家直接看代碼吧
    2014-01-01
  • springboot?正確的在異步線程中使用request的示例代碼

    springboot?正確的在異步線程中使用request的示例代碼

    這篇文章主要介紹了springboot中如何正確的在異步線程中使用request,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • MyBatis逆向?程的生成過程

    MyBatis逆向?程的生成過程

    MyBatis官方為我們提供了一個逆向工程,通過這個逆向工程,只要建立好數(shù)據(jù)表,那么MyBatis就會根據(jù)這個表自動生成pojo類、dao接口、sql映射文件
    2023-02-02
  • Java兩種方式實現(xiàn)動態(tài)代理

    Java兩種方式實現(xiàn)動態(tài)代理

    Java 在 java.lang.reflect 包中有自己的代理支持,該類(Proxy.java)用于動態(tài)生成代理類,只需傳入目標接口、目標接口的類加載器以及 InvocationHandler 便可為目標接口生成代理類及代理對象。我們稱這個Java技術為:動態(tài)代理
    2020-10-10
  • 一文詳解Spring是怎么讀取配置Xml文件的

    一文詳解Spring是怎么讀取配置Xml文件的

    這篇文章主要介紹了一文詳解Spring是怎么讀取配置Xml文件的,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-08-08
  • Spring和MyBatis整合自動生成代碼里面text類型遇到的坑

    Spring和MyBatis整合自動生成代碼里面text類型遇到的坑

    Spring和MyBatis整合以后,使用自動生成代碼工具生成dao和mapper配置文件。下面通過本文給大家介紹Spring和MyBatis整合自動生成代碼里面text類型遇到的坑,需要的朋友參考下吧
    2018-01-01

最新評論