PreparedStatement:执行sql的对象
1.SQL注入问题:在拼接sql时,在一些sql的关键字参与字符串的拼接。会造成安全性问题
- 1)输入用户随便,输入密码: a’ or ‘a’ = 'a;
- 2)sql:select * from user where username =
‘fghsasdfd’ and passwprd = a’ or ‘a’ = 'a;
2.解决sql注入问题:使用PrepareStatement对象来解释
3.预编译的sql:参数使用?作为占位符
4.步骤:
- (1)导入驱动包mysql-connection-java-5.1.37-bin.jar
- (2)注册驱动
- (3)获取数据库连接对象Connection
- (4)定义sql
*注意:sql的参数使用占位符:select * from user where username = ? and passwprd = ?; - (5)获取执行sql语句的对象PrepareStatement
- (6)给?去赋值
方法:setXxx(参数1,参数2)
参数1:?的位置编号从1开始
参数2:?的值 - (7)执行sql,接收返回结果,不需要传递sql语句
- (8)处理结果
- (9)释放资源
5.后期都会使用PreparedStatement来完成增删改查的所有操作
- (1)可以防止SQL注入
- (2)效率更高
package cn.laowang.jdbc;
import cn.laowang.util.JDBCUtils;
import java.sql.*;
import java.util.Scanner;
/**
*需求:
* 1.通过键盘录入用户名和密码
* 2.判断用户是否登录成功
*/
public class JDBCDemo10 {
public static void main(String[] args) {
//1.键盘录入,接收用户名和密码
Scanner sc = new Scanner(System.in);
System.out.println("请输入用户名:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
//2.调用方法
boolean flag = new JDBCDemo10().login2(username, password);
//3.判断结果,输出不同语句
if (flag){
System.out.println("登录成功!");
}else {
System.out.println("用户名或密码错误!");
}
}
/**
* 登录方法,使用PreparedStatement实现
* @param username
* @param password
* @return
*/
public boolean login2(String username,String password) {
if (username ==null||password ==null){
return false;
}
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
//连接数据库是否登录成功
try {
//1.获取数据库连接
conn = JDBCUtils.getConnection();
//2.定义sql
String sql = "select * from user where username = ? and password = ?";
//3.获取执行sql的对象
pstmt = conn.prepareStatement(sql);
//4.给?赋值
pstmt.setString(1,username);
pstmt.setString(2,password);
//4.执行查询
rs = pstmt.executeQuery();
//5.判断
return rs.next(); // 如果有下一行,返回true
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(rs,pstmt,conn); //关闭资源
}
return false;
}
}