首页 > 代码库 > 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 }
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 }
运行结果:
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调用存储过程,事务管理和高级应用