天天看点

使用 dbutils 进行批处理使用步骤示例

使用步骤

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

}