この記事では、主に、mybatisフレームワークのOracleデータベースでの関数の呼び出しやストアドプロシージャなどの操作を整理します。また、SSMフレームワークを使用してOracleデータベースに接続します。ビジネスロジックはテスト参照専用です。
1. Oracleデータベース側でテーブル、シーケンス、ストアドプロシージャ、および戻り値関数を作成します
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;
2.シーケンス、ストアドプロシージャ、および呼び出し関数を使用して、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>コレクションで渡された戻り値を取得するために関数を呼び出すと、コレクション内のキーはそれぞれ、関数に渡されたパラメーターと関数の戻り値を表します。
3、daoインターフェースとコールインサービス
- 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
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;
}
}
第4に、Oracleデータベースに接続するためのSSMの関連する構成
- 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