一、存储过程的概念:
存储过程(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"));
}
}
以上为存储过程和函数的调用
综上,为本人刚参加工作这几天,通过各种方式学习到的存储过程相关知识。