本文主要整理了關于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
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/200136.html
標籤:其他
下一篇:SQL增刪改查基本語法整理
