PreparedStatement 和 Statement 的区别(推荐使用PreparedStatement)
PreparedStatement与Statement在使用时的区别:
1.Statement:
String sql=" ";
executeUpdate(sql)
2.
PreparedStatement:
String sql(可能存在占位符?)
在创建PreparedStatement 对象时,将sql预编译 prepareStatement(sql)
executeUpdate()
setXxx()替换占位符?
推荐使用PreparedStatement:原因如下:
1. 编码更加简便(避免了字符串的拼接)
String name = "zs" ;
int age = 23 ; stmt:
String sql =" insert into student(stuno,stuname) values('"+name+"', "+age+" ) " ;
stmt.executeUpdate(sql); pstmt:
String sql =" insert into student(stuno,stuname) values(?,?) " ;
pstmt = connection.prepareStatement(sql);//预编译SQL
pstmt.setString(1,name);
pstmt.setInt(2,age);
2. 提高性能(因为 有预编译操作,预编译只需要执行一次)
需要重复增加100条数
stmt://编译100次,执行100次
String sql =" insert into student(stuno,stuname) values('"+name+"', "+age+" ) " ;
for(100)
stmt.executeUpdate(sql); pstmt://编译1次,执行100次
String sql =" insert into student(stuno,stuname) values(?,?) " ;
pstmt = connection.prepareStatement(sql);//预编译SQL
pstmt.setString(1,name);
pstmt.setInt(2,age);
for( 100){
pstmt.executeUpdate();
}
3.安全(可以有效防止 sql 注入)
sql 注入: 将客户输入的内容 和 开发人员的SQL语句 混为一体
stmt:存在被sql注入的风险
(例如输入 用户名:任意值 ' or 1=1 --
密码:任意值)
分析:
select count(*) from login where uname='任意值 ' or 1=1 --' and upwd ='任意值' ; select count(*) from login where uname='任意值 ' or 1=1 ; select count(*) from login ; select count(*) from login where uname='"+name+"' and upwd ='"+pwd+"' pstmt:有效防止sql注入
推荐使用PreparedStatement
代码对比
package jdbcproject;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; public class JDBCStatementDemo {
private static final String URL = "jdbc:mysql://localhost:3306/mydatabase?serverTimezone=GMT%2B8";
private static final String USERNAME = "root";
private static final String PWD = "password"; public static void update() throws ClassNotFoundException, SQLException {// 增删改
// a. 导入驱动,加载具体的驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
// b.与数据库建立连接
Connection connection = DriverManager.getConnection(URL, USERNAME, PWD);
// c.发送sql,执行增删改查
Statement stmt = connection.createStatement();
//增加 String sql = "insert into student values(2,'李四',21)";
//修改 String sql = "update student set name='张三' where id=1";
//删除
String sql = "delete from student where id=1";
int count = stmt.executeUpdate(sql);
if (count > 0) {
System.out.println("操作成功!");
}
stmt.close();
connection.close(); }
public static void query() throws ClassNotFoundException, SQLException {// 增删改
// a. 导入驱动,加载具体的驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
// b.与数据库建立连接
Connection connection = DriverManager.getConnection(URL, USERNAME, PWD);
// c.发送sql,执行增删改[查]
Statement stmt = connection.createStatement();
char stuname='a';
//模糊查询
String sql = "select id,name,age from student where name like '%"+stuname+"%'";
ResultSet rs=stmt.executeQuery(sql);
//int count = stmt.executeUpdate(sql);
while (rs.next()) {
int id=rs.getInt("id");
String name=rs.getString("name");
int age=rs.getInt("age");
System.out.println(id+"--"+name+"--"+age); }
rs.close();
stmt.close();
connection.close(); }
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// update();
query();
}
}
JDBCStatementDemo
package jdbcproject; import java.lang.invoke.StringConcatFactory;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement; public class JDBCPreparedStatementDemo {
private static final String URL = "jdbc:mysql://localhost:3306/mydatabase?serverTimezone=GMT%2B8";
private static final String USERNAME = "root";
private static final String PWD = "password"; public static void update() throws ClassNotFoundException, SQLException {// 增删改
// a. 导入驱动,加载具体的驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
// b.与数据库建立连接
Connection connection = DriverManager.getConnection(URL, USERNAME, PWD);
// c.发送sql,执行增删改查
//sql提前写
String sql="insert into student values(?,?,?)";
PreparedStatement pstmt = connection.prepareStatement(sql);//预编译
pstmt.setInt(1, 5);
pstmt.setString(2, "超凡");
pstmt.setInt(3, 21); //增加 String sql = "insert into student values(2,'李四',21)";
//修改 String sql = "update student set name='张三' where id=1";
//删除 String sql = "delete from student where id=1";
//这里括号不用再写sql
int count = pstmt.executeUpdate();
if (count > 0) {
System.out.println("操作成功!");
}
//后开先关,先开的后关,和栈类似
pstmt.close();
connection.close(); }
public static void query() throws ClassNotFoundException, SQLException {// 增删改
// a. 导入驱动,加载具体的驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
// b.与数据库建立连接
Connection connection = DriverManager.getConnection(URL, USERNAME, PWD);
// c.发送sql,执行增删改[查]
//sql提前写
char stuname='a';
String sql = "select * from student where name like ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, "%g%");
//模糊查询 ResultSet rs=pstmt.executeQuery();
//int count = stmt.executeUpdate(sql);
while (rs.next()) {
int id=rs.getInt("id");
String name=rs.getString("name");
int age=rs.getInt("age");
System.out.println(id+"--"+name+"--"+age); }
//后开先关,先开的后关,和栈类似
rs.close();
pstmt.close();
connection.close(); }
public static void main(String[] args) throws ClassNotFoundException, SQLException {
// update();
query();
}
}
JDBCPreparedStatementDemo
PreparedStatement 和 Statement 的区别(推荐使用PreparedStatement)的更多相关文章
- PreparedStatement与Statement的区别
PreparedStatement与statement的区别 1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程 2.使用 Statement 对象 ...
- JDBC增删改查,PreparedStatement和Statement的区别
此篇是在上一篇的基础上使用PreparedStatement对象来实现JDBC增删改查的 具体工具类JDBCTools和实现类和配置文件在上一篇Statement对象实现的时候有写. 上一篇地址htt ...
- PreparedStatement和Statement的区别
转自:http://blog.sina.com.cn/s/blog_77eba18f01019csh.html 1. PreparedStatement接口继承Statement, PreparedS ...
- JDBC中PreparedStatement和Statement的区别
共同点: PreparedStatement和Statement都是用来执行SQL查询语句的API之一. 不同点: 在PreparedStatement中,当我们经常需要反复执行一条结构相似的sql语 ...
- PreparedStatement 与 Statement 的区别
1. PreparedStatement 接口继承 Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象. 2.作为 ...
- java PreparedStatement和statement的区别
1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象.2.作为 St ...
- JDBC 4 PreparedStatement 与Statement 的区别
1 有安全性 PreparedStatement 可以由于不是使用拼接,防止了sql注入,提高了安全性. 2 更方便 PreparedStatement 可以自动对类型进行转换,代码可读性,可维护 ...
- PreparedStatement与Statement区别
就这牛客网的一道题,进行分析PreparedStatement与Statement的区别. 题目: 关于PreparedStatement与Statement描述错误的是() A 一般而言,Prepa ...
- java.sql.preparedstatement和java.sql.statement的区别
本文转自CSDN,然后整理了一遍.原文出处:CSDN JDBC(java database connectivity,java数据库连接)的api中的主要的四个类之一的java.sql.stateme ...
随机推荐
- Django 中的select_related函数优化查询
参考链接: https://blog.csdn.net/secretx/article/details/43964607 在数据库有外键的时候,使用select_related()和prefech_r ...
- ES5-严格模式
在es5中可以开启一种严格模式的代码形式,开启方式是:将全局或者函数的第一条语句定义为:'use strict';. 如果浏览器不支持,会将其解析为一条普通语句,没有任何的副作用. 开启全局模式后会有 ...
- 孤荷凌寒自学python第103天认识区块链017
[主要内容] 今天继续分析从github上获取的开源代码怎么实现简单区块链的入门知识,共用时间25分钟. (此外整理作笔记花费了约34分钟) 详细学习过程见文末学习过程屏幕录像. 今天所作的工作是进一 ...
- 了解 Fetch API与Fetch+Async/await
背景 提及前端与服务器端的异步通信,离不开 Ajax (Asynchronous JavaScript and XML).实际上我们常说的 Ajax 并非指某一项具体的技术,它主要是基于用脚本操作 H ...
- 记一次安装体验:pwn工具
几天前删了JDK,结果和VM在一个目录中,结果VM全没了,重安走起 记载一下安装虚拟机出现的问题,官网一个字....慢,于是找了百度网盘,据说win10版本太低没法用,我就下了vw15.5.0(建立在 ...
- JDBC 存储过程
存储过程 DROP PROCEDURE IF EXISTS `addUser`; CREATE PROCEDURE `addUser` (),in birthday date,in money flo ...
- Tomcat 8 Invalid character found in the request target. The valid characters are defined in RFC 3986
终极解决方案: Invalid character found in the request target. The valid characters are defined in RFC 3986 ...
- CSP-201609-4 交通规划
问题描述 G国国王来中国参观后,被中国的高速铁路深深的震撼,决定为自己的国家也建设一个高速铁路系统. 建设高速铁路投入非常大,为了节约建设成本,G国国王决定不新建铁路,而是将已有的铁路改造成高速铁路. ...
- Python 数据的输入
一.单个输入 a=input("输入提示语句")#默认a的类型是字符串 b=input() 二.一行输入两个/三个数据,数据之间用空格间隔开 #a,b的数据类型都是整数 a,b=m ...
- C# 中的委托和事件 转载张子阳的
C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人 ...