本文主要整理了关于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