Mybatis (批量操作)

1.批量插入

    <insert id="batchAddTmpD" parameterType="list">
        INSERT INTO <include refid="tb"/>
        ( <include refid="cols_exclude_id"/>)
        VALUES
        <foreach collection="list" separator="," item="i">
            (#{i.type},#{i.modifyTime},#{i.parentZipCode},#{i.zipCode},#{i.date},#{i.year},#{i.month},#{i.day},
            #{i.weekday},#{i.statusFlag},#{i.comments},#{i.remark},#{i.backlogId},#{i.formalId},#{i.isD},#{i.isChanged},#{i.originType})
        </foreach>
    </insert>

forearch的参数可以是array,list,map这三种

属性 描述
item 循环体中的具体对象。支持属性的点路径访问,如item.age,item.info.details。具体说明:在list和数组中是其中的对象,在map中是value。该参数为必选。
collection 要做foreach的对象,作为入参时,List<?>对象默认用list代替作为键,数组对象有array代替作为键,Map对象没有默认的键。当然在作为入参时可以使用@Param("keyName")来设置键,设置keyName后,list,array将会失效。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。举个例子:如果User有属性List ids。入参是User对象,那么这个collection = "ids"如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = "ids.id"上面只是举例,具体collection等于什么,就看你想对那个元素做循环。该参数为必选。
separator 元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。
open foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选。
close foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。
index 在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。

2.批量删除

    <delete id="batchDelTmpD" parameterType="list">
        delete from <include refid="tb" />
        WHERE ID_DTMP IN
        <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
            #{item}
        </foreach>
    </delete>

3.批量更新

通过一条SQL语句只能将一批ID取到的行设置成相同的值,idList是数据库表项的ID链表,剩余字段为需要修改成的字段
调用代码:

Map<String,Object> map = new HashMap<>();
map.put("list", idList);
if(parms.getParentZipCode() != null){
    map.put("parentZipCode",parms.getParentZipCode());
}
if(parms.getStatusFlag() != null){
    map.put("statusFlag",parms.getStatusFlag());
}
if(parms.getComments() != null){
    map.put("comments",parms.getComments());
}
if(parms.getRemark() != null){
    map.put("remark",parms.getRemark());
}
if(parms.getFormalId() != null){
    map.put("formalId",parms.getFormalId());
}
if(parms.getBacklogId() != null){
    map.put("backlogId",parms.getBacklogId());
}

XML配置

    <update id="batchUpdateTmpD" parameterType="map">
        UPDATE <include refid="tb" />
        <set>
            <if test="parentZipCode != null">PARENT_ZIPCODE = #{parentZipCode},</if>
            <if test="statusFlag != null">STATUS_FLAG = #{statusFlag},</if>
            <if test="comments != null">COMMENTS = #{comments},</if>
            <if test="remark != null">REMARK = #{remark},</if>
            <if test="formalId != null">FORMALID = #{formalId},</if>
            <if test="backlogId != null">BACKLOGID = #{backlogId},</if>
            TS_MODIFYTIME = now()
        </set>
        WHERE ID_DTMP IN
        <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
            #{item}
        </foreach>
    </update>

4.获取统计个数

count(*),count(1)和count(主键)都没错,count(*)扫描全表,count(1)和count(主键)只扫描index

    <select id="getTmpDCount" parameterType="map" resultType="Integer">
        SELECT count(*) FROM <include refid="tb"/> WHERE ZIPCODE = #{zipCode}
        <if test="year != null">and YEAR = #{year}</if>
        <if test="month != null">and MONTH = #{month}</if>
        <if test="day != null">and DAY = #{day}</if>
        <if test="isChanged != null">and IS_CHANGED = #{isChanged}</if>
        <if test="type != null">and TYPE = #{type}</if>
        <if test="statusFlag != null">and STATUS_FLAG = #{statusFlag}</if>
        <if test="backlogId != null">and BACKLOGID = #{backlogId}</if>
    </select>

5.根据列表批量获取

    <select id="getTmpDByIdSet" parameterType="list" resultMap="DTmpEntity">
        SELECT * FROM <include refid="tb"/> WHERE ID_DTMP IN
        <foreach item="id" collection="list" open="(" separator="," close=")">
            #{id}
        </foreach>
    </select>

6.批量获取一列并排除重复

GROUP BY函数应该的使用应该是SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中,除非这列是用于聚合函数

    <select id="getBacklogIdByIdSet" parameterType="list" resultType="String">
        SELECT BACKLOGID FROM <include refid="tb"/> WHERE ID_DTMP IN
        <foreach item="id" collection="list" open="(" separator="," close=")">
            #{id}
        </foreach>
        GROUP BY BACKLOGID
    </select>

7.获取该字段为NULL的行

IS NULL不能=null

    <select id="getUntrackIdSet" parameterType="map" resultType="Integer">
        SELECT ID_DTMP FROM <include refid="tb"/> WHERE ZIPCODE = #{zipCode}
        <if test="year != null">and YEAR = #{year}</if>
        <if test="month != null">and MONTH = #{month}</if>
        <if test="day != null">and DAY = #{day}</if>
        <if test="statusFlag != null">and STATUS_FLAG = #{statusFlag}</if>
        and BACKLOGID IS NULL
    </select>

8.分页

select * from table limit m,n
其中m是指记录开始的index,从0开始,表示第一条记录n是指从第m+1条开始,取n条。

<select id="getTmpDByDistrict" parameterType="map" resultMap="DTmpEntity">
    select  *  from <include refid="tb"/>
    <where>
        ZIPCODE = #{zipCode}
        <if test="year != null">and YEAR = #{year}</if>
        <if test="month != null">and MONTH = #{month}</if>
        <if test="day != null">and DAY = #{day}</if>
        <if test="isChanged != null">and IS_CHANGED = #{isChanged}</if>
        <if test="type != null">and TYPE = #{type}</if>
        <if test="statusFlag != null">and STATUS_FLAG = #{statusFlag}</if>
    </where>
    ORDER BY `DATE`
    <if test="(null != order)">
        <if test="(order == "asc" || order == "ASC" || order == "desc" || order == "DESC")">${order} </if>
        <if test="(order != "asc" && order != "ASC" && order != "desc" && order != "DESC")">DESC </if>
    </if>
    <if test="(null == order)">DESC </if>
    LIMIT
        <if test="(null != start) && (start > 0)">#{start},</if>
        <if test="(null == start) || (start <= 0)">0,</if>
        <if test="(null != count) && (count > 0)">#{count}</if>
        <if test="(null == count) || (count < 0)">10</if>
</select>
No. 文字表記 0進表記 16進表記 文字 Comment
001 " " " """ quotation mark = APL quote
002 & & & "&" ampersand
003 < < < "<" less-than sign
004 > > > ">" greater-than sign
005 " " no-break space = non-breaking space
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,555评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 3,784评论 0 11
  • 人生如迷宫 转水转灯转过沙洲 越山丘 深海和丛林 看过天、树 黄昏与少女 闻过花香 粉色、红色、兰和露 兜兜转转 ...
    坡上风阅读 216评论 0 0
  • 元气满满的一个早上 动作很快的一天 虽然自己有点小疲惫但是自己还是能撑得住那种军训的小姿态滴 很开森 在晚上的...
    特途阅读 197评论 0 0
  • 昨天和今天,因为一些无所谓的事而,将一些放在心上,无法释怀。 心在隐隐作痛,总感觉好难受 因为与海云没有说话的原因...
    帕西诺爱阿喔阅读 134评论 0 0