← 返回首页
JDBC教程(六)
发表时间:2020-03-22 13:20:02
讲解JDBC之批处理

JDBC实现批处理有两种方式:Statement和PreparedStatement。

批处理常用方法:

方法名字 含义
addBatch(sql) 添加sql语句到批处理
addBatch() 添加sql语句到批处理,要求SQL语句相同参数不同
executeBatch() 执行批处理
clearBatch() 清除批处理

1.使用Statement

实例:

        String sql = "";
        try(Connection conn= DBUtils.getConnection()
            ;Statement stmt = conn.createStatement())
        {
               sql = "insert into students (sname,gender) values ('刘备','男')";
               stmt.addBatch(sql);
               sql = "update students set gender = '女' where sid = 3";
               stmt.addBatch(sql);
               sql = "delete from students where sid >8";
               stmt.addBatch(sql);
               //执行批处理
               stmt.executeBatch();

        }catch(Exception ex){
            ex.printStackTrace();
        }

这里我们使用try-with-resources,实现Connection与Statement资源的自动释放。 使用addBatch(sql)执行批处理的好处是可以向数据库发送多条不同的SQL语句。但是缺点是SQL语句没有预编译。

2.使用PreparedStatement

使用批处理批量添加10条学生记录。

class Students {
    private String sname;
    private String gender;

    public Students() {
    }

    public Students(String sname, String gender) {
        this.sname = sname;
        this.gender = gender;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Students{" +
                "sname='" + sname + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}


public class BatchDemo {

    public static List<Students> studentsList = new ArrayList<Students>();

    public static void initStudentsList() {
        for (int i = 1; i <= 10; i++) {
            Students s = new Students("张" + i, "男");
            studentsList.add(s);
        }
    }

    public static void main(String[] args) {
        initStudentsList();
        String sql = "insert into students (sname,gender) values (?,?)";
        try (Connection conn = DBUtils.getConnection()
             ; PreparedStatement pstmt = conn.prepareStatement(sql)) {
             studentsList.forEach(s -> {
                try {
                    pstmt.setString(1, s.getSname());
                    pstmt.setString(2, s.getGender());
                    pstmt.addBatch();

                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            });
            pstmt.executeBatch();

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

addBatch()实现批处理的优点是:发送的是预编译后的SQL语句,执行效率高。缺点是:只能应用在SQL语句相同,但参数不同的批处理中。因此此种形式的批处理经常用于在同一个表中批量插入数据,或批量更新表的数据。