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

最新文章

  1. Unity WebGL MoonSharp崩溃问题
  2. 1006. Sign In and Sign Out (25)
  3. Linux crontab命令的使用方法
  4. django 学习-2 模板
  5. [原博客] POI系列(1)
  6. java实现栈的数据结构
  7. web框架开发-Django模型层(1)之ORM简介和单表操作
  8. 2017-12-19python全栈9期第四天第二节之列表的增删查改之按索引改和按切片改
  9. python记录day24 模块的语法
  10. lintcode 刷题 by python 部分链表题总结(2)
  11. JMeter学习(十三)目录介绍(转载)
  12. Python基础(10)——类进阶(静态方法、类方法、属性方法)
  13. Java应用中使用ShutdownHook友好地清理现场
  14. js之隔行换色
  15. [译文]casperjs的API-colorizer模块
  16. JS函数节流和函数防抖问题分析
  17. URL OpenDocument
  18. POJ-3020 Antenna Placement---二分图匹配&最小路径覆盖&建图
  19. CRC32为例详细解析(菜鸟至老鸟进阶)
  20. html5制作坦克大战

热门文章

  1. List转为字符串
  2. python3升级pip报错ImportError: cannot import name 'main'
  3. 汇编语言从入门到精通-2CPU资源和存储器
  4. Java基础 -2.6
  5. Spring注解@Qualifier、@Autowired、@Primary
  6. Jquery 分页案例
  7. 「CH6801」棋盘覆盖
  8. 「luogu1613」跑路
  9. 六、Centos7中配置svn服务器
  10. 本周总结(19年暑假)—— Part5