使用 dbutils 进行批处理

来源:互联网 发布:ncbi geo数据库 编辑:程序博客网 时间:2024/06/02 00:18

使用步骤

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 |            +----+------+-----+         */    }}