转载请标明出处: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数据库应用程序调用该存储过程
- 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 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.源码实战
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.SQLException;
- import java.sql.Statement;
- public class JDBC_Transaction {
- /*MySQL数据库编程
- * 实例(7):JDBC批量处理事物Transaction*/
- public static void main(String[] args) {
- //0.连接数据库相关参数
- String url="jdbc:mysql://localhost:3306/jdbc_test_db"; //数据库URL(资源定位唯一标识符)
- String DBusername="root"; //数据库用户名
- String DBpasswd="896013"; //数据库密码
- //1.加载数据库驱动,将Driver注册到DriverManager中
- try{
- Class.forName("com.mysql.jdbc.Driver");
- }catch(ClassNotFoundException e){
- e.printStackTrace();
- }
- //2.通过数据库URL连接到数据库
- Connection conn=null;
- Statement stmt=null;
- try{
- //3.获得表示连接到数据库的Connection对象
- conn=DriverManager.getConnection(url, DBusername, DBpasswd);
- //4.设置SQL语句不自动执行
- conn.setAutoCommit(false);
- //5.获取Statement对象
- stmt=conn.createStatement();
- stmt.addBatch("insert into test(name,age,score) values(‘haha‘,10,33)");
- stmt.addBatch("insert into test(name,age,score) values(‘heihei‘,11,44)");
- stmt.addBatch("insert into test(name,age,score) values(‘xixi‘,14,55)");
- stmt.executeBatch(); //批量执行SQL语句
- conn.commit(); //提交事物
- conn.setAutoCommit(true);
- }catch(SQLException e){
- e.printStackTrace();
- }
- //5.释放JDBC资源
- if(stmt!=null) //关闭声明
- {
- try{
- stmt.close();
- }catch(SQLException e){
- e.printStackTrace();
- }
- }
- if(conn!=null) //关闭连接
- {
- try{
- conn.close();
- }catch(SQLException e){
- e.printStackTrace();
- }
- }
- }
- }
运行结果:
(1)注释事物提交语句
//conn.commit();
// conn.setAutoCommit(true);
(2)执行conn.commit()结果