数据库存储过程的一点积累

一、存储过程的概念:

存储过程(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"));

    }

}

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值