Bajo el marco SSM, MyBatis llama a los procedimientos almacenados de la base de datos de Oracle, funciones y usa secuencias para agregar columnas de incremento automático

Este artículo clasifica principalmente operaciones como funciones de llamada y procedimientos almacenados en la base de datos de Oracle en el marco mybatis. Y el uso del marco SSM para conectarse a la base de datos de Oracle. La lógica empresarial es solo para referencia de prueba.

1. Cree tablas, secuencias, procedimientos almacenados y funciones de valor de retorno en el lado de la base de datos de Oracle

1 La estructura de la tabla es la siguiente:

<!--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 Cree una secuencia como una operación de adición cuando se use como una columna de incremento automático

create sequence seq_stu
start with 1
increment by 1
cache 10

3 Escriba un procedimiento almacenado para agregar datos

¡Esto solo se usa como ejercicio y no tiene ningún significado práctico!

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 Escribe una función para calcular la puntuación total de una determinada prueba.

Pase el número de la prueba y calcule la puntuación total de esta prueba.

--利用游标计算试卷总分数,返回给程序
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. Utilice la secuencia, el procedimiento almacenado y la función de llamada para obtener el valor de retorno en el archivo mapper.xml en MyBatis.

<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 significa que es un parámetro pasado en una función o un procedimiento almacenado, y debe estar en mayúscula;
  • mode = OUT significa que el valor de retorno de la función, o el parámetro que significa el valor de retorno en el procedimiento almacenado, debe estar en mayúscula;
  • Para llamar a funciones y procedimientos almacenados, use statementType = 'CALLABLE';
  • Al llamar a la función para obtener el valor de retorno pasado en la colección Map <String, Object>, las claves de la colección representan respectivamente los parámetros pasados ​​a la función y el valor de retorno de la función.

Tres, interfaz DAO y servicio de llamada

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

Llamar a una función con un valor de retorno usa una colección de mapas para pasar parámetros

@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;
    }
}

Cuarto, la configuración relevante de SSM para conectarse a la base de datos de Oracle

  • dependencia de jar
    <!--添加oracle依赖-->
    <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ojdbc6</artifactId>
      <version>11.2.0.4.0-atlassian-hosted</version>
    </dependency>
  • El archivo de configuración jdbc.properties para conectarse a la base de datos de Oracle
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

SQL común y PL / SQL relacionado de la base de datos Oracle:
https://blog.csdn.net/weixin_49702090/article/details/109373379

Supongo que te gusta

Origin blog.csdn.net/weixin_49702090/article/details/109407679
Recomendado
Clasificación