目录
4、 Statement对象和PreparedStatement对比
1、键盘录入用户名和密码,判断是否登录成功
2、分析:
1)创建一个表 user(id,username,password)三个字段
2)封装一个功能isLogin(String username,String password)---->boolean
3)利用jdbc基本操作 查询user表即可
4)通过ResultSet的next()判断,如果查询到了 返回true,否则false!
3、 问题
Statement对象操作静态sql语句:硬编码而且由于如果存在sql语句字符串拼接造成sql注入问题,用户名和密码不一致,依然登录成功,最不安全的行为!
select * from user where username='sdfs' and password = 'a 'OR 'a' ='a' 后面恒成立
4、 Statement对象和PreparedStatement对比
1)后者防止sql注入,前者存在sql注入(存在sql语句字符串拼接) 2)执行效率后者高于前者 前者效率低 每次获取Statement对象 executeUpdate(String sql) executeQuery(String sql) 后者: String sql = "select * from user where username=? and password = ?" ; 每次获取PreparedStatement对象的时候就已经sql保存在对象中进行预编译过程 赋值 executeUpdate() executeQuery()
5、过程
public class Statement_And_PreparedStatementTest {
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 = isLogin2(username,password) ;
if(flag){
System.out.println("恭喜您,登录成功");
}else{
System.out.println("登录失败...");
}
}
//PreparedStatement
//定义登录方法
public static boolean isLogin2(String username, String password) {
//获取数据库的连接对象
Connection conn = null ;
PreparedStatement stmt = null ;
ResultSet rs = null ;
try {
conn = JdbcUtils.getConnection();
//准备sql :参数化sql
//通过用户和密码查询用户
String sql = "select * from user where username=? and password = ?" ;
System.out.println(sql);
//创建执行对象PreparedStatement预编译对象
stmt = conn.prepareStatement(sql) ;
//参数赋值
//在PerparedStatement对象中完成参数赋值过程
stmt.setString(1,username);
stmt.setString(2,password);
//执行查询
rs = stmt.executeQuery();
return rs.next() ;
} catch (SQLException e) {
e.printStackTrace();
}finally {
JdbcUtils.close(rs,stmt,conn);
}
return false ;
}
}