05.JDBC编程之处理存储过程&Transaction

转载请标明出处:http://blog.csdn.net/u012637501

一、存储过程处理

1.存储过程

概念类似与函数,就是把一段代码封装起来。当要执行这一段代码的时候,可以通过调用该存储过程来实现。在封装的语句体里面,可以用if/else、case、while等控制结构(参数、控制结构、循环),可以进行sql编程。

(1)sql语法 

a.查看现有的存储过程

show procedure status \G

b.创建存储过程

delimiter $    //修改语句结束符

create procedure 存储过程名字(参数列表)

begin

封装sql的语句

end$

c.删除存储过程

drop procedure 存储过程名字;

d.调用存储过程

call 存储过程名字()$

call 存储过程名字(参数)$

(2)存储过程实例

在MySQL终端预先创建一个存储过程-计算1+2+3+...+100的和

create procedure pro(nam char(10),n smallint)

begin

declare i int;

declare s int;

set i=1;

set s=0;

while i<=n do

set s=s+i;

set i=i+1;

end while;

insert into test(name,age,score) values(nam,0,s) ;

end$

注:

◇declare 声明一个变量

◇set 设置变量的值

◇select 输出/查看某个变量或列

◇存储过程名只有用单个字符

2.JDBC处理存储过程

CallableStatement 对象为所有的DBMS 提供了一种以标准形式调用已储存过程的方法。已储存过程储存在数据库中。对已储存过程的调用是 CallableStatement对象所含的内容。这种调用是 用一种换码语法来写的,有两种形式:一种形式带结果参,另一种形式不带结果参数。结果参数是 一种输出 (OUT) 参数,是已储存过程的返回值。两种形式都可带有数量可变的输入(IN
参数)、 输出(OUT 参数)或输入和输出(INOUT 参数)的参数。问号将用作参数的占位符。

CallableStatement 对象是用 Connection 方法 prepareCall 创建的,应用代码如下:

CallableStatement callStmt=conn.prepareCall("call pro(?,?)");
 //调用Connection对象的prepareCall方法获取CallableStatement对象

callStmt.setString(1, "pro");   //向第一个占位符参数,赋值nam=‘pro‘

callStmt.setInt(2, 100);        //向第二个占位符,赋值为n=100

callStmt.execute();             //执行sql语句

3.源码实战

(1)创建存储过程

该存储过程完成计算1+2+3+...+100的和,并将求和结果作为score值插入到表中。

(2)编写JDBC数据库应用程序调用该存储过程

  1. import java.sql.CallableStatement;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.SQLException;
  5. /*MySQL数据库编程
  6. * 实例(6):JDBC批量处理存储过程*/
  7. public class JDBC_Procedure {
  8. public static void main(String[] args) {
  9. //0.连接数据库相关参数
  10. String url="jdbc:mysql://localhost:3306/jdbc_test_db";  //数据库URL(资源定位唯一标识符)
  11. String DBusername="root";   //数据库用户名
  12. String DBpasswd="111111";   //数据库密码
  13. //1.加载数据库驱动,将Driver注册到DriverManager中
  14. try{
  15. Class.forName("com.mysql.jdbc.Driver");
  16. }catch(ClassNotFoundException e){
  17. e.printStackTrace();
  18. }
  19. //2.通过数据库URL连接到数据库
  20. Connection conn=null;
  21. CallableStatement callStmt=null;
  22. try{
  23. //3.获得表示连接到数据库的Connection对象
  24. conn=DriverManager.getConnection(url, DBusername, DBpasswd);
  25. //4.获取执行存储过程SQL语句的CallableStatement对象
  26. callStmt=conn.prepareCall("call pro(?,?)");
  27. callStmt.setString(1, "pro");   //向第一个占位符参数,赋值nam=‘pro‘
  28. callStmt.setInt(2, 100);        //向第二个占位符,赋值为n=100
  29. callStmt.execute();             //执行sql语句
  30. }catch(SQLException e){
  31. e.printStackTrace();
  32. }
  33. //5.释放JDBC资源
  34. if(callStmt!=null)      //关闭声明
  35. {
  36. try{
  37. callStmt.close();
  38. }catch(SQLException e){
  39. e.printStackTrace();
  40. }
  41. }
  42. if(conn!=null)          //关闭连接
  43. {
  44. try{
  45. conn.close();
  46. }catch(SQLException e){
  47. e.printStackTrace();
  48. }
  49. }
  50. }
  51. }

运行结果

二、事物(Transaction)处理

1.事物(Transaction)

事物是指一组操作,要么都成功执行,要么都不执行。事物有原子性、隔离性、一致性、持久性四大ACID特性。

(1)原子性(Atomicity):原子意为最小粒子,或者说不能再分的事物。数据库事物的不可再分的原

则即为原子性;

(2)一致性(Consistency):事物发生前和发生后,数据的总额依然匹配;

(3)隔离性(Isolation):在所有的操作没有执行完毕之前,其他会话不能够看到中间改变的过程;

(4)持久性(Durability):事物产生的影响不能够撤销,如果除了错误,事物也不允许撤销,只能通过"补偿性事物"

2.事物的用法

第一步:开启事物语句

start transaction;

第二步:执行sql操作,即普通sql操作;

第三步:提交事物或者撤销操作,事物结束(下次使用事物需重新开启)

commit;或者rollback;

注意:有一些语句会造成事物的隐式提交,如重复执行start transaction。另外,建表的时候选择innodb引擎。

3.JDBC处理存储过程

(1)由于JDBC对事物的处理,默认是自动提交事物; 所以,在执行SQL语句之前,我们先调用Connection对象的setAutoCommit()并传入false参数。

Connection  conn=DriverManager.getConnection(url, DBusername, DBpasswd);

conn.setAutoCommit(false);

(2)添加需要处理的SQL语句,最后调用Connection对象的commit方法提交事物,使SQL语句生效。

Statement stmt=conn.createStatement();

stmt=conn.createStatement();

stmt.addBatch("insert into test(name,age,score) values(‘haha‘,10,33)");

stmt.executeBatch();    //批量执行SQL语句

conn.commit();  //提交事物

conn.setAutoCommit(true);

4.源码实战

  1. import java.sql.Connection;
  2. import java.sql.DriverManager;
  3. import java.sql.SQLException;
  4. import java.sql.Statement;
  5. public class JDBC_Transaction {
  6. /*MySQL数据库编程
  7. * 实例(7):JDBC批量处理事物Transaction*/
  8. public static void main(String[] args) {
  9. //0.连接数据库相关参数
  10. String url="jdbc:mysql://localhost:3306/jdbc_test_db";  //数据库URL(资源定位唯一标识符)
  11. String DBusername="root";   //数据库用户名
  12. String DBpasswd="896013";   //数据库密码
  13. //1.加载数据库驱动,将Driver注册到DriverManager中
  14. try{
  15. Class.forName("com.mysql.jdbc.Driver");
  16. }catch(ClassNotFoundException e){
  17. e.printStackTrace();
  18. }
  19. //2.通过数据库URL连接到数据库
  20. Connection conn=null;
  21. Statement stmt=null;
  22. try{
  23. //3.获得表示连接到数据库的Connection对象
  24. conn=DriverManager.getConnection(url, DBusername, DBpasswd);
  25. //4.设置SQL语句不自动执行
  26. conn.setAutoCommit(false);
  27. //5.获取Statement对象
  28. stmt=conn.createStatement();
  29. stmt.addBatch("insert into test(name,age,score) values(‘haha‘,10,33)");
  30. stmt.addBatch("insert into test(name,age,score) values(‘heihei‘,11,44)");
  31. stmt.addBatch("insert into test(name,age,score) values(‘xixi‘,14,55)");
  32. stmt.executeBatch();    //批量执行SQL语句
  33. conn.commit();  //提交事物
  34. conn.setAutoCommit(true);
  35. }catch(SQLException e){
  36. e.printStackTrace();
  37. }
  38. //5.释放JDBC资源
  39. if(stmt!=null)      //关闭声明
  40. {
  41. try{
  42. stmt.close();
  43. }catch(SQLException e){
  44. e.printStackTrace();
  45. }
  46. }
  47. if(conn!=null)          //关闭连接
  48. {
  49. try{
  50. conn.close();
  51. }catch(SQLException e){
  52. e.printStackTrace();
  53. }
  54. }
  55. }
  56. }

运行结果:

(1)注释事物提交语句

//conn.commit();

// conn.setAutoCommit(true);

(2)执行conn.commit()结果

时间: 2024-10-12 22:42:54

05.JDBC编程之处理存储过程&Transaction的相关文章

JavaEE之JDBC编程[详解]

1.数据库简介 数据库(DB,Data Base ) 数据库管理系统(DBMS,Data Base Management System) 关系型数据库(RDB) 关系型数据库管理系统(RDBMS) SQL语言(Structured Query Language):使用关系模型的数据库语言,用于和各类数据库的交互,提供通用的数据管理和查询功能. 常用SQL指令:(CURD) SELECT .INSERT.DELETE.UPDATE.CREATE.DROP ODBC(Open DataBase Co

JavaWeb-16 JDBC编程进阶(自定义数据源+开源数据源:DBCP、C3P0)

JavaWeb-16 JDBC编程进阶(自定义数据源+开源数据源:DBCP.C3P0) 一.调用存储过程 a.存储过程是什么? 将一组SQL组合在一起,类似于java代码里面的函数 现实当中SQL命令不可能一条一条调用. 目的为了打包存储调用. 放在服务器上,已经编译好. 买烟的例子(一次买一根还是买一包?) b.代码:如何操作? 这些代码可以用java代码类比. 在代码框架里可以调用多行sql语句. 在代码中可以定义结束符号. 以后接触需要输入代码的机会少,因为别人需要程序员做的就是提供给程序

JDBC编程之预编译SQL与防注入式攻击以及PreparedStatement的使用教程

在JDBC编程中,常用Statement.PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程. 1.Statement       该对象用于执行静态的 SQL 语句,并且返回执行结果. 此处的SQL语句必须是完整的,有明确的数据指示.查的是哪条记录?改的是哪条记录?都要指示清楚.     通过调用

JDBC编程总结

JDBC编程总结 JDBC的基本原理JDBC是Java操作数据库的技术规范.他实际上定义了一组标准的操作数据库的接口.为了能让Java操作数据库,必须要有实现了JDBC这些接口的类,不同的数据库厂商为了让Java语言能操作自己的数据库,都提供了对JDBC接口的实现--这些实现了JDBC接口的类打成一个jar包,就是我们平时看到的数据库驱动.由于不同的数据库操作数据的机制不一样,因此JDBC的具体实现也就千差万别,但是你作为java程序员,你只和Java JDBC的接口打交到,才不用理会他们怎么实

JDBC编程理论知识(1)

1.SUN公司为统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC 2.JDBC全称为:Java Data Base Connectivity(java数据库连接),它主要由接口组成. 组成JDBC的2个包: (1)java.sql.*; (2)javax.sql.*; 3.JDBC在程序中的位置: 4.JDBC的六个固定步骤 1,注册数据库驱动[利用反射] 2,取得数据库连接对象Connection 3,创建SQL对象 4,执行SQL命令,并返回结果集 5,处理结果集 6,

JSP (3)------JDBC编程1

JDBC API : 是一系列的编程接口,可以用来连接数据库,访问数据等. DriverManager : 驱动程序管理类,用来装载驱动程序,为创建数据库连接提供支持. Connection:用于连接某一指定的数据库 Statement : 提供了执行sql语句,获取查询结果的方法.有两个子接口.分别是: PrepareStatement:用于执行预编译的sql语句 ResultSet : 提供了对结果集处理的方法 JDBC Driver API 是面向驱动程序开发商的接口,JDBC驱动程序主要

优化JDBC编程-多提提意见

优化JDBC编程这是我根据MS SQL SERVER 2000 JDBC DRIVER HELP,并参考其它资料整理而成.ms的这个帮助文件实在有失大家风范,示例代码很.....有兴趣者可以去下载http://download.microsoft.com/download/SQLSVR2000/jdbc/2000/NT45XP/EN-US/setup.exe.由于本人水平有限,文中不当之处请大家批评指正.1.尽量减少对数据库元数据方法的使用同样是产生一个ResultSet对象,DatabaseM

第十三章.MySQL数据库与JDBC编程(下)

JDBC的典型用法: JDBC4.2常用接口和类简介: DriverManager:用于管理JDBC驱动的服务类,程序中使用该类的主要功能是获取Connection对象,该类包含如下方法: public static synchronized Connection getConnection(String url, String user, String  pass) throws SQLException:该方法获得url对应数据库的连接 Connection:代表数据库连接对象,每个Conn

Java基础教程:JDBC编程

Java基础教程:JDBC编程 快速开始 什么是JDBC JDBC 指 Java 数据库连接,是一种标准Java应用编程接口( JAVA API),用来连接 Java 编程语言和广泛的数据库. JDBC API 库包含下面提到的每个任务,都是与数据库相关的常用用法. 制作到数据库的连接. 创建 SQL 或 MySQL 语句. 执行 SQL 或 MySQL 查询数据库. 查看和修改所产生的记录. 从根本上来说,JDBC 是一种规范,它提供了一套完整的接口,允许便携式访问到底层数据库,因此可以用 J