Mybatis增删改查之Oracle

Mybatis增删改查之Oracle

一. 查询
  1. 普通查询(返回普通的持久层对象,由于数据库字段风格和java不同,所以建立一个map映射)

    <resultMap type="com.xxx.domain.RuleCondition" id="RuleConditionResultMapWithoutBondList">
        <id column="RC_ID" jdbcType="NUMERIC" property="ruleConditionId"/>
        <result column="RULE_CAT1" jdbcType="VARCHAR" property="ruleCatOne"/>
        <result column="RULE_CAT2" jdbcType="VARCHAR" property="ruleCatTwo"/>
        <result column="RC_OPER_TYPE" jdbcType="VARCHAR" property="ruleOperateSymbol"/>
        <result column="RULE_REF" jdbcType="VARCHAR" property="ruleRef"/>
        <result column="START_EFFECT_TIME" jdbcType="VARCHAR" property="effectTimeOfStart"/>
        <result column="END_EFFECT_TIME" jdbcType="VARCHAR" property="effectTimeOfEnd"/>
        <result column="BOND_CODE_1" jdbcType="VARCHAR" property="bondCodeOne"/>
        <result column="BOND_CODE_2" jdbcType="VARCHAR" property="bondCodeTwo"/>
        <result column="BP_THRESHOLD" jdbcType="NUMERIC" property="bpThreshold"/>
        <result column="RC_STATUS" jdbcType="VARCHAR" property="ruleStatus"/>
        <result column="OPERATOR_ID" jdbcType="VARCHAR" property="operatorId"/>
        <result column="LAST_UPDATED_DATE" jdbcType="DATE" property="lastUpdateTime"/>
      </resultMap> 
    
    <select id="getRuleConditionWithoutBondListById" resultMap="RuleConditionResultMapWithoutBondList">
        select RC_ID,
               RULE_CAT1,
               RULE_CAT2,
               RC_OPER_TYPE,
               RULE_REF,
               START_EFFECT_TIME,
               END_EFFECT_TIME,
               BOND_CODE_1,
               BOND_CODE_2,
               BP_THRESHOLD,
               RC_STATUS,
               LAST_UPDATED_DATE
        FROM RULES_CONDITION
        WHERE RC_ID = #{ruleConditionId,jdbcType=NUMERIC}
      </select>
    
  2. 带有自定义对象的查询(带了一个List)

    <!--collection中的就是查询附带的list的函数
     property是java中list的属性名
    -->
    <resultMap type="com.xxx.domain.RuleCondition" id="RuleConditionResultMap">
        <id column="RC_ID" jdbcType="NUMERIC" property="ruleConditionId"/>
        <result column="RULE_CAT1" jdbcType="VARCHAR" property="ruleCatOne"/>
        <result column="RULE_CAT2" jdbcType="VARCHAR" property="ruleCatTwo"/>
        <result column="RC_OPER_TYPE" jdbcType="VARCHAR" property="ruleOperateSymbol"/>
        <result column="RULE_REF" jdbcType="VARCHAR" property="ruleRef"/>
        <result column="START_EFFECT_TIME" jdbcType="VARCHAR" property="effectTimeOfStart"/>
        <result column="END_EFFECT_TIME" jdbcType="VARCHAR" property="effectTimeOfEnd"/>
        <result column="BOND_CODE_1" jdbcType="VARCHAR" property="bondCodeOne"/>
        <result column="BOND_CODE_2" jdbcType="VARCHAR" property="bondCodeTwo"/>
        <result column="BP_THRESHOLD" jdbcType="NUMERIC" property="bpThreshold"/>
        <result column="RC_STATUS" jdbcType="VARCHAR" property="ruleStatus"/>
        <result column="OPERATOR_ID" jdbcType="VARCHAR" property="operatorId"/>
        <result column="LAST_UPDATED_DATE" jdbcType="DATE" property="lastUpdateTime"/>
        <collection column="RC_ID" property="bondList" ofType="com.xxx.domain.RuleBond"
                    select="getBondListByRuleConditionId">
        </collection>
      </resultMap>
    
      <resultMap type="com.xxx.domain.RuleBond" id="RuleBondResultMap">
        <id column="RB_ID" jdbcType="NUMERIC" property="ruleBondId"/>
        <id column="RC_ID" jdbcType="NUMERIC" property="ruleConditionId"/>
        <result column="BOND_CODE" jdbcType="VARCHAR" property="bondCode"/>
        <result column="SECURITY_TERM" jdbcType="VARCHAR" property="term"/>
        <result column="BID_STRATEGY_ID" jdbcType="VARCHAR" property="bidStrategyId"/>
        <result column="OFR_STRATEGY_ID" jdbcType="VARCHAR" property="ofrStrategyId"/>
        <result column="STATUS" jdbcType="VARCHAR" property="status"/>
        <result column="OPERATOR_ID" jdbcType="VARCHAR" property="operatorId"/>
        <result column="LAST_UPDATED_DATE" jdbcType="DATE" property="lastUpdateTime"/>
      </resultMap>
    <!--查询语句-->
      <select id="getRuleConditionBOsByEnumValue" resultMap="RuleConditionBOResultMap">
        select RC_ID,
               RULE_CAT1,
               RULE_CAT2,
               RC_OPER_TYPE,
               RULE_REF,
               START_EFFECT_TIME,
               END_EFFECT_TIME,
               BOND_CODE_1,
               BOND_CODE_2,
               BP_THRESHOLD,
               RC_STATUS,
               LAST_UPDATED_DATE
        FROM RULES_CONDITION
        WHERE RULE_CAT1 = #{enumValue,jdbcType=VARCHAR}
      </select>
    <!--附带List的查询语句-->
      <select id="getBondListByRuleConditionId" resultMap="RuleBondResultMap">
        select RB_ID,
               RC_ID,
               t1.BOND_CODE,
               t2.SECURITY_TERM,
               BID_STRATEGY_ID,
               OFR_STRATEGY_ID,
               t1.STATUS,
               t1.LAST_UPDATED_DATE
        FROM RULES_BOND t1
               left join BOND_BASIS_INFO t2 on t1.BOND_CODE = t2.BOND_CODE
        WHERE RC_ID = #{ruleConditionId,jdbcType=NUMERIC}
      </select>
    
二. 新增
  1. 普通新增

      <insert id="addRuleBond" parameterType="com.xxx.domain.RuleBond">
        insert into RULES_BOND
        (RB_ID,
        RC_ID,
        BOND_CODE,
        BID_STRATEGY_ID,
        OFR_STRATEGY_ID,
        STATUS,
        OPERATOR_ID,
        LAST_UPDATED_DATE)
        values (SEQ_RULES_BOND.nextVal,
        #{ruleConditionId,jdbcType=NUMERIC},
        #{bondCode,jdbcType=VARCHAR},
        #{bidStrategyId,jdbcType=VARCHAR},
        #{ofrStrategyId,jdbcType=VARCHAR},
        #{status,jdbcType=VARCHAR},
        #{operatorId,jdbcType=VARCHAR},
        systimestamp)
      </insert>
    
  2. 返回主键(多了一个selectkey)

    <!--selectkey中 keyproperty是写java中属性名称
         后面的values中将得到的ruleBondId赋值即可-->
    <insert id="addRuleBond" parameterType="com.xxx.domain.RuleBond">
     <selectKey resultType="java.lang.Integer" order="BEFORE" keyProperty="ruleBondId">
          SELECT SEQ_RULES_BOND.Nextval from DUAL
        </selectKey>
        insert into RULES_BOND
        (RB_ID,
        RC_ID,
        BOND_CODE,
        BID_STRATEGY_ID,
        OFR_STRATEGY_ID,
        STATUS,
        OPERATOR_ID,
        LAST_UPDATED_DATE)
        values (#{ruleBondId,jdbcType=NUMERIC},
        #{ruleConditionId,jdbcType=NUMERIC},
        #{bondCode,jdbcType=VARCHAR},
        #{bidStrategyId,jdbcType=VARCHAR},
        #{ofrStrategyId,jdbcType=VARCHAR},
        #{status,jdbcType=VARCHAR},
        #{operatorId,jdbcType=VARCHAR},
        systimestamp)
      </insert>
    
  3. 批量新增

    参照网上写了一下,一直报缺失表达式,原来是insert into后面 是不需要 values的;

    还有就是关于Oracle返回主键List ,我在网上暂时还没找到能正确执行的例子 ,求大佬告知

    <insert id="addRuleBondList" parameterType="java.util.List">
        insert into RULES_BOND
        (RB_ID,
        RC_ID,
        BOND_CODE,
        BID_STRATEGY_ID,
        OFR_STRATEGY_ID,
        STATUS,
        OPERATOR_ID,
        LAST_UPDATED_DATE
        )
        SELECT  SEQ_RULES_BOND.NEXTVAL,t.*
        FROM (
        <foreach close=")" collection="ruleBonds" item="item" index="index" open="(" separator="union ALL">
          select
          #{item.ruleConditionId,jdbcType=NUMERIC},
          #{item.bondCode,jdbcType=VARCHAR},
          #{item.bidStrategyId,jdbcType=VARCHAR},
          #{item.ofrStrategyId,jdbcType=VARCHAR},
          #{item.status,jdbcType=VARCHAR},
          #{item.operatorId,jdbcType=VARCHAR},
           systimestamp
          from dual
        </foreach>
          ) t
      </insert>
    
  4. 批量新增,存在则插入

    <insert id="generateBaselines" parameterType="java.util.List">
        MERGE INTO RULES_CONDITION t
        USING (
        <foreach collection="ruleConditions" item="item" index="index" separator="union">
          select #{item.ruleConditionId,jdbcType=NUMERIC} id,
          #{item.ruleCatOne,jdbcType=VARCHAR} cat1,
          #{item.ruleCatTwo,jdbcType=VARCHAR} cat2,
          #{item.bondCodeOne,jdbcType=VARCHAR} code1,
          #{item.bondCodeTwo,jdbcType=VARCHAR} code2,
          #{item.ruleOperateSymbol,jdbcType=VARCHAR} symbol,
          #{item.operatorId,jdbcType=VARCHAR} u
          from DUAL
        </foreach>) t1
        <!-- 哪些条件相符-->
        ON (t.RULE_CAT1 = t1.cat1 AND t.RULE_CAT2 = t1.cat2 AND t.RC_OPER_TYPE = t1.symbol)
        <!--符合条件时-->
        WHEN MATCHED THEN
        UPDATE SET t.BOND_CODE_1 = t1.code1,t.BOND_CODE_2 = t1.code2,t.LAST_UPDATED_DATE = default
        <!--不符合条件时-->
        WHEN NOT MATCHED THEN
        INSERT(RC_ID, RULE_CAT1, RULE_CAT2, RC_OPER_TYPE, RULE_REF, BOND_CODE_1, BOND_CODE_2,RC_STATUS,OPERATOR_ID,LAST_UPDATED_DATE)
        VALUES (SEQ_RULES_CONDITION.nextval, t1.cat1, t1.cat2, t1.symbol, '1', t1.code1, t1.code2, '0', t1.u,default)
      </insert>
    
三. 修改

(begin,end最好还是加上,之前报错一直找不到错,加上begin,end就好了;end前后都加分号";",begin不用加)

  1. 普通修改

    <update id="modifyRuleBond" parameterType="com.xxx.domain.RuleBond">
        begin
        update RULES_BOND
        set
        <if test="bidStrategyId!=null">
          BID_STRATEGY_ID=#{bidStrategyId,jdbcType=VARCHAR},
        </if>
        <if test="ofrStrategyId!=null">
          OFR_STRATEGY_ID=#{ofrStrategyId,jdbcType=VARCHAR},
        </if>
        <if test="operatorId!=null">
          OPERATOR_ID=#{operatorId,jdbcType=VARCHAR},
        </if>
        <if test="status!=null">
          STATUS=#{status,jdbcType=VARCHAR},
        </if>
        LAST_UPDATED_DATE=SYSTIMESTAMP
        WHERE RB_ID = #{ruleBondId,jdbcType=NUMERIC};
        end;
      </update>
    
  1. 批量修改(begin,end加在 foreach的open和close处,记得加上分号)

    <update id="modifyRuleCondition" parameterType="java.util.List">
        <foreach collection="ruleConditions" item="item" index="index" open="begin" close=";end;" separator=";">
          UPDATE RULES_CONDITION
          <set>
            <if test="item.ruleRef!=null">
              RULE_REF=#{item.ruleRef,jdbcType=VARCHAR},
            </if>
            <if test="item.effectTimeOfStart!=null">
              START_EFFECT_TIME=#{item.effectTimeOfStart,jdbcType=VARCHAR},
            </if>
            <if test="item.effectTimeOfEnd!=null">
              END_EFFECT_TIME= #{item.effectTimeOfEnd,jdbcType=VARCHAR},
            </if>
            <if test="item.bpThreshold!=null">
              BP_THRESHOLD= #{item.bpThreshold,jdbcType=NUMERIC},
            </if>
            <if test="item.ruleStatus!=null">
              RC_STATUS= #{item.ruleStatus,jdbcType=VARCHAR},
            </if>
            <if test="item.operatorId!=null">
              OPERATOR_ID= #{item.operatorId,jdbcType=VARCHAR},
            </if>
            LAST_UPDATED_DATE=default,
          </set>
          WHERE RC_ID = #{item.ruleConditionId,jdbcType=INTEGER}
        </foreach>
      </update>
    
四. 删除
  1. 普通删除

    <delete id="deleteRuleBond" parameterType="com.xxx.domain.RuleBond">
        delete
        from RULES_BOND
        where RB_ID = #{ruleBondId}
          AND TO_TIMESTAMP(TO_CHAR(LAST_UPDATED_DATE, 'yyyy-MM-dd hh24:mi:ss'), 'yyyy-MM-dd hh24:mi:ss') = #{lastUpdateTime,jdbcType=TIMESTAMP}
      </delete>
    
  1. 批量删除

    ​ 1)批量执行语句

    <delete id="batchDeleteRuleBond" parameterType="java.util.List">
        <foreach collection="ruleBonds" open="begin" close=";end;" item="item" separator=";">
          DELETE FROM RULES_BOND
          WHERE RB_ID = #{item.ruleBondId} and TO_TIMESTAMP(TO_CHAR(LAST_UPDATED_DATE, 'yyyy-MM-dd hh24:mi:ss'), 'yyyy-MM-dd hh24:mi:ss') = #{item.lastUpdateTime,jdbcType=TIMESTAMP}
        </foreach>
      </delete>
    

    ​ 2)综合成一条语句执行

    <delete id="batchDeleteRuleBond" parameterType="java.util.List">
        DELETE FROM RULES_BOND
        WHERE RB_ID IN (
        SELECT A.RB_ID FROM (
        <foreach collection="ruleBonds" item="item" separator="UNION All">
          SELECT * FROM RULES_BOND
          WHERE RB_ID = #{item.ruleBondId} AND TO_TIMESTAMP(TO_CHAR(LAST_UPDATED_DATE, 'yyyy-MM-dd hh24:mi:ss'), 'yyyy-MM-dd hh24:mi:ss') = #{item.lastUpdateTime,jdbcType=TIMESTAMP}
        </foreach>
        )A
        )
      </delete>
    

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容