JDBC-PreparedStatement
JDBC-PreparedStatement
PreparedStatement:执行sql的对象
SQL注入问题:在拼接sql时,有一些sql的特殊关键字符参与字符串的拼接,会造成安全性问题
随便输入用户,输入密码:'a' o 'a' ='a
#sql select * from user where username='fdsad' and password ='a' or 'a'='a'
解决sql注入问题:使用PreparedStatement对象来解决
预编译的SQL:参数使用?作为占位符
步骤:
导入jar包- mysql-connector-java-5.1.37-bin.jar
注册驱动
获取数据库连接对象 Connection
定义sql
# 注意 sql的参数使用?作为占位符.如: select * from user where username = ? and password = ?;
获取执行sql语句对象 PreparedStatement Connection.prepareStatement(String sql)
给?赋值:
- 方法: setXxx(参数1, 参数2)
- 参数1:?的位置编号 从1开始
- 参数2: ?的值
执行sql,接受返回结果,不需要传递sql语句
处理结果
释放资源
注意:后期都会使用PreparedStatement来完成增删改查的所有操作
- 可以防止SQL注入
- 效率更高
代码展示
package com.levizhao.PreparedStatement;
import com.levizhao.util.JDBClogin;
import java.sql.*;
import java.util.Scanner;
public class Demo01PreparedStatement {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
boolean flag = new Demo01PreparedStatement().Login(username, password);
if (flag){
System.out.println("登录成功");
}else {
System.out.println("登录失败,账户或密码错误!");
}
}
public boolean Login(String username, String password){
if (username == null || password == null){
return false;
}
Connection conn = null;
PreparedStatement pstat = null;
ResultSet rs = null;
//1. 获取连接
try {
conn = JDBClogin.getConnection();
//2. 定义SQL语句
String sql = "select * from login where name = ? and password = ?";
//3. 执行SQL对象
pstat = conn.prepareStatement(sql);
//4. 给?赋值
pstat.setString(1,username);
pstat.setString(2,password);
//5. 执行查询,不需要传递sql
rs = pstat.executeQuery();
return rs.next();
} catch (SQLException throwables) {
throwables.printStackTrace();
}finally {
// 关闭连接
JDBClogin.close(rs,pstat,conn);
}
return false;
}
}