一,PreparedStatement
PreparedStatement作用:执行预编译的sql语句对象。
1,SQL注入:在拼接sql时,有一些SQL的特殊性关键字参与字符串拼接,会造成安全性问题。
若输入用户名随意,密码:a’ or ‘a’ = 'a,则有以下sql语句:select * from user where username = 'dfss"and password = “a” or “a” = “a”;查询结果一定存在。
2,解决SQL注入问题:
采用预编译的SQL语句,参数使用?作为占位符。
3,使用步骤:
1. 导入驱动jar包
2. 注册驱动
3. 获取数据库连接对象 Connection
4. 定义sql
* 注意:sql的参数使用?作为占位符。 如:select * from user where username = ? and password = ?;
5. 获取执行sql语句的对象 PreparedStatement Connection.prepareStatement(String sql)
6. 给?赋值:
* 方法: setXxx(参数1,参数2)
* 参数1:?的位置编号 从1 开始
* 参数2:?的值
7. 执行sql,接受返回结果,不需要传递sql语句
8. 处理结果
9. 释放资源
4,注意:后期都会使用PreparedStatement来完成增删改查的所有操作
1,可以防止SQL注入
2,效率更高
示例代码:
package JDBCSelect;
import JDBCUtils.JDBCUtils;
import java.sql.*;
import java.util.Scanner;
public class JDBCDemo2 {
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 = new JDBCDemo2().login(username, password);
if (flag){
System.out.println("登陆成功!");
}else{
System.out.println("登录失败!");
}
}
public boolean login(String username,String password){
if (username == null || password == null){
return false;
}
Connection conn = null;
PreparedStatement psttm = null;
ResultSet resultSet = null;
try {
conn = JDBCUtils.getConnection();
String sql = "select * from user where username = ? and password = ?";
psttm = conn.prepareStatement(sql);
psttm.setString(1,username);
psttm.setString(2,password);
resultSet = psttm.executeQuery();
return resultSet.next();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.close(resultSet,psttm,conn);
}
return false;
}
}
二,JDBC控制事务
1,事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败。
2,操作:
1. 开启事务
2. 提交事务
3. 回滚事务
3,使用Connection对象来管理事务
开启事务:setAutoCommit(boolean autoCommit) ,调用该方法设置参数为false,即开启事务,在执行sql之前开启事务;
提交事务:commit() 当所有sql都执行完提交事务;
回滚事务:rollback() 在catch中回滚事务;
示例代码:
package JDBCSelect;
import JDBCUtils.JDBCUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCDemo3 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement psttm1 = null;
PreparedStatement psttm2 = null;
try {
conn = JDBCUtils.getConnection();
conn.setAutoCommit(false);
String sql1 = "update bank set account = account - ? where id = ?";
String sql2 = "update bank set account = account + ? where id = ?";
psttm1 = conn.prepareStatement(sql1);
psttm2 = conn.prepareStatement(sql2);
psttm1.setDouble(1,500);
psttm1.setInt(2,1);
psttm2.setDouble(1,500);
psttm2.setInt(2,2);
psttm1.executeUpdate();
//int i = 1/0;
psttm2.executeUpdate();
conn.commit();
} catch (Exception e) {
if (conn != null){
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
}
e.printStackTrace();
} finally {
JDBCUtils.close(psttm1,conn);
JDBCUtils.close(psttm2,null);
}
}
}