JDBC-预编译-批量写入

3 篇文章 0 订阅
1 篇文章 0 订阅

说明:

数据库:mysql

库名:test

表名:user

字段:name varchar(50);id int.

一、JDBC
我们知道,要做一个jdbc查询操作要经历如下步骤:
1、加载类驱动
Class.forName("com.mysql.jdbc.Driver");
2、获取连接connection
String user = "root";
String pass = "root";
String url = "jdbc:mysql://localhost:3306/test";
Connection conn = DriverManager.getConection(user, pass, url);
3、创建语句对象
Statement stmt = conn.CreateStatment();
4、执行jdbc操作(比如执行查询),并获得结果集
ResultSet rs = stmt.executeQuery("select name, id from user");
5、遍历结果集
while(rs.next()){
    String name = rs.getString(1);
    Integer id = rs.getInt(2);
    System.out.println("name:"+name + ",id:"+id);
}
6、关闭资源
rs.close();
stmt.close();
conn.close();

常规的语句对象有两个缺点
a、每次操作都需要包sql语句传送给服务器,就算是执行相同的操作也是如此。如此以来带宽就被无情的浪费了。
b、对常规的语句对象,可能会产生sql注入问题,不安全。

二、预编译

可能是为了解决上面的缺陷,PreparedStatment应运而生。

获取连接时需要传入一个参数开启预编译。
String url = "jdbc:mysql://localhost:3306/test?useServerPrepStmts=true";
创建语句对象时要改成占位符形式传参
PreparedStatement  pstmt = conn.prepareStatement("select name, id from user where id =?");
pstmt.setInt(1, 1);

三、批量写入

但是仅仅是这样还不够,虽然安全了,但是性能反而降低了。对于需要执行多次的操作,比如插入操作,在性能上表现就会很差。
为了解决这个问题,我们需要开启批量写入功能
获取连接时需要开启批量写。
String url = "jdbc:mysql://localhost:3306/test?useServerPrepStmts=true&rewriteBatchedStatement=true";
创建语句对象时可以这么写
    PreparedStatement  pstmt = conn.prepareStatement("insert into user (name, id) values(?,?)");
    for(int i=0;i<100;i++){
        pstmt.setString(1, "tom");
        pstmt.setInt(2, i);
        pstmt.addBatch();
    }
    pstmt.executeBatch();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值