八、JDBC批量处理sql语句

业务场景:
当需要向数据库发送一批 SQL 语句执行时,应避免向数据库一条条的发送执行,而应采用 JDBC 的批处理机制,以提升执行效率。
实现批处理的第一种方式
采用如下方法:
Statement.addBatch(sql)
执行批处理 SQL 语句
executeBatch() 方法:执行批处理命令

clearBatch()方法:清除批处理命令

八、JDBC批量处理sql语句_第1张图片
优点: 可以向数据库发送多条不同的SQL语句。
缺点:
SQL 语句没有预编译。
当向数据库发送多条语句相同,但仅参数不同的 SQL 语句时,需重复写上很多条 SQL 语句。例如:
Insert into user(name,password) values( aa , 111 );
Insert into user(name,password) values( bb , 222 );
Insert into user(name,password) values( cc , 333 );
Insert into user(name,password) values( dd , 444 );
实现批处理的第二种方式
采用 PreparedStatement.addBatch() 方法执行。
八、JDBC批量处理sql语句_第2张图片
优点: 可以通过占位符预编译,简化了重复属性多条格式相同的语句。
缺点: 执行批处理的时候只能执行同一格式类型的语句,不能混合其他语句同时执行

下面写了个一个demo关于如何批量操作的演示:
package demo4;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;

import utils.JdbcUtils;

public class BatchTest {
	public static void main(String[] args) {
		//testStatement();
		 testPreparedStatement();
	}
        //方式1
	private static void testStatement() {
		Connection conn = JdbcUtils.getConnection();
		Statement stmt = null;
		if (null != conn) {
			try {
				stmt = conn.createStatement();
				//1.定义sql语句
				String sql1 = "create table if not exists book(id int primary key auto_increment," 
                                                + "name varchar(20),"
                                                + "price double);";
				String sql2 = "insert into book values(null,'三国演义2',50);";
				String sql3 = "insert into book values(null,'红楼梦2',52);";
				
				//2.添加要执行的任意类型的sql语句到批处理
				stmt.addBatch(sql1);
				stmt.addBatch(sql2);
				stmt.addBatch(sql3);
			
				//3.执行批处理
				stmt.executeBatch();
				
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				JdbcUtils.release(null, stmt, conn);
			}
		}
	}
        //方式2
	private static void testPreparedStatement() {
		Connection conn = JdbcUtils.getConnection();
		PreparedStatement stmt = null;
		if (null != conn) {
			try {
				stmt = conn.prepareStatement("insert into book values(null,?,?)");
				// 1.通过stmt替换占位符
				for (int i = 1; i <= 120; i++) {
					stmt.setString(1, "新书" + i);
					stmt.setDouble(2, 50 + i);

					// 2.添加到batch中
					stmt.addBatch();
					
					// 3.执行批处理
					if (i % 50 == 0) {
						// 提高执行效率
						stmt.executeBatch();
						stmt.clearBatch();
					}
				}
				// 4.剩下的数据也需要执行批处理
				stmt.executeBatch();
			} catch (SQLException e) {
				e.printStackTrace();
			} finally {
				JdbcUtils.release(null, stmt, conn);
			}
		}
	}
}
JdbcUtils详情在这里的demo2

你可能感兴趣的:(mysql)