使用PreparedStatement实现CRUD操作(增删改查)
PreparedStatement:Statement的子接口
使用PreparedStatement的原因是Statement存在一些弊端,将会在稍后阐释
此外,还有CallableStatement用于执行SQL存储过程。在本内容中暂不涉及
Statement 示例
用户名 密码 是否正确
1. 需要拼串
假设使用statement执行SQL语句
Select user, password from table_user where user = 'AA' and password = '123456';
那么,实际上使用statement的代码内容为:
String sql = "
SELECT user,password FROM user_table WHERE USER =
'" + userName + "'
AND
PASSWORD =
'" + password + "'
";
如上所示,使用statement时,需要执行拼串操作,这对于编写而言比较难懂
2. (实际问题) SQL注入
String sql = "SELECT user,password FROM user_table WHERE USER = '1' or ' AND PASSWORD = ' ='1' or '1' = '1'";
当使用statement时,会发现就算本身并没有创建用户,依然会有可能登陆成功,这是一项比较严重的弊端
避免SQL注入:使用Preparedstatement替换statement
Prepared Statement 使用
1. 获取连接
直接使用前文的第五种连接方式,将void中的内容复制进来即可
2. 预编译SQL数据,填充占位符
首先在字符串中编写SQL语句
//预编译statement语句,返回PreparedStatement实例
String sql = "insert into customers(name, email,birth) values (?,?,?)";
//?:占位符
p1 = connection.prepareStatement(sql); //p1 = preparedStatement
可以看到上文中出现了名为占位符的特殊符号,占位符的使用和mysql中的通配符相似,下面需要使用具体的信息填充占位符
//5.填充占位符
p1.setString(1,"羊胎素");
p1.setString(2,"a@hotmail.com");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
java.util.Date date = sdf.parse("2022-2-22");
p1.setDate(3,new Date(date.getTime()));
在填充年月日时,可以预先使用SimpleDateFormat限定日期格式方便填充
3. 执行操作
使用
p1.execute();
对上述资源进行操作
4. 关闭资源
如上所述,需要关闭的资源为:PreparedStatement和数据库连接,所以只需要执行这两个资源的关闭即可
p1.close();
connection.close();
最后,在整个代码加入try&catch即可
最终写好的文件会以文件形式上传
封装数据库连接
使用前文的内容已经可以使用preparedStatement对mysql数据库进行见到那操作,但是如果每次都使用大量代码获取和关闭连接未免稍显麻烦。因此,可以将获取连接和关闭连接的过程封装在一个单独的文件中,以方便操作