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)的更多相关文章

  1. PreparedStatement与Statement的区别

    PreparedStatement与statement的区别 1.PreparedStatement是预编译的,对于批量处理可以大大提高效率. 也叫JDBC存储过程 2.使用 Statement 对象 ...

  2. JDBC增删改查,PreparedStatement和Statement的区别

    此篇是在上一篇的基础上使用PreparedStatement对象来实现JDBC增删改查的 具体工具类JDBCTools和实现类和配置文件在上一篇Statement对象实现的时候有写. 上一篇地址htt ...

  3. PreparedStatement和Statement的区别

    转自:http://blog.sina.com.cn/s/blog_77eba18f01019csh.html 1. PreparedStatement接口继承Statement, PreparedS ...

  4. JDBC中PreparedStatement和Statement的区别

    共同点: PreparedStatement和Statement都是用来执行SQL查询语句的API之一. 不同点: 在PreparedStatement中,当我们经常需要反复执行一条结构相似的sql语 ...

  5. PreparedStatement 与 Statement 的区别

    1. PreparedStatement 接口继承 Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象. 2.作为 ...

  6. java PreparedStatement和statement的区别

    1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象.2.作为 St ...

  7. JDBC 4 PreparedStatement 与Statement 的区别

    1  有安全性 PreparedStatement 可以由于不是使用拼接,防止了sql注入,提高了安全性. 2  更方便 PreparedStatement 可以自动对类型进行转换,代码可读性,可维护 ...

  8. PreparedStatement与Statement区别

    就这牛客网的一道题,进行分析PreparedStatement与Statement的区别. 题目: 关于PreparedStatement与Statement描述错误的是() A 一般而言,Prepa ...

  9. java.sql.preparedstatement和java.sql.statement的区别

    本文转自CSDN,然后整理了一遍.原文出处:CSDN JDBC(java database connectivity,java数据库连接)的api中的主要的四个类之一的java.sql.stateme ...

随机推荐

  1. sqllab less-1

    1.访问sqllab 的less-1 按提示加入http://10.9.2.81/Less-1/?id=1 2. 后面加入单引号,发生报错http://10.9.2.81/Less-1/?id=1‘ ...

  2. java.util.ConcurrentModificationException 异常原因和解决方法

    不要在 foreach 循环里进行元素的 remove/add 操作.remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁. 注意: 1.foreach遍历 ...

  3. 笔记-mongodb-用户及角色

    笔记-mongodb-用户及角色 1.      users 其实mongodb支持多种验证方式,本文只提及最简单也最常用的方式. 1.1.  Authentication Database When ...

  4. ES5-json对象和字符串互转

    JSON.stringify();和JSON.parse();是在ES5中提出并使用的:JSON.stringify();将一个对象转化为json字符串,JSON.parse();将一个对象转化为对象 ...

  5. ls命令与cd命令

    ls命令用于显示文件目录列表,当使用ls命令时,默认显示的只有非隐藏文件或文件夹(隐藏文件在linux中前面有 ' . ' ),当不加参数时,显示当前目录. 1.ls命令语法 ls [参数][目标文件 ...

  6. JSON转换的实现

    String转成JSON这个依赖很重要,我们将围绕fastjson中的JSONObject这个类来谈转换 <dependency> <groupId>com.alibaba&l ...

  7. Charles + Android 抓取Https数据包 (适用于Android 6.0及以下)

    通过Charles代理,我们能很轻易的抓取手机的Http请求,因为Http属于明文传输,所以我们能直接获取到我们要抓取的内容.但是Https内容本身就是加密的,这时我们会发现内容是加密的了.本文我们来 ...

  8. web前端面试第一次[定时器]

    BOM中定时器--计时器 定时器参数两个:(函数,时间(单位ms(1000ms=1s))) 时间设置1s,每过1s执行一次函数 //设置定时器 setInterval(funtion(){ alert ...

  9. 「ZJOI2013」K大数查询

    「ZJOI2013」K大数查询 传送门 整体二分,修改的时候用线段树代替树状数组即可. 参考代码: #include <cstdio> #define rg register #defin ...

  10. Input输入框日期控件

    案例 https://pan.baidu.com/s/1i6BNLcT   密码:p77m