使用步骤
1、导入mysql-connector-java-5.1.37-bin 【此版本的驱动支持批处理】
2.需要在c3p0-config.xml中的 jdbcUrl参数【数据库URL】后面添加:
?rewriteBatchedStatements=true
3、调用QueryRunner的 batch方法
public int[] batch(Connection conn, String sql, Object[][] params) throws SQLException {}
需要传入 连接对象、要执行的SQL语句、要批量执行的SQL语句的二维数组
其中:
要批量执行的SQL语句的二维数组:
数组的第一维:数组的行号【从0开始】
数组的第二维:SQL语句占位符的参数,组成的数组
示例
【test数据库下的persons表】
CREATE TABLE persons(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL UNIQUE KEY,
age INT NOT NULL
);
mysql> DESC persons;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(100) | NO | UNI | NULL | |
| age | int(11) | NO | | NULL | |
+-------+--------------+------+-----+---------+----------------+
【c3p0-config.xml要注意的地方】
<property name="jdbcUrl">jdbc:mysql:///?rewriteBatchedStatements=true</property>
【Person(JavaBean)】
Integer id, String name, Integer age; 提供get、set方法 有参无参构造
【JDBCUtils】
提供公共的静态的获取连接和关闭连接的方法
【BaseDAO】
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import com.test.batch.utils.JDBCUtils;
public class BaseDAO<T> {
private QueryRunner qr = new QueryRunner();
/**
* 批量增删改
* @param sql SQL语句
* @param params 要批量执行的SQL语句的二维数组
* <br />数组的第一维:数组的行号【从0开始】
* <br />数组的第二维:SQL语句占位符的参数,组成的数组
*/
public void batchUpdate(String sql, Object[][] params) {
Connection conn = null;
try {
conn = JDBCUtils.getConnection();
qr.batch(conn, sql, params);
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeConnection(conn);
}
}
}
【PersonDAO】
public interface PersonDAO {
/**
* 批量添加用户
*
* @param params
* 要添加的用户的数组
*/
void insert(Object[][] params);
/**
* 批量更新用户
*
* @param params
* 要更新的用户的数组
*/
void update(Object[][] params);
/**
* 批量删除用户
*
* @param params
* 要删除的用户的数组
*/
void delete(Object[][] params);
}
【PersonDAOImpl】
public class PersonDAOImpl extends BaseDAO<Person> implements PersonDAO {
@Override
public void insert(Object[][] params) {
String sql = "INSERT INTO test.persons VALUES(null, ?, ?)";
batchUpdate(sql, params);
}
@Override
public void update(Object[][] params) {
String sql = "UPDATE test.persons SET age = ? WHERE name = ?";
batchUpdate(sql, params);
}
@Override
public void delete(Object[][] params) {
String sql = "DELETE FROM test.persons WHERE name = ?";
batchUpdate(sql, params);
}
}
【PersonDaoImplTest】
public class PersonDAOImplTest {
private PersonDAO dao = new PersonDAOImpl();
@Test
public void testInsert() {
Object[][] params = new Object[10][];
int len = params.length;
// INSERT INTO test.persons VALUES(null, ?, ?)
for (int i = 0; i < len; i++) {
params[i] = new Object[] { "a" + i, i };
}
dao.insert(params);
/*
* 查询表的所有记录
* +----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a0 | 0 |
| 2 | a1 | 1 |
| 3 | a2 | 2 |
| 4 | a3 | 3 |
| 5 | a4 | 4 |
| 6 | a5 | 5 |
| 7 | a6 | 6 |
| 8 | a7 | 7 |
| 9 | a8 | 8 |
| 10 | a9 | 9 |
+----+------+-----+
*/
}
@Test
public void testUpdate() {
Object[][] params = new Object[5][];
int len = params.length;
// UPDATE test.persons SET age = ? WHERE name = ?
for (int i = 0; i < len; i++) {
params[i] = new Object[] { 10, "a" + (i + 4) };
}
dao.update(params);
/*
* 查询表的所有记录
* +----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a0 | 0 |
| 2 | a1 | 1 |
| 3 | a2 | 2 |
| 4 | a3 | 3 |
| 5 | a4 | 10 |
| 6 | a5 | 10 |
| 7 | a6 | 10 |
| 8 | a7 | 10 |
| 9 | a8 | 10 |
| 10 | a9 | 9 |
+----+------+-----+
*/
}
@Test
public void testDelete() {
Object[][] params = new Object[6][];
int len = params.length;
// DELETE FROM test.persons WHERE name = ?
for (int i = 0; i < len; i++) {
params[i] = new Object[] { "a" + (i + 3) };
}
dao.delete(params);
/*
* 查询表的所有记录
* +----+------+-----+
| id | name | age |
+----+------+-----+
| 1 | a0 | 0 |
| 2 | a1 | 1 |
| 3 | a2 | 2 |
| 10 | a9 | 9 |
+----+------+-----+
*/
}
}