SSM框架下,MyBatis中调用Oracle数据库的存储过程、函数、以及使用序列做自增列添加

本文主要整理了关于mybatis框架中调用Oracle数据库中的函数、存储过程等操作。以及SSM框架连接Oracle数据库的使用。业务逻辑仅供测试参考使用。

一、Oracle数据库端创建表格、序列、存储过程procedure、有返回值函数function

1 表结构如下:

<!--1、试题表-->
create table question(
       qid number(4,0) primary key,--试题ID
       que varchar2(50) not null, --问题
       answer varchar2(2) not null,--标准答案
       score number(2,0) not null --这道题的分数
)

<!--2、试卷详情表-->
create table paper(
       pid varchar2(20) not null,--试卷ID
       qid number(4,0) not null, --对应的试题ID
       useran varchar2(2) not null --用户选择的答案  
)

2 创建序列为添加操作当自增列使用

create sequence seq_stu
start with 1
increment by 1
cache 10

3 编写添加数据的存储过程

此处仅仅作为练习使用,并无实际意义!

create or replace procedure add_procedure(
       stuname varchar2, --用户名
       stuage number,  --年龄
       address varchar2  --家庭住址
)
is
begin
  begin
    insert into student (stuno,stuname,stuage,address) values
    (seq_stu.nextval,stuname,stuage,address); --这里使用序列做自增id
  end;
end add_procedure;

4 编写函数用于计算某张试卷的总分数

传入试卷编号,计算出这张试卷的总成绩。

--利用游标计算试卷总分数,返回给程序
create or replace function que_fun(
       input_pid varchar2 --传入试卷ID
)
return number --返回试卷总分
is
begin
   declare
       cursor que_cursor is              
              select pid,paper.qid as qid2,useran,question.qid as qid1,answer,score
              from paper inner join question 
              on question.qid=paper.qid
              where pid=input_pid;
       querow que_cursor%rowtype;
       return_num number(2,0):=0; --声明返回值
   begin
       for querow in que_cursor loop
           if querow.useran = querow.answer then 
               return_num:=return_num+querow.score;
           end if;
       end loop; 
       return  return_num;   
   end;    
end que_fun;

二 、MyBatis中的mapper.xml文件中使用序列、存储过程、调用函数获取返回值

<mapper namespace="com.dao.StuDao">
    <!--1、利用存储过程做数据添加操作-->
    <select id="insertStudent" parameterType="Student" statementType="CALLABLE">
        {call add_procedure( #{stuName,mode=IN,jdbcType=VARCHAR}, #{stuAge,mode=IN,jdbcType=DOUBLE},
         #{address,mode=IN,jdbcType=VARCHAR})}
    </select>


	<!--2、利用序列做自增列,添加操作-->
    <insert id="insertStu" parameterType="Student">
        insert into student (stuNo,stuname,stuage,address) values
        <!--seq_stu.nextval表示名叫seq_stu这个序列的下一个值-->
        (seq_stu.nextval,#{stuName},#{stuAge},#{address})
    </insert>


	<!--3、调用函数,传入试卷编号,获取返回值(总分数)-->
    <select id="getAllScore" statementType="CALLABLE" parameterType="java.util.Map">
        {#{callback,mode=OUT,jdbcType=INTEGER} =call que_fun(#{inputPid,mode=IN,jdbcType=VARCHAR})}
        <!--callback用来接收函数返回值、inputPid表示传入函数中的参数、二者均通过map集合的形式传入到预编译好的sql中,详见service中的调用-->
    </select>

</mapper>
  • mode=IN 表示是传入函数或存储过程中的参数,必须大写;
  • mode=OUT 表示是函数的返回值,或者是在存储过程里表示返回值的参数,必须大写;
  • 调用存储过程、函数要使用statementType=’ CALLABLE ’ ;
  • 调用函数获得返回值中传入Map<String,Object>集合,集合中的的key分别表示传入到函中的参数和函数的返回值。

三 、dao接口及service中的调用

  • dao接口的编写
public interface StuDao {
    
    
	//1、利用存储过程添加数据
    public  Integer insertStudent(Student student);
	//2、常规添加数据,使用序列做自增列
    public Integer insertStu(Student student);
	//3、调用函数,传入试卷编号计算这张试卷的总分数
    public  void getAllScore(Map<String,Object> map);
}
  • service层调用

调用有返回值的函数采用map集合传参的方式

@Service
public class StudentServiceImpl implements StudentService {
    
    
    @Autowired
    private StuDao stuDao;

    public Integer addStu(Student student) {
    
    
        return stuDao.insertStudent(student);
    }

    public Integer addStu2(Student student) {
    
    
        return stuDao.insertStu(student);
    }

    public Integer getAllScore(String inputPid) {
    
    
        Map<String,Object> map=new HashMap<String, Object>();
        map.put("inputPid",inputPid);
        map.put("callback", 0);
        //将集合传入dao层
        stuDao.getAllScore(map);
        //调用函数成功,从map中获取结果
        Integer callback=(Integer) map.get("callback");
        return callback;
    }
}

四、SSM连接Oracle数据库的相关配置

  • jar 依赖
    <!--添加oracle依赖-->
    <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ojdbc6</artifactId>
      <version>11.2.0.4.0-atlassian-hosted</version>
    </dependency>
  • 连接Oracle数据库的 jdbc.properties 配置文件
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
jdbc.username=liugang
jdbc.password=root
maxWait=5000
initialSize=2
maxActive=6
minIdle=2

Oracle数据库的常用SQL和相关PL/SQL:
https://blog.csdn.net/weixin_49702090/article/details/109373379

猜你喜欢

转载自blog.csdn.net/weixin_49702090/article/details/109407679