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存储过程返回多条数据的还在研究中,先整理这么多