博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库存储过程的一点积累
阅读量:4166 次
发布时间:2019-05-26

本文共 3556 字,大约阅读时间需要 11 分钟。

一、存储过程的概念:

存储过程(Stored Procedure)是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

存储过程是SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。存储过程在创建时即在服务器上进行编译,所以执行起来比单个SQL语句快。

二、存储过程在数据库中的作用:

第一:存储过程因为SQL已经预编绎过了,因此运行的速度比较快。   

第二:存储过程可以接受参数、输出参数、返回单个或多个结果集以及返值。可以向程序返回错误原因。     
第三:存储过程运行比较稳定,不会有太多的错误。只要一次成功,以后都会按这个程序运行。     
第四:存储过程主要是在服务器上运行,减少对客户机的压力。   
第五:存储过程可以包含程序流、逻辑以及对数据库的查询。同时可以实体封装和隐藏了数据逻辑。   
第六:存储过程可以在单个存储过程中执行一系列   SQL   语句。   
第七:存储过程可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
第八:存储过程还可以控制权限,比如一个表不直接允许用户直接访问,但要求允许用户访问和修改其中一个或多个字段,那就可以通过一个存储过程来实现并允许该用户使用该存储过程。   
 另外,如果多条SQL语句执行过程中,过程环节返回了数据作为后面环节的输入数据,如果直接通过SQL语句执行,势必导致大量的数据通过网络返回到客户机,并在客户机运算;如果封装在存储过程中,则将运算放在服务器进行,不但减少了客户机的压力,同时也减少了网络流量,提高了执行的效率。

三、存储过程和函数在JAVA项目中的使用:

1.调用存储过程

A..首先在数据库中定义存储过程,定义的存储过程的代码如下:

create or replace procedure pag_add(p1 varchar2,p2 varchar2,p3 out varchar2)

   as

    begin

          p3:=p1+p2;

      end;

create or replace function fun_add(p1 number ,p2 number)

return number
as
begin
return p1+p2;
end;

2.通过接口映射Sql,定义接口

public interface CallMapper {

        //查询存储过程的方法

        public void callProcedure(Map map);

        //查询函数的方法

        public void callFunction(Map map);

}

3.定义映射文件mapper.xml

  <!-- 此文件主要用于编写sql语句,namespace是为了解决相同名字的sql操作问题 -->

<mapper namespace="cn.mybatis.func.CallMapper">

    <!-- statementType 声明指向的是什么类型,其中CALLABLE是执行存储过程和函数的-->

<!-- 定义存储过程 -->

<select id="callProcedure" parameterType="map" statementType="CALLABLE" >

      {

         call pag_add(

               #{p1,mode=IN,jdbcType=NUMERIC},

               #{p2,mode=IN,jdbcType=NUMERIC},

               #{p3,mode=OUT,jdbcType=NUMERIC}

         )

      }

  </select>

  <!-- 定义函数 -->

  <select id="callFunction" parameterType="map" statementType="CALLABLE">

          {

              #{p3,mode=OUT,jdbcType=NUMERIC}=call fun_add(

                  #{p1,mode=IN,jdbcType=NUMERIC},

               #{p2,mode=IN,jdbcType=NUMERIC}

              )

          }

  </select>

</mapper>

 4.定义主mybaits.xml文件

<!--mybatis的根标签configuration -->

<configuration>

    <!-- 资源文件的路径配置  注:cn前面不能用/否则会抛出异常-->

    <properties resource="cn/et/mybatis/lesson02/jdbc.properties"/>

    <!-- 配置连接数据库的环境,(开发环境) -->

  <environments default="development">

    <environment id="development">

 <!-- 事务交给jdbc管理,Conection(事务) commit(提交) rollback(回滚) -->

      <transactionManager type="JDBC"/>

<!-- 数据源 用来连接数据库(包含四要素:driver,url,username,password)-->

      <dataSource type="POOLED">

        <property name="driver" value="${driverClass}"/>

        <property name="url" value="${url}"/>

        <property name="username" value="${userAccount}"/>

        <property name="password" value="${password}"/>

      </dataSource>

    </environment>

  </environments>

  <!-- 包含隐射文件主要用于编写sql语句 -->

  <mappers>

      <!-- 隐射的资源文件  隐射文件主要编写sql语句 -->

    <mapper resource="cn/et/mybatis/lesson02/func/call_mapper.xml"/>

  </mappers>

</configuration>

5.定义测试类

public class TestMyBatis {

    //封装session的返回

    public static SqlSession getSession(){

        String resource = "/cn/et/mybatis/lesson02/mybatis.xml";

        InputStream inputStream =TestMyBatis.class.getResourceAsStream(resource);

        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //操作数据库的类 SqlSession

        SqlSession session=sqlSessionFactory.openSession();

        return session;

    }

    //调用存储过程

    public static void main(String[] args) throws IOException {

        SqlSession session=getSession();

        CallMapper cm=session.getMapper(CallMapper.class);

        Map map=new HashMap();

        map.put("p1", 100);

        map.put("p2", 200);

        cm.callProcedure(map);

        System.out.println(map.get("p3"));

    }

    

    @Test

    //调用函数

    public void funTest(){

        SqlSession session=getSession();

        CallMapper cm=session.getMapper(CallMapper.class);

        Map map=new HashMap();

        map.put("p1", 100);

        map.put("p2", 400);

        cm.callFunction(map);

        System.out.println(map.get("p3"));

    }

}

  以上为存储过程和函数的调用

综上,为本人刚参加工作这几天,通过各种方式学习到的存储过程相关知识。

转载地址:http://vqlxi.baihongyu.com/

你可能感兴趣的文章
oracle如何去除某个字段中两边的空格?
查看>>
plsql developer如何在窗口列表直接可以修改表格中的数据?
查看>>
java自定义注解有什么作用?
查看>>
ORACLE中通过SQL语句(alter table)来增加、删除、修改字段
查看>>
js的Object对象如何访问中间有 . 点号的属性(键),获得其值?
查看>>
@ManyToOne和@OneToMany 注解
查看>>
Java集合(1) - List集合源码解析
查看>>
Java集合(2) - Map与AbstractMap源码解析
查看>>
Java集合(3) - HashMap源码解析与常见问题(一)
查看>>
Java集合(4) - HashMap-put()源码解析与常见问题(二)
查看>>
Java集合(5) - HashMap查删源码解析与常见问题(三)
查看>>
Java集合(6) - LinkedHashMap源码解析
查看>>
Java集合(7) - TreeMap源码解析
查看>>
Java集合(8) - Set与AbstractSet源码解析
查看>>
Java多线程(2) - 多线程之线程安全详解(synchronized、Lock)
查看>>
OKR与CFR管理模式(二)-CFR与OKR的绩效管理
查看>>
Java多线程(3) - 多线程之死锁
查看>>
Java多线程(4) - 多线程之Volatile关键字、ThreadLocal、Atomic系列类、CAS
查看>>
Java多线程(5) - 多线程之线程通讯(一)(wait、notify、join、yield、sleep区别与应用)
查看>>
Java多线程(6) - 多线程之线程通讯(二)(wait与notify案例、守护线程)
查看>>