PrearedStatement:是Statement的子类,功能更加强,执行Sql语句
1.由于Statement对象存在的问题
a.Sql注入问题,在拼接Sql时,有一些Sql的特殊关键字参与字符串的拼接,会造成安全性问题。
2.解决Sql注入问题使用PreparedStatement对象来解决
3.预编译的Sql:参数使用?作为占位符
4.使用PreparedStatement对象的步骤:(最得要)
1.导入驱动Jar包
2.注册驱动
3.获取数据库连接对象Connection
4.定义Sql
注意:Sql的参数使用?作为占位符:如select * from user where username=? and password=?
5.获取执行Sql语句对象PreparedStatement,同时并Sql语句传入
如:connection.prepareStatement(sql);
6.给?赋值
a.方法:SetXxx(参数1,参数2)
参数1:?的位置编号 ,注意编号是从1开始的
参数2:?的值
7.执行Sql语句,处理返回结果,不需要传入Sql语句了(注意由于上面已经传入了)
8.释放资源
重点:后期都会使用PreparedStatement对象来完成增删改查的所有操作了
1.可以防止Sql注入的问题
2.效率更高
PreparedSatement 的好处
-
prepareStatement()会先将 SQL 语句发送给数据库预编译。PreparedStatement 会引用着预编译后的结果。 可以多次传入不同的参数给 PreparedStatement 对象并执行。减少 SQL 编译次数,提高效率。
-
安全性更高,没有 SQL 注入的隐患。
-
提高了程序的可读性
使用 PreparedStatement 的步骤:
- 编写 SQL 语句,未知内容使用?占位:“SELECT * FROM user WHERE name=? AND password=?”;
- 获得 PreparedStatement 对象
- 设置实际参数:setXxx(占位符的位置, 真实的值)
- 执行参数化 SQL 语句
- 关闭资源
package com.haikang.login;
/**
* 1.导入驱动Jar包
* 2.注册驱动
* 3.获取数据库连接对象Connection
* 4.定义Sql
* 注意:Sql的参数使用?作为占位符:如select * from user where username=? and password=?
* 5.获取执行Sql语句对象PreparedStatement,同时并Sql语句传入
* 如:connection.prepareStatement(sql);
*
* 6.给?赋值
* a.方法:SetXxx(参数1,参数2)
* 参数1:?的位置编号 ,注意编号是从1开始的
* 参数2:?的值
* 7.执行Sql语句,处理返回结果,不需要传入Sql语句了(注意由于上面已经传入了)
* 8.释放资源
*/
public class JDBCLogin02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for (int i=0;i<=3;i++){
System.out.println("请输入用户名:");
String username = sc.nextLine();
System.out.println("请输入密码:");
String password = sc.nextLine();
boolean login = login(username, password);
if (login){
System.out.println("登录成功:");
break;
}else {
System.out.println("用户名或密码错误"+(3-i)+"次机会:");
}
}
}
public static boolean login(String username,String password){
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
if (username==null||password==null){
return false;
}
try {
//注册驱动和获得数据库连接对象
connection = JDBCUtils.getConnection();
//定义Sql语句
String sql = "select * from user where username=? and password=?";
//获得Sql执行对象
preparedStatement = connection.prepareStatement(sql);
//给占位符赋值
preparedStatement.setString(1,username);
preparedStatement.setString(2,password);
//执行Sql语句,注意不需要传入Sql语句了,如果传入那就是使用父类Statement的方法了
resultSet = preparedStatement.executeQuery();
//处理返回结果
boolean next = resultSet.next();
return next;
} catch (SQLException throwables) {
throwables.printStackTrace();
}
//关流
JDBCUtils.close(resultSet,preparedStatement,connection);
return false;
}
}