/**
- 对比statement和PreparedStatement;
- (1)statement属于状态通道,PreparedStatement属于预状态通道
- (2)预状态通道会先编译sql语句,再去执行,比statement执行效率高
- (3)预状态通道支持占位符?,给占位符赋值的时候,位置从1开始
- (4)预状态通道可以防止sql注入,原因:预状态通道在处理值的时候以字符串的方式处理
*/
import java.sql.*;
public class Demo1 {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement pps = null;
ResultSet resultSet = null;
try {
//1.加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获得链接
String userName = "root";
String password = "root";
String url = "jdbc:mysql://localhost:3306/mysqladvanced?serverTimezone=UTC";
connection = DriverManager.getConnection(url,userName,password);
变量范围
//3.定义sql,创建 预 状态通道(进行sql语句的发送)
String sql = "select * from users2 where username=? and password=?"; //? 英文符号,用来表示占位
pps = connection.prepareStatement(sql);
//登录失败
// String uname = “abcd”; //在表记录中,abcd为错误uname,aa为正确 uname
// String pass = " ‘’ or 1=1"; //在表记录中,aa为正确pass
//登陆成功
String uname = "aa"; //在表记录中,abcd为错误uname,aa为正确 uname
String pass = "111"; //在表记录中,111为正确pass
//给占位符赋值 括号里面跟(下标,数值) 下标从1开始
pps.setString(1,uname);//根据表中数据给setXxx()
pps.setString(2,pass);
//执行sql
resultSet = pps.executeQuery(); //executeQuery(sql)执行增删改时使用
if(resultSet.next()){
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
try {
//5.关闭资源
if(resultSet !=null){
resultSet.close();
}
if(pps !=null){
pps.close();
}
if( connection !=null){
connection.close();
}
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
ResultSet–结果集
使用:
查询的错误结果能运输到Java代码里面
通过ResultSet取出数据放到Java代码里面
ResultSet.next()判断是否有下一行数据
扩展:
ResultSet.TYPE_SCROLL_INSENSITIVE
光标可以向前和向后滚动,结果集对创建结果集后发生
的数据库的其他更改不敏感。
ResultSet.TYPE_SCROLL_SENSITIVE。
光标可以向前和向后滚动,结果集对创建结果集之后发
生的其他数据库所做的更改敏感。
ResultSet.TYPE_FORWARD_ONLY
光标只能在结果集中向前移动。