SQL注入概念
SQL语句编译时无法区分程序传入的值和SQL本身的关键字导致SQL语义改变。
改进方法:使用PreparedStatement接口代替Statement接口。
实现原理:调用连接对象的prepareStatement方法,对SQL语句框架进行编译,再对SQL语句中的占位符进行传值。
两种接口对比:PreparedStatement在SQL操作时性能更优,进行多次值不同、SQL框架相同的SQL命令时,只需要编译一次,而Statement要多次编译。
注意事项:虽然PreparedStatement接口使数据的安全性高于Statement,但特定的业务需要使用SQL注入。
JDBC连接数据库的六个步骤
注册驱动
Class.forName("com.mysql.jdbc.Driver");
复制代码
ref 1. forName方法会执行类的静态代码块
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
复制代码获取连接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/login?useSSL=false", "root", "root");
复制代码获取数据库操作对象
String sql = "select * from t_user where loginName= ? and loginPwd=?";
PreparedStatement ps = conn.prepareStatement(sql);
复制代码SQL操作
ps.setString(1,userLoginInfo.get("loginName"));
ps.setString(2,userLoginInfo.get("loginPwd"));
复制代码处理结果集
ResultSet rs = ps.executeQuery();
if (rs.next()) {
boolean isLogin = true;
}
复制代码释放资源
rs.close();
ps.close();
conn.close();
复制代码
Tips: 异常处理语句没有写入
ref 2. loginName和loginPwd用 HashMap存储。HashMap的底层是哈希表,哈希表是一个数组,数组元素是链表。
Map常用操作:
map.put(key,value);
map.containsKey();
map.containsValue();
map.get(key);
map.replace(key,value);
map.remove(key,value);
map.remove(key)