读书人

利用JDBC对数据库进展批量插入数据操作

发布时间: 2012-08-11 20:50:31 作者: rapoo

利用JDBC对数据库进行批量插入数据操作,执行次数100万
http://www.javait.org/?p=877

package com.gxa.edu;import javax.swing.JFrame;import javax.swing.JButton;import javax.swing.ImageIcon;import javax.swing.JLabel;import javax.swing.JTextArea;import javax.swing.JTextField;import javax.swing.JPasswordField;import javax.swing.JComboBox;import javax.swing.JRadioButton;import javax.swing.ButtonGroup; import java.awt.FlowLayout;import java.awt.Color;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement; /** * @author Administrator * 国信安百杰高端Java培训 */public class Test extends JFrame {public final String url = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=stu";public final String username = "sa";public final String password = "123456";public final String classdriver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; public Connection conn;public Statement stmt;public ResultSet rs; public Test() {try {Class.forName(classdriver);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}} /** * 利用JDBC来创建表 */public void createTable() {String sql = "create table batch (a1 varchar(10),a2 varchar(500))";try {conn = DriverManager.getConnection(url, username, password);stmt = conn.createStatement();boolean f = stmt.execute(sql);System.out.println(f);} catch (SQLException e) {e.printStackTrace();}} /** * 对数据库进行批量插入数据操作 * 执行次数100万 */public void insertBatch() {//思路:将100万条数据分成n等份,1等份为1000条数据//如何实现?//1、必须将Connection接口的自动提交方式改为手动//2、利用Statement接口中的如下三个方法:addBatch、clearBath、executeBatchtry {conn = DriverManager.getConnection(url, username, password);conn.setAutoCommit(false);stmt = conn.createStatement();for (int i = 0; i < 1000000; i++) {String sql = "insert into batch values ('"+i+"', '第"+i+"条数据')";//利用addBatch方法将SQL语句加入到stmt对象中stmt.addBatch(sql);if (i % 1000 == 0 && i != 0) {//利用executeBatch方法执行1000条SQL语句stmt.executeBatch();stmt.clearBatch();conn.commit();}}stmt.executeBatch();stmt.clearBatch();conn.commit();close(); //关闭资源} catch (SQLException e) {e.printStackTrace();}} public void close() {try {if (rs != null) rs.close();if (stmt != null) stmt.close();if (conn != null) conn.close();} catch (SQLException e) {e.printStackTrace();}} /** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubTest t = new Test();//t.createTable();t.insertBatch();} }



下面是另外一篇:
http://hi.baidu.com/a393060727/blog/item/152068f4e6d17adef2d38554.html

不过下面少了stmt.clearBatch();这样的操作,而且如果bath 与 PrepareStatement一起使用的话交果会更好。

jdbc连接数据库:首先要找到相应的数据库驱动,指定连接的数据库
加载驱动:Class.forName(驱动名);
获得连接:Connection con = DriverManager.getConnection("数据库连接","用户名","密码");
执行SQL语句:Statement && PreparedStatement
写法:Statement stmt = con.createStatement(); 或PreparedStatement pstm = con.preparedStatement(sql);
执行查询:返回结果ResultSet集 stmt.executeQuery(sql语句);
执行增删改:返回影响行数 int count = stmt.executeUpdate(sql语句);
获得游标:rs.next();判断是否有下一个游标 返回一个boolean
获得结果类型:rs.get类型名(字段名)
操作完成,关闭顺序,后打开的先关闭。

调用存储过程:CallableStatement csmt =con.prepareCall("{call p(?,?,?,?)}");
创建一个调用存储过程的对象,调用存储过程,存储过程名字叫p,他有4个参数
csmt.registerOutParament(3,Types.INTEGER);
csmt.registerOutParament(4,Types.INTEGER);//设置输出数,并设置类型
csmt.setInt(1,3);
csmt.setInt(2,5);
csmt.setInt(4,7);//设置参数的值
csmt.execute();//执行操作
csmt.getInt(3);
csmt.getInt(4);//获取存储过程的输出值
csmt.close();//关闭执行结果


批处理Batch
用:
Statement stmt = con.createStatement();
stmt.addButch(SQL语句);
stmt.addButch(SQL语句);
stmt.addButch(SQL语句);
stmt.addButch(SQL语句);
stmt.executeButh();
或:
PreparedStatement pstm = null;
pstm = con.prepareStatement("insert into aa values(?,?,?)");
pstm.setInt(1, 12);
pstm.setString(2,"李五A");
pstm.setString(3, "中文A");
pstm.addBatch();
pstm.setInt(1, 22);
pstm.setString(2,"李五B");
pstm.setString(3, "中文B");
pstm.addBatch();
pstm.setInt(1, 32);
pstm.setString(2,"李五C");
pstm.setString(3, "中文C");
pstm.addBatch();



//批量执行上面3条语句. 一口吞了,很爽
int [] counts = statement.executeBatch();

//Commit it 咽下去,到肚子(DB)里面
connection.commit();


读书人网 >其他数据库

热点推荐