现在的位置: 首页 > 综合 > 正文

Mysql 存储过程+Mybatis调用实现插入操作例子

2018年05月14日 ⁄ 综合 ⁄ 共 2058字 ⁄ 字号 评论关闭

一、

</pre><p>       简介:网上关于存储过程的使用有很多的例子,但大多实现的功能比较简单,由于本人对SQL语句还不是很熟悉,更别说存储过程了,所以在实现该例子的时候遇到了很多问题,现在拿给大家来分享。</p><p>二、</p><p>     在本例子中mysql +spring +Mybatis 环境已经搭建好了,下面的例子不是完整的代码,但是遇到的问题和解决办法都会给大家详细描述出来,希望在大家遇到问题是能给大家一些灵感。</p><p>    问题介绍:1、涉及三个表的操作b1,b2,b3,根据查询条件从b1、b2中查出结果并  批量 插入到b3中;</p><p>                         2、查询条件从前台获得,包含多条插入数据的查询条件,由于mysql存储过程不支持数组和链表,所以要用到字符串的拆分,又因为是多条数据,所以要批量插入;</p><p>                        </p><p>三、</p><p>      1、在Mybatis中使用:</p><p> </p><p></p><pre name="code" class="html"> <insert id="insertEntitlement"  statementType="CALLABLE"  parameterType="map" >
<!--<span style="font-family: Arial, Helvetica, sans-serif;">statementType="CALLABLE"  用来标识是调用存储过程;</span><span style="font-family: Arial, Helvetica, sans-serif;">多个参数用Map传递 --></span>

      {                       
        call entitlement_op(#{jurisdictionId:INTEGER},#{firmId:INTEGER},#{ids:VARCHAR},",")
        
      }

  </insert>

    2、存储过程 :

         entitlement_op

          参数:IN jurisdictionId int,IN firmId int,IN entitlementIds VARCHAR(1000),IN split_str VARCHAR(5)

   

BEGIN

  declare cnt int default 0; 
  declare i int default 0; 
  set cnt = func_split_TotalLength(entitlementIds ,split_str ); 

  WHILE i<cnt   #插入多条数据
  DO
    SET i=i+1;

  INSERT 
		INTO loa_entitlement (
      FIRM_ID,
		  JURISDICTION_ID,
		  ENTITLEMENT_NAME,
		  ENTITLEMENT_DESC,
		  IS_SHARABLE,
		  IS_PAID_LEAVE,
		  COLOR,
		  PATTERN,
		  LIBRARY,
		  CREATOR,
		  CREATE_TIME
		)
     SELECT 
        firmId,#来自参数中,而不是查询结果中
        j.JURISDICTION_ID,
        s.ENTITLEMENT_NAME,
        s.ENTITLEMENT_DESC,
        s.IS_SHARABLE,
        s.IS_PAID_LEAVE,
        s.COLOR,
        s.PATTERN,
        s.LIBRARY,
        s.CREATOR,
        s.CREATE_TIME
     FROM jurisdiction j,sas_loa_entitlement s
     WHERE 
       s.jurisdiction_id = j.jurisdiction_id
        AND
          j.jurisdiction_id=jurisdictionId 
       AND
          s.entitlement_id =func_split(entitlementIds ,split_str,i);

    END WHILE;

END

        存储过程中用到的方法:

        1、func_split  参数:(f_string varchar(1000),f_delimiter varchar(5),f_order int)

             用来分割字符串,实现存储过程传递多条数据的功能(摘自网络)

BEGIN 


        declare result varchar(255) default ''; 

        set result = reverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1)); 

        return result; 

END

      2、func_split_TotalLength  参数:(f_string varchar(1000),f_delimiter varchar(5))

           判断数据总共有多少条

BEGIN 

    

    return 1+(length(f_string) - length(replace(f_string,f_delimiter,''))); 

END

表结构就不给大家介绍了,本来也不是完成的实例,剩下就可以通过spring调用了。

抱歉!评论已关闭.