我是靠谱客的博主 悦耳百褶裙,最近开发中收集的这篇文章主要介绍Statement与PreparedStatement的使用与区别,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Statement与PreparedStatement的区别

PreparedStatement继承自Statement,都是接口,但是PreparedStatement可以使用占位符,是预编译的,而Statement则不可以。Statement如果需要实现动态的数据操作,则需要对sql语句进行字符串拼接,使得sql语句编写起来比较麻烦,并且使用过程中存在SQL注入的风险。PreparedStatement是从Statement接口继承而来,使用该接口可以有效的避免sql注入以及字符串拼接的问题。

  1. Statement的使用:
public static void insert(String name, String pwd, String nickname) throws ClassNotFoundException, SQLException {
//准备sql语句
String sql = "insert into user(username,password,nickname) values('" + name + "','" + pwd + "','" + nickname + "')";
// 1.加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 2.获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "123456");
// 3.获取处理sql语句的执行对象
Statement stat = conn.createStatement();
// 4.执行sql语句
boolean b = stat.execute(sql);
// 5.处理结果
System.out.println("是否有ResultSet:" + b);
// 6.关闭资源
stat.close();
conn.close();
}

对以上程序在main方法中执行

public static void main(String[] args){
insert("rose","rose123","肉丝");
}
  1. PreparedStatement的使用:
public class JDBCDemo3 {
public static boolean login(String username,String password) throws SQLException {
//代码移动 alt+shift+up/down
String sql = "select * from user where username=? and password=?";
ResultSet rs = null;
//JDK1.7新增
try(
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "123456");
//获取预编译sql的对象(已经完成的sql语句的预编译)
PreparedStatement ps = conn.prepareStatement(sql);
){
//预处理(向sql语句指定位置的占位符填充实际值)
ps.setString(1,username);
ps.setString(2,password);
//执行
rs = ps.executeQuery();
if(rs.next()){
return true;
}
}finally{
rs.close();
}
return false;
}
public static void main(String[] args) throws SQLException {
boolean b = login("admin", "123456");
System.out.println(b ? "登录成功" : "登录失败");
}
}**
  1. SQL注入:
public static boolean login(String username, String password) throws ClassNotFoundException, SQLException {
String sql = "select * from user where username='" + username + "' and password='" + password + "'";
Connection conn = null;
Statement stat = null;
try {
conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test", "root", "123456");
stat = conn.createStatement();
//执行查询获取结果集
ResultSet rs = stat.executeQuery(sql);
//判断结果集中是否存在可用结果行
if (rs.next()) {
return true;
}
} finally {
conn.close();
stat.close();
}
return false;
}
//select * from user where username='asdfasdf' and password='' or '1'='1'
boolean b = login("asdfasdf", "' or '1'='1 ");
System.out.println(b ? "登录成功" : "登录失败");

无论账号如何提供,子需要密码按照第二个参数的写法,即可绕过登录过程直接输出如下结果:

登录成功

最后

以上就是悦耳百褶裙为你收集整理的Statement与PreparedStatement的使用与区别的全部内容,希望文章能够帮你解决Statement与PreparedStatement的使用与区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部