php jdbc链接数据库,JDBC连接数据库实例讲解

本文介绍了在PHP中使用PreparedStatement替代Statement的原因和优势。使用PreparedStatement可以避免SQL注入问题,提高批量执行相同语义但含有动态数据的SQL时的效率,因为它允许预编译并重用执行计划。通过示例展示了如何使用PreparedStatement执行查询和更新操作。
摘要由CSDN通过智能技术生成

1 使用Statement执行含有动态信息的SQL语句时有几个不足:

1.1 由于需要将动态数据拼接到SQL语句中,这导致程序复杂度高,容易出错

1.2 拼接的数据若含有SQL语法内容就会导致拼接后的SQL语法含义改变而出现SQL注入攻击

1.3 当大批量执行语义相同,但是含有动态数据的SQL时效率很差

2 使用Statement执行SQL语句不好的原因

2.1 当执行一条SQL语句发送到数据库时,数据库先将该SQL解析并生成一个执行计划(这个过程会消耗资源和性能),如果多次执行一样的SQL语句,数据库会重用执行计划,但是若多次执行语义相同但是含有动态数据的SQL时,数据库会生成不同的执行计划,严重影响数据库的开销

2.2 例如

执行 SELECT * FROM userifo_fury 生成一个执行计划再次执行SELECT * FROM userifo_fury 就会重用上面的执行计划(因为这是静态的SQL语句

但是,执行INSERT INTO userifo VALUES(1, 'JACK','122314','141234@QQ.COM','FURY',15600) )生成一个执行计划,再执行执行INSERT INTO userifo VALUES(2, 'rose','122314','141234@QQ.COM','FURY',15600)由于内容不同,会再次生成另外一个执行计划,若执行1000次上述情况的INSERT,数据库会产生1000个执行计划,这样就严重影响了数据库的效率

因此,Statement只适合执行静态的SQL语句,不适合执行动态的SQL语句

3 利用PreparedStatement代替Statement

编写简单

没有SQL注入问题

批量执行语义相同的SQL语句会重用执行计划

1 package cn.xiangxu.entity; 2 3 import java.io.Serializable; 4 5 public class User implements Serializable { 6 7 private static final long serialVersionUID = -5109978284633713580L; 8 9 private Integer id;10 private String name;11 private String pwd;12 public User() {13 super();14 // TODO Auto-generated constructor stub15 }16 public User(Integer id, String name, String pwd) {17 super();18 this.id = id;19 this.name = name;20 this.pwd = pwd;21 }22 @Override23 public int hashCode() {24 final int prime = 31;25 int result = 1;26 result = prime * result + ((id == null) ? 0 : id.hashCode());27 return result;28 }29 @Override30 public boolean equals(Object obj) {31 if (this == obj)32 return true;33 if (obj == null)34 return false;35 if (getClass() != obj.getClass())36 return false;37 User other = (User) obj;38 if (id == null) {39 if (other.id != null)40 return false;41 } else if (!id.equals(other.id))42 return false;43 return true;44 }45 public Integer getId() {46 return id;47 }48 public void setId(Integer id) {49 this.id = id;50 }51 public String getName() {52 return name;53 }54 public void setName(String name) {55 this.name = name;56 }57 public String getPwd() {58 return pwd;59 }60 public void setPwd(String pwd) {61 this.pwd = pwd;62 }63 @Override64 public String toString() {65 return "User [id=" + id + ", name=" + name + ", pwd=" + pwd + "]";66 }67 68 69 70 }user表对应的实体类

1 package testJDBC; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLExcepti

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值