天天看点

spring+springMvc+mybatis 调用oracle 存储过程 - 码海航行

spring+springMvc+mybatis 调用oracle 存储过程

   最近在项目中遇到在mybatis中调用oracle存储过程的问题,网上各种查询,最终解决了问题,在我们项目中我只需要oracle 的存储过程返回一个字符串用来存入数据库作为表数据的主键,

接下来整理代码:

   首先构建存储过程getSequence,一个输入,输出参数。

省略数据库表的创建。

 create or replace 

procedure getSequence(tableName in varchar2, outId out varchar2)

is

PRAGMA AUTONOMOUS_TRANSACTION; --自治事务 

ls_year varchar2(4); --年度

ls_month varchar2(2); --月度

ls_day varchar2(2); --日

--自治事务: 防止外层事务调用内层事务时被内层事务中的commit提交了不该提交的内容 

--version: 2.0

begin

ld_date := sysdate;

ls_table := lower(as_table_code);

ls_year := To_char(ld_date, \'yyyy\' );

ls_month := To_char(ld_date, \'mm\' );

ls_day := To_char(ld_date, \'dd\' );

select nvl(max(sequence_value),0)

into ld_value

from sm_sequence

where sequence_code = ls_table ;

If ld_value = 0 then

ld_value := 1;

insert into sm_sequence

(sequence_code,

sequence_year,

sequence_month,

sequence_day,

sequence_value )

values

(ls_table,

to_char( sysdate, \'yyyy\' ),

to_char( sysdate, \'mm\' ),

to_char( sysdate, \'dd\' ),

ld_value );

else

select sequence_year, sequence_month, sequence_day, sequence_value

into ln_year, ln_month, ln_day, ld_value

from sm_sequence

where sequence_code = ls_table;

if ln_year <> to_number(to_char(sysdate, \'yyyy\')) or

ln_month <> to_number(to_char(sysdate, \'mm\')) or

ln_day <> to_number(to_char(sysdate, \'dd\')) then

ld_value := 1;

else

ld_value := ld_value + 1;

end if;

update sm_sequence

set sequence_value = ld_value,

sequence_year = ls_year,

sequence_month = ls_month,

sequence_day = ls_day

where sequence_code = ls_table ;

End If;

commit;

as_id := ls_year ||ls_month||ls_day||ltrim(to_char(ld_value, \'00000000\' ));

end ;

函数构建完成;

在pl/sql 中调用:

SQL> set serveroutput on
SQL> DECLARE
  2    tableName varchar2(20);
  3    row_id varchar2(10);
  4  BEGIN
  5    getSequence(tableName,row_id);
  6    
  7    dbms_output.put_line(row_id);      
8  END;
  9  /
ename      

在Spring+springMVC+myBatis项目中调用,

java调用:

dao层:  

  public interface getMapper(){

    public void getSequence(HashMap<String,Object> params);

   }

mybatis 层xml 配置:

<parameterMap type="java.util.Map" id="getUserCountMap">

<parameter property="tableName" mode="IN" jdbcType="VARCHAR"/>

<parameter property="rowId" mode="OUT" jdbcType="VARCHAR"/>

</parameterMap>

<select id="getSequence" statementType="CALLABLE"

parameterMap="getUserCountMap" >

{call getSequence (?,?)}

</select>

service层调用:

HashMap<String,Object> param =new HashMap<String,Map>();

param.put("tableName","表名");

getMapper.getSequence(param);//此处特别注意调用时不需要返回类型,一旦执行完存储过程map中就已经存在值

System.out.print(param.get("rowId"));

以上是这次项目开发中遇到的问题,另外spring+springMVC+mybatis调用oracle存储过程返回多条数据的还在研究中,先整理这么多