通过验证用户名及密码是否正确来了解Prepared:
package com.jdbc.preparedStatement;
import com.jdbc.pojo.User;
import com.jdbc.user.BankUse;
import java.sql.*;
import java.util.ArrayList;
/*
* 此部分是连接数据库的代码
*/
public class UserDaoImpl {
public User getUserInfo(String name,String psd) {
Connection conn=null;
//注意此处不再声明Statement,而声明PreparedStatement
PreparedStatement ps=null;
//声明用户对象
User u=null;
ResultSet rs=null;
String driver="com.mysql.jdbc.Driver";
String url="jdbc:mysql://localhost/moon?useSSL=false&serverTimezone=UTC&charactorEncoding=UTF-8";
String username="root";
String password="2019012660Moon";
try{
//加载驱动类
Class.forName(driver);
//获取数据库连接对象
conn= DriverManager.getConnection(url,username,password);
//注意此处是先创建sql命令,再创建sql命令对象
//创建sql命令(?是占位符)
String sql="select * from data where name=? and password=?";
//创建sql命令对象
ps=conn.prepareStatement(sql);
//给占位符赋值(占位符从左到右角标从1开始)
ps.setString(1,name);
ps.setString(2,psd);
/*
* 以上有关占位符的部分就是PrepareStatement与Statement的不同
* 使用PrepareStatement的好处:
* 1. 防止SQL注入攻击
* 关于什么是SQL注入攻击,在之后双手奉上超详细的大佬的讲解
* 2. 提升sql语句执行效率
* 解释:如果应用Statement,在创建sql命令时,我们是需要完整写出每一条要操作的sql语句的,
* 但是对于相同的操作,我们势必要加入相同的sql语句,而每一次执行sql语句时,它就要被编译一次,这会大大损耗时间;
* 而PrepareStatement就只需要编译处理一条sql语句,大大缩减了不必要的时间
*
* 另外,有关setString部分,也可以统一用setObject来代替
*/
//执行sql命令,此处如果传入sql会报错,因为sql中含有占位符
rs=ps.executeQuery();
//遍历查询结果
while (rs.next()) {
u=new User();
u.setId(rs.getInt("id"));
u.setName(rs.getString("name"));
u.setPassword(rs.getString("psd"));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
//关闭资源
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return u;
}
}
}
package com.jdbc.pojo;
import java.util.Objects;
/*
* 此部分是创建用户对象的代码
*/
public class User {
private int id;
private String name;
private String password;
public void setId(int id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setPassword(String password) {
this.password = password;
}
public int getId() {
return id;
}
public String getName() {
return name;
}
public String getPassword() {
return password;
}
}
package preparedStatement;
import com.jdbc.pojo.User;
import com.jdbc.preparedStatement.UserDaoImpl;
import java.util.Scanner;
/*
* 此部分是Main
*/
public class Main {
public static void main(String[] args) {
//创建Scanner对象
Scanner sc=new Scanner(System.in);
System.out.println("请输入用户名:");
String name=sc.next();
System.out.println("请输入密码:");
String psd=sc.next();
//创建数据库操作对象
UserDaoImpl ud=new UserDaoImpl();
User u=ud.getUserInfo(name,psd);
if (u!=null) {
System.out.println("用户登陆成功");
} else {
System.out.println("用户名或密码错误");
}
}
}
最后,关于什么是SQL注入攻击,请点击这里了解嗷SQL注入攻击实例