示例演示往数据库student表,book表中批量插入数据。
student表有四个字段,stu_name(学号,INTEGER类型),stu_name(名称,varchar2(200)),stu_age(年龄,INTEGER类型),stu_class(班级,varchar2(200))。
CREATE TABLE "STUDENT" ( "STU_NUM" NUMBER(*,0), "STU_NAME" VARCHAR2(200), "STU_AGE" NUMBER(*,0), "STU_CLASS" VARCHAR2(200) )
book表中有四个字段,num(编号,INTEGER类型),name(名称,varchar2(200)),type(类型,varchar2(200))。
CREATE TABLE "SYSTEM"."BOOK" ( "NUM" NUMBER(*,0), "NAME" VARCHAR2(200), "TYPE" VARCHAR2(200) )
Statement方式批量执行SQL的优点在于可以执行多条SQL语句,缺点也很明显,需要改变SQL语句时需要修改程序,每次执行都需要重新编译SQL。下面通过举例说明。
/**
* 通过Statement对象进行批量插入PreparedStatement优点是SQL语句结构不变,并且经过预编译,所以一般适用于一条SQL语句,多行参数。对于插入场景很适用。但是需要知道表中拥有哪些字段,如何设置这些值,如果表结构修改,需要修改代码。
/**
* 通过PreparedStatement对象进行批量插入
* @throws SQLException
*/
private static void insertByPreparedStatement() throws SQLException
{
// 获取连接对象
Connection conn = ConnectionUtil.getConn();
// 插入Sql语句
String insertSql = "insert into student values(?,?,?,?)";
// 获取PreparedStatement对象
PreparedStatement preStatement = conn.prepareStatement(insertSql);
// 设置参数
for(int i=2;i<100;i++)
{
// 添加批量执行批量,相比于Statement的方式,一条sql语句,多行参数,适用于单表插入
setPreparedStatementParam(preStatement, i, "test"+i, 23, "333班");
preStatement.addBatch();
}
preStatement.executeBatch();
// 清空批量,关闭对象
preStatement.clearBatch();
preStatement.close();
}
/**
* 为PreparedStatement对象设置参数
* @param preStatement PreParedStament对象
* @param stuNum 学号
* @param name 姓名
* @param age 年龄
* @param stuClass 班级
* @throws SQLException
*/
private static void setPreparedStatementParam(PreparedStatement preStatement, int stuNum, String name, int age,
String stuClass) throws SQLException
{
preStatement.setInt(1, stuNum);
preStatement.setString(2, name);
preStatement.setInt(3, age);
preStatement.setString(4, stuClass);
}
CallableStatement的方式优点在于只需要了解存储过程中的使用,不需要了解表结构,当表结构改变时,不用修改程序.
/**