首页 > 代码库 > Java数据库连接--JDBC调用存储过程,事务管理和高级应用

Java数据库连接--JDBC调用存储过程,事务管理和高级应用

相关链接:Jdbc调用存储过程

 一、JDBC常用的API深入详解及存储过程的调用

 1、存储过程的介绍

  我们常用的操作数据库语言SQL语句在执行的时候要先进行编译,然后执行,而存储过程是在大型数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过制定存储过程的名字并给出参数(如果该存储过程带有参数) 来执行它。存储过程是数据库中 的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。

 

  一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或者平台上执行相同函数,或者封装特定功能时,存储过程非常有用。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。

存储过程有以下优点:

  (1).存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。

 (2).存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库
专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。

  (3).存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。

因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL

语句在每次运行时都要进行编译和优化,速度相对要慢一些。

  (4).存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,

那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。

  (5).存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免

了非授权用户对数据的访问,保证了数据的安全。

 

 简单说,好处主要:

  1、由于数据执行动作时,先编译后执行,然而存储过程是一个编译过的代码块,所以执行效率比T-SQL高。

  2、一个存储过程在程序中交互可以替代大队的T-SQL语句,所以也能降低网络的通信量,提高通信效率。

  3、通过存储过程能够使没有权限的用户在控制之下间接存取数据库,保证数据安全。

 2、Jdbc调用无参数存储过程

存储过程代码:
    CREATE PROCEDURE imooc_db.sp_select_nofilter()
    BEGIN
            select * from imooc_goddess;
    END;

调用代码:
    Connection conn=DBUtil.getConnection();
    CallableStatement c=conn.prepareCall("call sp_select_nofilter()");
    c.execute();
    ResultSet rs=c.getResultSet();

 在数据库中新建存储过程:

         技术分享    

注意:创建的存储过程名称不要加"()",不然在调用存储过程会出错。

代码示例:

技术分享
 1 package produceDao;
 2 
 3 import java.sql.CallableStatement;
 4 import java.sql.Connection;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7 
 8 import sql.Dao.DBUtil;
 9 
10 public class ProduceDAO {
11     public void select_nofilter() throws SQLException{
12         //1、获得连接
13         Connection connection=DBUtil.getConnection();
14         //2、获得CallableStatement
15         CallableStatement cs=connection.prepareCall("call sp_select_nofilter()");
16         //3、执行存储过程
17         cs.execute();
18         //4、处理返回结果:结果集,出参
19         ResultSet rs=cs.getResultSet();
20         //遍历结果集
21         while (rs.next()){
22             System.out.println(rs.getString("user_name")+":"+rs.getString("email"));
23         }
24     }
25 }
ProduceDao.java
技术分享
 1 package producetest;
 2 
 3 import java.sql.SQLException;
 4 import produceDao.ProduceDAO;
 5 
 6 public class JdbcProduceTest {
 7     public static void main(String []args) throws SQLException{
 8         ProduceDAO dao=new ProduceDAO();
 9         dao.select_nofilter();
10     }
11 }
JdbcProduceTest.java

运行结果:

          技术分享

3、Jdbc调用含输入参数存储过程

新建一个过程:

        技术分享

 

如果输入空白字符,会全部显示,结果如下:

           技术分享

如果传入一个‘蔡‘,则结果如下:

技术分享

 

 1 //只有输入in,没有输出的存储过程
 2     public List<Goddess> select_filter(String sp_name) throws SQLException{
 3         List<Goddess> result=new ArrayList<>();
 4         //1、获得连接
 5         Connection connection=DBUtil.getConnection();
 6         //2、获得CallableStatement
 7         CallableStatement cs=connection.prepareCall("call sp_select_filter(?)");
 8         cs.setString(1, sp_name);
 9         //3、执行存储过程
10         cs.execute();
11         //4、处理返回结果:结果集,出参
12         ResultSet rs=cs.getResultSet();
13         Goddess goddess=null;
14         //遍历结果集
15         while (rs.next()){
16             goddess=new Goddess();
17             goddess.setId(rs.getInt("id"));
18             goddess.setUserName(rs.getString("user_name"));
19             goddess.setAge(rs.getInt("age"));
20             result.add(goddess);
21         }
22         return result;
23     }

 

 测试:

 1 public class JdbcProduceTest {
 2     public static void main(String []args) throws SQLException{
 3         ProduceDAO dao=new ProduceDAO();
 4         //dao.select_nofilter();
 5         String sp_name="白";
 6         List<Goddess> res=null;
 7         res=dao.select_filter(sp_name);
 8         for(int i=0;i<res.size();i++){
 9             System.out.println(res.get(i).getId()+":"+res.get(i).getUserName()+":"+res.get(i).getAge());
10         }
11     }
12 }

 

运行结果:

         技术分享 

4、Jdbc调用含输出参数存储过程

 建立一个过程

         技术分享

 

调用存储过程:显示出一共多少记录,结果如下:

          技术分享

含有输出参数的存储过程

 1 //Jdbc调用含有输出参数的的存储过程
 2     public Integer select_count()throws SQLException{
 3         Integer count=0;
 4         Connection connection=DBUtil.getConnection();
 5         CallableStatement cs=connection.prepareCall("call sp_select_count(?)");
 6         cs.registerOutParameter(1, Types.INTEGER);//注册输出参数,第二个参数时告诉jdbc,输出参数的类型。
 7         cs.execute();
 8         //处理返回的结果:这个结果不是结果集,而是出参
 9         count=cs.getInt(1);
10         return count;
11     }

 

 测试:

 1 public class JdbcProduceTest {
 2     public static void main(String []args) throws SQLException{
 3         ProduceDAO dao=new ProduceDAO();
 4 //        //dao.select_nofilter();
 5 //        String sp_name="蔡";
 6 //        List<Goddess> res=null;ss
 7 //        res=dao.select_filter(sp_name);
 8 //        for(int i=0;i<res.size();i++){
 9 //            System.out.println(res.get(i).getId()+":"+res.get(i).getUserName()+":"+res.get(i).getAge());
10 //        }
11         String sp_name="蔡";
12         List<Goddess> res=null;
13         Integer count=0;
14         
15         //带输入参数的存储过程
16         res=select_filter(sp_name);
17         showResult(res);
18         
19         count=select_count();
20         System.out.println("一共有"+count+"个女神!");
21     }
22     
23     public static List<Goddess> select_filter(String sp_name)throws SQLException{
24         ProduceDAO dao=new ProduceDAO();
25         return dao.select_filter(sp_name);
26     }
27     public static Integer select_count()throws SQLException{
28         ProduceDAO dao=new ProduceDAO();
29         return dao.select_count();
30     }
31     public static void showResult(List<Goddess> result){
32         for(int i=0;i<result.size();i++){
33             System.out.println(result.get(i).getId()+":"+result.get(i).getUserName()+":"+result.get(i).getAge());
34         }
35     }
36     
37 }

 

运行结果:

        技术分享

 

Java数据库连接--JDBC调用存储过程,事务管理和高级应用