JDBC中使用预编译Statement以及它的优点

21 篇文章 1 订阅
11 篇文章 1 订阅

JDBC中PreparedStatement与Statement一样是用于执行SQL语句的,比如增加,删除

1. 使用PreparedStatement

和 Statement一样,PreparedStatement也是用来执行sql语句的,与创建Statement不同的是,需要根据sql语句创建PreparedStatement。除此之外,还能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接:

String sql = "insert into hero values(null,?,?,?)";
Connection c = DriverManager.getConnection(...);
// 根据sql语句创建PreparedStatement
PreparedStatement ps = c.prepareStatement(sql);

// 设置参数
ps.setString(1, "...");
ps.setFloat(2, 313.0f);
ps.setInt(3, 50);
// 执行
ps.execute();
2. PreparedStatement的优点1 - 参数设置

Statement 需要进行字符串拼接,可读性和维护性比较差

String sql = “insert into hero values(null,”+"‘提莫’"+","+313.0f+","+50+")";

PreparedStatement 使用参数设置,可读性好,不易犯错

String sql = “insert into hero values(null,?,?,?)”;

3. PreparedStatement的优点2 - 性能表现

PreparedStatement有预编译机制,性能比Statement更快

// Statement执行10次,需要10次把SQL语句传输到数据库端
// 数据库要对每一次来的SQL语句进行编译处理
Statement s = c.createStatement();
for (int i = 0; i < 10; i++) {
    String sql = "insert into hero values(null," + "'...'" + ","
            + 313.0f + "," + 50 + ")";
    s.execute(sql);
}


// PreparedStatement 执行10次,只需要1次把SQL语句传输到数据库端
// 数据库对带?的SQL进行预编译

// 每次执行,只需要传输参数到数据库端
// 1. 网络传输量比Statement更小
// 2. 数据库不需要再进行编译,响应更快
String sql = "insert into hero values(null,?,?,?)";
PreparedStatement ps = c.prepareStatement(sql);
for (int i = 0; i < 10; i++) {
    ps.setString(1, "提莫");
    ps.setFloat(2, 313.0f);
    ps.setInt(3, 50);
    ps.execute();
}
4. PreparedStatement的优点3 - 防止SQL注入式攻击

假设name是用户提交来的数据

String name = “‘IronMan’ OR 1=1”;

使用Statement就需要进行字符串拼接
拼接出来的语句是:

select * from hero where name = ‘IronMan’ OR 1=1

因为有OR 1=1,这是恒成立
那么就会把所有的人都查出来,而不只是IronMan
如果表里的数据是海量的,比如几百万条,把这个表里的数据全部查出来
会让数据库负载变高,CPU100%,内存消耗光,响应变得极其缓慢

而PreparedStatement使用的是参数设置,就不会有这个问题

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值