批处理和存储过程

来源:互联网 发布:广州大塘附近淘宝培训 编辑:程序博客网 时间:2024/06/10 05:53

批处理:一次执行多条sql语句

package com.heima.jdbc;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.Statement;import java.util.Date;import org.junit.Test;import com.heima.utils.JdbcUtils;public class BatchTest {// 通过Statement命令对象演示一个插入3条记录@Testpublic void testStatement() throws Exception {// 获得链接对象Connection conn = JdbcUtils.getConnection();// 创建预处理命令对象Statement stmt = conn.createStatement();String sql1 = "insert into t3 values(1,'令狐冲',20)";String sql2 = "insert into t3 values(2,'杨过',23)";String sql3 = "insert into t3 values(3,'乔峰',24)";// 将三条sql语句一起放入stmt对象中,一起发送到服务执行,在DBMS中会编译成一个逻辑执行单元,所以速度会更快一些stmt.addBatch(sql1);stmt.addBatch(sql2);stmt.addBatch(sql3);// 执行sql语句stmt.executeBatch();// 释放资源JdbcUtils.release(null, stmt, conn);}// 通过PreparedStatement对象插入三条数据@Testpublic void testPreparedStatement() throws Exception {// 获得链接对象Connection conn = JdbcUtils.getConnection();// 创建预处理命令对象PreparedStatement pstmt = conn.prepareStatement("insert into t3 values(?,?,?)");// 指定?的值pstmt.setInt(1, 4);pstmt.setString(2, "黄蓉");pstmt.setInt(3, 18);pstmt.addBatch();// 指定?的值pstmt.setInt(1, 5);pstmt.setString(2, "小龙女");pstmt.setInt(3, 17);pstmt.addBatch();// 指定?的值pstmt.setInt(1, 6);pstmt.setString(2, "赵敏");pstmt.setInt(3, 18);pstmt.addBatch();// 执行sql语句pstmt.executeBatch();// 释放资源JdbcUtils.release(null, pstmt, conn);}// 通过PreparedStatement对象插入1000条数据@Testpublic void testPreparedStatement1() throws Exception {// 获得链接对象Connection conn = JdbcUtils.getConnection();System.out.println(new Date());// 创建预处理命令对象PreparedStatement pstmt = conn.prepareStatement("insert into t3 values(?,?,?)");for (int i = 0; i < 1000; i++) {// 指定?的值pstmt.setInt(1, i);pstmt.setString(2, "黄蓉" + i);pstmt.setInt(3, i);pstmt.addBatch();if(i%200 == 0){//执行sql语句pstmt.executeBatch() ;//一定要清空缓存pstmt.clearBatch() ;}}//为了防止缓存中还有sql没有执行,应当再次 执行sql语句pstmt.executeBatch();System.out.println(new Date());// 释放资源JdbcUtils.release(null, pstmt, conn);}}



存储过程:

相当于一个方法

在数据库中定义一个方法

返回值叫输出参数

DELIMITER   &&                       用   DELIMITER  规定一个结束的标志(相当于分号)

CREATE PROCEDURE pro1()

begin

    select * from stu;

end;

$$

调用:

call pro1()

$$


#无参的存储过程
delimiter $$ 
 create procedure pro1()
 begin
     select * from stu ;
 end ;
 $$


#带输入参数的存储过程
 create procedure pro2(in a int)
 begin
    select * from stu where id = a ;
 end ;
 $$


delimiter $$
create procedure pro3(in a int,in b int)
begin
    select a + b ;
end ;
$$
delimiter ;


delimiter $$
create procedure pro4(in n int)
begin
    select * from t3 where id =  n ;
end ;
$$
delimiter ;


#创建带输出参数的存储过程
 delimiter $$
 create procedure pro5(in a int,out b varchar(20))
 begin
     select name into b from stu where id = a ;
 end ;
 $$


call pro5(1,@n) ;

select @n ;


#创建带多个输出参数的存储过程
 delimiter $$
  create procedure pro6(in a int,out b varchar(20),out c int)
 begin
      select name,age into b,c from stu where id = a ;
 end ;
 $$


select @name,@age $$



package com.heima.jdbc;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.Types;import org.junit.Test;import com.heima.utils.JdbcUtils;//演示JDBC调用存储过程public class ProcedureTest {//执行不带返回值的存储过程没有任何任意@Testpublic void testPro2() throws Exception {// 获得链接对象Connection conn = JdbcUtils.getConnection();// 创建执行存储过程的命令对象CallableStatement cstmt = conn.prepareCall("{call pro2(?)}") ;//指定?的值cstmt.setInt(1, 1) ;//执行存储过程cstmt.execute() ;// 释放资源JdbcUtils.release(null, cstmt, conn);}@Testpublic void testPro5() throws Exception {// 获得链接对象Connection conn = JdbcUtils.getConnection();// 创建执行存储过程的命令对象CallableStatement cstmt = conn.prepareCall("{call pro5(?,?)}") ;//指定?的值cstmt.setInt(1, 1) ;//指定第二个?是输出参数cstmt.registerOutParameter(2, Types.VARCHAR) ;//执行存储过程cstmt.execute() ;//获得返回值String name = cstmt.getString(2) ;System.out.println(name);// 释放资源JdbcUtils.release(null, cstmt, conn);}}


获取数据库自动生成的主键:



0 0
原创粉丝点击