statement与preparedStatement 批量操作(转)

原文:http://blog.csdn.net/etttttss/article/details/16819547

PreparedStatement:

1) addBatch()将一组参数添加到PreparedStatement对象内部。

2) executeBatch()将一批参数提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。

Statement:

1) addBatch(String sql)方法会在批处理缓存中加入一条sql语句。

2) executeBatch()执行批处理缓存中的所有sql语句。

注意:PreparedStatement中使用批量更新时,要先设置好参数后再使用addBatch()方法加入缓存。批量更新中只能使用更改、删除或插入语句

package com.ambow.day20.jdbc.JDBCTestCommitAndRollback;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import com.ambow.day19.jdbc.util.JDBCConAndClo;
/**//*
 *1,首先把Auto commit设置为false,不让它自动提交
 *2,进行手动提交(commit)
 *3,提交完成后回复现场将Auto commit,还原为true,
 *4,当异常发生执行catch中SQLException时,记得要rollback(回滚);
 * */
public class StatementCommitAndRollbackTest {
    public static void main(String args[]) {
        Connection con = null;
        Statement stm = null;
        try {
            con = JDBCConAndClo.getConnectionBao();
            stm = con.createStatement();
            con.setAutoCommit(false);
            // 若不出现异常,则继续执行到try语句完,否则跳转到catch语句中
            stm.addBatch("insert into student values(23,‘tangbao‘,‘高数‘,100)");
            stm.addBatch("insert into student values(24,‘王定‘,‘c#‘,98)");
            stm.addBatch("insert into student values(25,‘王国云‘,‘java‘,90)");
            stm.addBatch("insert into student values(26,‘溜出‘,‘英语‘,89)");
            stm.addBatch("insert into student values(27,‘wqde‘,‘java‘,63)");
            /**//*
             * int[] executeBatch() throws
             * SQLException将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
             */
            stm.executeBatch();
            System.out.println("插入成功!");
            // commit:若成功执行完所有的插入操作,则正常结束
            con.commit();
            System.out.println("提交成功!");
            con.setAutoCommit(true);   

        } catch (SQLException e) {
            e.printStackTrace();
            try {
    //rollback: 若出现异常,对数据库中所有已完成的操作全部撤销,则回滚到事务开始状态
                if (!con.isClosed()) {
                    con.rollback();
                    System.out.println("提交失败,回滚!");
                    con.setAutoCommit(true);
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            } finally {
                JDBCConAndClo.closeStatement(stm);
                JDBCConAndClo.closeConnection(con);
            }
        }
    }
}
PreparedStatement批量处理和事务代码如下:
package com.ambow.day20.jdbc.JDBCTestCommitAndRollback;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.ambow.day19.jdbc.util.JDBCConAndClo;   

/**//*
 * PreparedStatement:
 1.addBatch() 将一组参数添加到 PreparedStatement对象内部
 2.executeBatch() 将一批参数提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
 *
 */
public class PreparedStatementCommitAndRollbackTest {
    public static void main(String args[]) {
        Connection con = null;
        PreparedStatement pstm = null;   

        try {
            // 1. 建立与数据库的连接
            con = JDBCConAndClo.getConnectionBao();
            // 2. 执行sql语句
            // 1).先创建PreparedStatement语句(发送slq请求):
            pstm = con.prepareStatement("insert into student values(?,?,?,?)");
            con.setAutoCommit(false);//1,首先把Auto commit设置为false,不让它自动提交
            // 2) 设置sql语句1
            pstm.setInt(1, 33);
            pstm.setString(2,"wangqin");
            pstm.setString(3, "c++");
            pstm.setDouble(4, 78.5);
            // 3) 将一组参数添加到此 PreparedStatement 对象的批处理命令中。
            pstm.addBatch();
            // 2) 设置sql语句2
            pstm.setInt(1, 34);
            pstm.setString(2,"wuytun");
            pstm.setString(3, "c");
            pstm.setDouble(4, 77);
            // 3) 将一组参数添加到此 PreparedStatement 对象的批处理命令中。
            pstm.addBatch();
            // 2) 设置sql语句3
            pstm.setInt(1, 31);
            pstm.setString(2,"tetet");
            pstm.setString(3, "c++");
            pstm.setDouble(4, 90);
            // 3) 将一组参数添加到此 PreparedStatement 对象的批处理命令中。
            pstm.addBatch();
            // 2) 设置sql语句4
            pstm.setInt(1, 32);
            pstm.setString(2,"liug");
            pstm.setString(3, "c");
            pstm.setDouble(4, 50);
            // 3) 将一组参数添加到此 PreparedStatement 对象的批处理命令中。
            pstm.addBatch();
            // 4) 将一批参数提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。
            pstm.executeBatch();
            System.out.println("插入成功!");
            // 若成功执行完所有的插入操作,则正常结束
            con.commit();//2,进行手动提交(commit)
            System.out.println("提交成功!");
            con.setAutoCommit(true);//3,提交完成后回复现场将Auto commit,还原为true,   

        } catch (SQLException e) {
            e.printStackTrace();
            try {
                // 若出现异常,对数据库中所有已完成的操作全部撤销,则回滚到事务开始状态
                if(!con.isClosed()){
                    con.rollback();//4,当异常发生执行catch中SQLException时,记得要rollback(回滚);
                    System.out.println("插入失败,回滚!");
                    con.setAutoCommit(true);
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }finally{
            JDBCConAndClo.closePreparedStatement(pstm);
            JDBCConAndClo.closeConnection(con);
        }
    }
}  
时间: 2024-08-07 19:44:19

statement与preparedStatement 批量操作(转)的相关文章

Statement和PreparedStatement的区别; 什么是SQL注入,怎么防止SQL注入? (转)

问题一:Statement和PreparedStatement的区别 先来说说,什么是java中的Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.具体步骤: 1.首先导入java.sql.*:这个包. 2.然后加载驱动,创建连接,得到Connection接口的的实现对象,比如对象名叫做conn. 3.然后再用conn对象去创建Statement的实例,方法是:Statement stmt = conn

MySQL的简单操作方法:Statement、PreparedStatement

(1)连接mysql的工具类:DBUtil.java package com.xuliugen.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBUti

JDBC中的Statement和PreparedStatement的区别

以Oracle为例吧 Statement为一条Sql语句生成执行计划, 如果要执行两条sql语句 select colume from table where colume=1; select colume from table where colume=2; 会生成两个执行计划 一千个查询就生成一千个执行计划! PreparedStatement用于使用绑定变量重用执行计划 select colume from table where colume=:x; 通过set不同数据只需要生成一次执行

Statement和PreparedStatement的区别; 什么是SQL注入,怎么防止SQL注入?

问题一:Statement和PreparedStatement的区别 先来说说,什么是java中的Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.具体步骤: 1.首先导入java.sql.*:这个包. 2.然后加载驱动,创建连接,得到Connection接口的的实现对象,比如对象名叫做conn. 3.然后再用conn对象去创建Statement的实例,方法是:Statement stmt = conn

Java的Statement、PreparedStatement、PreparedStatement + 批处理 的区别

首先来说一下连接了数据库之后执行的sql语句:通常连接了数据库之后,我们就会获得statement 类的对象或者是他的子类的对象(PreparedStatement类),通过这个对象我们就可以利用它提供的方法来操纵数据库了. Statement提供了三种方法来执行sql语句: 1,execute:可以执行在任何的sql语句,但是比较麻烦,通常我们不会选择这一种的但是如果在不清楚SQL语句的类型时,那只能使用execute来执行sql语句了. 2,executeUpdata:主要用于执行DML与D

【Java编程】JDBC注入攻击-Statement 与 PreparedStatement

在上一篇[Java编程]建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement我们介绍了如何使用JDBC驱动建立一个简单的连接,并实现使用Statement和PreparedStatement进行数据库查询,本篇blog将接着上篇blog通过SQL注入攻击比较Statement和PreparedStatement.当然这两者还有很多其他方面的不同,在之后的blog中会继续更新. [Statement查询] 1.在DBH

[转] JDBC中的Statement和PreparedStatement的区别

以Oracle为例吧 Statement为一条Sql语句生成执行计划,如果要执行两条sql语句select colume from table where colume=1;select colume from table where colume=2;会生成两个执行计划一千个查询就生成一千个执行计划! PreparedStatement用于使用绑定变量重用执行计划select colume from table where colume=:x;通过set不同数据只需要生成一次执行计划,可以重用

【Java编程】建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement

本blog提供了一个简单的通过JDBC驱动建立JDBC连接例程,并分别通过Statement和PreparedStatement实现对数据库的查询.在下一篇blog中将重点比较Statement与PreparedStatement的差异. 1.为项目添加JDBC驱动 1)JDBC驱动下载 官方下载地址:mysql-connector-java-5.0.8.zip CSDN资料下载地址:mysql-connector-java-5.0.8.zip 2)为项目添加JDBC驱动 建立项目Java项目J

statement和preparedstatement用法区别

1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象. 2.作为 Statement 的子类,PreparedStatement 继承了 Statement 的所有功能.三种方法 execute. executeQuery 和 executeUpdate 已被更改以使之不再需要参数 3.在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedSt