一、存储过程处理
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数据库应用程序调用该存储过程
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/*MySQL数据库编程
* 实例(6):JDBC批量处理存储过程*/
public class JDBC_Procedure {
public static void main(String[] args) {
//0.连接数据库相关参数
String url="jdbc:mysql://localhost:3306/jdbc_test_db"; //数据库URL(资源定位唯一标识符)
String DBusername="root"; //数据库用户名
String DBpasswd="111111"; //数据库密码
//1.加载数据库驱动,将Driver注册到DriverManager中
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(ClassNotFoundException e){
e.printStackTrace();
}
//2.通过数据库URL连接到数据库
Connection conn=null;
CallableStatement callStmt=null;
try{
//3.获得表示连接到数据库的Connection对象
conn=DriverManager.getConnection(url, DBusername, DBpasswd);
//4.获取执行存储过程SQL语句的CallableStatement对象
callStmt=conn.prepareCall("call pro(?,?)");
callStmt.setString(1, "pro"); //向第一个占位符参数,赋值nam='pro'
callStmt.setInt(2, 100); //向第二个占位符,赋值为n=100
callStmt.execute(); //执行sql语句
}catch(SQLException e){
e.printStackTrace();
}
//5.释放JDBC资源
if(callStmt!=null) //关闭声明
{
try{
callStmt.close();
}catch(SQLException e){
e.printStackTrace();
}
}
if(conn!=null) //关闭连接
{
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}
?运行结果
二、事物(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 |