最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis?<foreach>標(biāo)簽動(dòng)態(tài)增刪改查方式

 更新時(shí)間:2022年03月11日 15:12:40   作者:如漩渦  
這篇文章主要介紹了mybatis?<foreach>標(biāo)簽動(dòng)態(tài)增刪改查方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

<foreach>標(biāo)簽動(dòng)態(tài)增刪改查

mybatis<foreach>

有的時(shí)候在項(xiàng)目中需要查詢(xún)某個(gè)列表時(shí),可能會(huì)在代碼中進(jìn)行嵌套循環(huán)再取值,其實(shí)mybatis提供了這么一個(gè)標(biāo)簽,可以在SQL中進(jìn)行循環(huán)(是不是很酸爽)

先來(lái)了解一下foreach這個(gè)標(biāo)簽有哪些元素:

  • item:表示集合中每一個(gè)元素進(jìn)行迭代時(shí)的別名
  • index:指定一個(gè)名字,用于表示在迭代過(guò)程中,每次迭代到的位置
  • open:表示該語(yǔ)句以什么開(kāi)始
  • separator:表示在每次進(jìn)行迭代之間以什么符號(hào)作為分隔符
  • close:表示以什么結(jié)束
  • collection:被循環(huán)的集合或者數(shù)組

注意:

在使用foreach的時(shí)候最關(guān)鍵的也是最容易出錯(cuò)的就是collection屬性,該屬性是必須指定的,但是在不同情況下,該屬性的值是不一樣的,主要有一下3種情況:

  • 如果傳入的是單參數(shù)且參數(shù)類(lèi)型是一個(gè)List的時(shí)候,collection屬性值為list
  • 如果傳入的是單參數(shù)且參數(shù)類(lèi)型是一個(gè)array數(shù)組的時(shí)候,collection的屬性值為array
  • 如果傳入的參數(shù)是多個(gè)的時(shí)候,我們就需要把它們封裝成一個(gè)Map或者Object。

實(shí)戰(zhàn)

話不多說(shuō),看代碼,首先是mybatis的XML如何寫(xiě),拿動(dòng)態(tài)創(chuàng)建表為例子,什么是動(dòng)態(tài)創(chuàng)建表,就是可以隨便生成表名,字段是傳入進(jìn)來(lái)的集合數(shù)組,根據(jù)這個(gè)數(shù)組內(nèi)容來(lái)創(chuàng)建字段

<update id="createTable" parameterType="java.util.HashMap">
? ? ? ? CREATE TABLE IF NOT EXISTS ed_temp_${tableName}(
? ? ? ? id VARCHAR(32) NOT NULL,
? ? ? ? log_id VARCHAR(32),
? ? ? ? state INT,
? ? ? ? message VARCHAR(255)
? ? ? ? <foreach collection="list" item="column" open="," separator="VARCHAR(255),"
? ? ? ? ? ? ? ? ?close="VARCHAR(255), PRIMARY KEY (id)">
? ? ? ? ? ? ${column.name}
? ? ? ? </foreach>
? ? ? ? ) ENGINE = InnoDB DEFAULT CHARSET = utf8;
? ? </update>

這個(gè)<foreach>看出,我傳入的叫一個(gè)list的集合,別名叫column,從,開(kāi)始,因?yàn)樯厦鎚essage少個(gè)逗號(hào),中間用VARCHAR(255),做分隔符,已什么為結(jié)束都定義好了。

看Mapper類(lèi)

/**
? ? ?* 動(dòng)態(tài)創(chuàng)建表
? ? ?*/
? ? void createTable(HashMap<String , Object> map);

看實(shí)現(xiàn)

? ? /**
? ? ?* 創(chuàng)建表
? ? ?* @param templateId 模板id
? ? ?*/
? ? private void createTable(String templateId){
? ? ? ? List<EdTemplateField> fields = edTemplateFieldMapper.findByTemplate(templateId);
? ? ? ? List<EdFieldColumns> columns = new ArrayList<>();
? ? ? ? HashMap<String,Object> map = new HashMap<>(16);
? ? ? ? map.put("tableName",templateId);
? ? ? ? for (EdTemplateField field : fields) {
? ? ? ? ? ? columns.add(edFieldColumnsMapper.findByField(field.getId()).get(0));
? ? ? ? }
? ? ? ? map.put("list",columns);
? ? ? ? edTemplateMapper.createTable(map);
? ? }

邏輯是這樣的,通過(guò)傳入的ID,去尋找所需要的值,再創(chuàng)建一個(gè)List和一個(gè)Map,將表名放進(jìn)來(lái),在將需要的數(shù)組放進(jìn)來(lái),調(diào)用mapper的方法,最后就能成功創(chuàng)建一張動(dòng)態(tài)表

往這個(gè)動(dòng)態(tài)表里插入數(shù)據(jù)的方式也用到了<foreach>,應(yīng)該說(shuō)不得不用,不然怎么插入,又不知道表名又沒(méi)有實(shí)體類(lèi)

XML

? ? <insert id="tableInsert" parameterType="java.util.HashMap">
? ? ? ? INSERT INTO ed_temp_${tableName}(
? ? ? ? id,log_id,state,message
? ? ? ? <foreach collection="columns" item="column" open="," separator="," >
? ? ? ? ? ? ${column.name}
? ? ? ? </foreach>
? ? ? ? )VALUES(
? ? ? ? <foreach collection="values" item="value" open="REPLACE(UUID(),'-','')," separator="," >
? ? ? ? ? ? #{value}
? ? ? ? </foreach>
? ? ? ? )
? ? </insert>

兩個(gè)<foreach>標(biāo)簽,一個(gè)是字段,剛剛那個(gè)動(dòng)態(tài)建表的字段,一個(gè)是值

mapper類(lèi)

/**
? ? ?* 動(dòng)態(tài)插入
? ? ?* @param map
? ? ?*/
? ? void tableInsert(HashMap<String,Object> map);

實(shí)現(xiàn)方法

/**
? ? ?* 保存數(shù)據(jù)到臨時(shí)表
? ? ?* @param templateId 模板id
? ? ?* @param list 數(shù)據(jù)集合
? ? ?* @param hearTitle 數(shù)據(jù)對(duì)應(yīng)的字段
? ? ?*/
? ? private void tableInsert(String templateId,List<String> list,List<String> hearTitle){
? ? ? ? ?List<EdFieldColumns> columns = new ArrayList<>();
? ? ? ? HashMap<String,Object> map = new HashMap<>(16);
? ? ? ? map.put("tableName",templateId);
? ? ? ? for (String s : hearTitle) {
? ? ? ? ? ? columns.add(edFieldColumnsMapper.findByTemplateIdAndName(s,templateId));
? ? ? ? }
? ? ? ? map.put("columns",columns);
? ? ? ? map.put("values",list);
? ? ? ? edTemplateMapper.tableInsert(map);
? ? }

說(shuō)明

其余的類(lèi)代碼就不貼了,邏輯是這樣的,創(chuàng)建一個(gè)放字段的集合和傳入的map,集合的值必須要和字段對(duì)應(yīng)的上,不然插錯(cuò)字段值那就很尷尬,所以必須要通過(guò)動(dòng)態(tài)創(chuàng)建的字段和值的順序是一樣的,比如第一個(gè)創(chuàng)建了name那插入的第一個(gè)就是name,這個(gè)意思,所以這里是根據(jù)順序,先排好了字段,放入map里,再將要放入動(dòng)態(tài)表的值放進(jìn)來(lái),進(jìn)行mapper操作

有了建表以及插入,當(dāng)然少不了刪除和更新

刪除表的xml

<update id="deleteTable" parameterType="java.lang.String">
? ? DROP TABLE ${tempTable}
</update>
<delete id="deleteTemporary">
? ? ? ? DELETE
? ? ? ? FROM
? ? ? ? ? ? ?${tableName}
? ? ? ? WHERE
? ? ? ? ? ? id = #{id}
? ? </delete>

用于來(lái)刪除不需要的表,以及刪除數(shù)據(jù)

void deleteTable(@param(value = "tempTable") String tempTable);
void deleteTemporary(@Param("tableName") String tableName,
? ? ? ? ? ? ? ? ? ? ? ? ?@Param("id") String id);

這是mapper接口的寫(xiě)法,傳入要?jiǎng)h除的表名就可以

更新的XML

<update id="updateTemporary">
? ? ? ? UPDATE ${tableName}
? ? ? ? SET
? ? ? ? <foreach collection="dataMap" index="key" item="value" ?separator="," >
? ? ? ? ? ? ${key} = #{value}
? ? ? ? </foreach>
? ? ? ? WHERE
? ? ? ? ? ? id = #{id}
? ? </update>

對(duì)應(yīng)的mapper接口

?void updateTemporary(@Param("tableName") String tableName,
? ? ? ? ? ? ? ? ? ? ? ? ?@Param("id") String id,
? ? ? ? ? ? ? ? ? ? ? ? ?@Param("dataMap") HashMap dataMap);

mapper.xml中<foreach>標(biāo)簽使用

循環(huán)參數(shù)內(nèi)容,還具備在內(nèi)容的前后添加內(nèi)容,還具備添加分隔符功能。

適用場(chǎng)景

in  查詢(xún).批量新增中(mybatis 中 foreach 效率比較低)

1 如果希望批量新增,SQL 命令

insert into tableName VALUES (default,1,2,3),(default,4,5,6),(default,7,8,9)

2 openSession()必須指定底層 JDBC 的

PreparedStatement.addBatch();???
factory.openSession(ExecutorType.BATCH);

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

相關(guān)文章

  • 關(guān)于java開(kāi)發(fā)的性能問(wèn)題總結(jié)(必看)

    關(guān)于java開(kāi)發(fā)的性能問(wèn)題總結(jié)(必看)

    下面小編就為大家?guī)?lái)一篇關(guān)于java開(kāi)發(fā)的性能問(wèn)題總結(jié)(必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • Java設(shè)計(jì)模式七大原則之依賴(lài)倒置原則詳解

    Java設(shè)計(jì)模式七大原則之依賴(lài)倒置原則詳解

    依賴(lài)倒轉(zhuǎn)原則,即:上層模塊不應(yīng)該依賴(lài)底層模塊,它們都應(yīng)該依賴(lài)于抽象,抽象不應(yīng)該依賴(lài)于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴(lài)于抽象。本文將詳細(xì)介紹Java設(shè)計(jì)模式七大原則之一的依賴(lài)倒置原則,需要的可以參考一下
    2022-02-02
  • Java Excel文件加密保護(hù)數(shù)據(jù)安全

    Java Excel文件加密保護(hù)數(shù)據(jù)安全

    這篇文章主要為大家介紹了Java Excel文件加密保護(hù)數(shù)據(jù)安全的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • SpringBoot使用Redis緩存的實(shí)現(xiàn)方法

    SpringBoot使用Redis緩存的實(shí)現(xiàn)方法

    這篇文章主要介紹了SpringBoot使用Redis緩存的實(shí)現(xiàn)方法,需要的朋友可以參考下
    2018-02-02
  • Java 普通代碼塊靜態(tài)代碼塊執(zhí)行順序(實(shí)例講解)

    Java 普通代碼塊靜態(tài)代碼塊執(zhí)行順序(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇Java 普通代碼塊靜態(tài)代碼塊執(zhí)行順序(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • IDEA使用Maven創(chuàng)建父與子多模塊項(xiàng)目的圖文教程

    IDEA使用Maven創(chuàng)建父與子多模塊項(xiàng)目的圖文教程

    在?IntelliJ?IDEA?中使用?Maven?創(chuàng)建父與子多模塊項(xiàng)目是一個(gè)常見(jiàn)的開(kāi)發(fā)實(shí)踐,有助于更好地組織和管理代碼,所以本文小編給大家介紹了IDEA使用Maven創(chuàng)建父與子多模塊項(xiàng)目的圖文教程,需要的小伙伴跟著小編一起來(lái)看看吧
    2025-03-03
  • springboot實(shí)現(xiàn)防重復(fù)提交和防重復(fù)點(diǎn)擊的示例

    springboot實(shí)現(xiàn)防重復(fù)提交和防重復(fù)點(diǎn)擊的示例

    這篇文章主要介紹了springboot實(shí)現(xiàn)防重復(fù)提交和防重復(fù)點(diǎn)擊的示例,幫助大家更好的理解和學(xué)習(xí)springboot框架,感興趣的朋友可以了解下
    2020-09-09
  • MyBatis找不到mapper文件的實(shí)現(xiàn)

    MyBatis找不到mapper文件的實(shí)現(xiàn)

    這篇文章主要介紹了MyBatis找不到mapper文件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java模擬實(shí)現(xiàn)撲克牌洗牌和發(fā)牌的示例代碼

    Java模擬實(shí)現(xiàn)撲克牌洗牌和發(fā)牌的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用Java模擬實(shí)現(xiàn)撲克牌洗牌和發(fā)牌的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下
    2022-09-09
  • java微信支付接入流程詳解

    java微信支付接入流程詳解

    這篇文章主要為大家詳細(xì)介紹了java微信支付接入流程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05

最新評(píng)論

昌图县| 东明县| 天全县| 萍乡市| 东光县| 东莞市| 齐河县| 诏安县| 离岛区| 丰城市| 清远市| 察隅县| 康定县| 青海省| 蕲春县| 天水市| 锦州市| 岢岚县| 安仁县| 彰化县| 南安市| 和林格尔县| 屯昌县| 康马县| 新化县| 双鸭山市| 云霄县| 盱眙县| 鄯善县| 故城县| 西林县| 盱眙县| 乃东县| 扎赉特旗| 曲水县| 马边| 北流市| 治多县| 黄山市| 儋州市| 海口市|