文章目录
PreparedStatement接口
PreparedStatement 是 Statement 接口的子接口,继承于父接口中所有的方法。它是一个预编译的 SQL 语句
- 因为有预先编译的功能,提高 SQL 的执行效率。
- 可以有效的防止 SQL 注入的问题,安全性更高。
1. Connection 创建 PreparedStatement 对象
PreparedStatement prepareStatement(String sql) | 指定预编译的 SQL 语句,SQL 语句中使用占位符? 创建一个语句对象 |
2. PreparedStatement 接口中的方法
int executeUpdate() | 执行 DML,增删改的操作,返回影响的行数。 |
ResultSet executeQuery() | 执行 DQL,查询的操作,返回结果集 |
3.使用步骤
1)编写 SQL 语句,未知内容使用?占位:“SELECT * FROM user WHERE name=? AND password=?”;
2) 获得 PreparedStatement 对象
3) 设置实际参数:setXxx(占位符的位置, 真实的值)
4) 执行参数化 SQL 语句
5) 关闭资源
4. 改写上一次写到的查询程序
package JDBC_use;
import java.sql.*;
import java.util.Scanner;
public class JDBCsel {
public static void login(String name){
Connection con = null;
PreparedStatement preSta = null;
ResultSet rs = null;
try{
con = JdbcUtils.getConnection();
String sql = "select * from student where name=?";
preSta = con.prepareStatement(sql);
System.out.println(sql);
preSta.setString(1, name);
rs = preSta.executeQuery();
if(rs.next()){
System.out.println("登陆成功,欢迎您:" + name);
}else{
System.out.println("登录失败");
}
}catch(SQLException e){
e.printStackTrace();
}finally{
JdbcUtils.close(con, preSta, rs);
}
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("输入用户名:");
String name = sc.next();
login(name);
}
}
整体上来说,与Statement没有什么差异,只是将需要写入的字段先改为?实现预编译,然后使用setString实现参数绑定
JDBC事务处理
1.准备数据
CREATE TABLE account (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
balance DOUBLE
);
-- 添加数据
INSERT INTO account (NAME, balance) VALUES ('Jack', 1000), ('Rose', 1000)
2. API介绍
void setAutoCommit(boolean autoCommit) | 参数是 true 或 false 如果设置为 false,表示关闭自动提交,相当于开启事务 |
void commit() | 提交事务 |
void rollback() | 回滚事务 |
3.开发步骤
1)获取连接
2) 开启事务
3) 获取到 PreparedStatement
4) 使用 PreparedStatement 执行两次更新操作
5) 正常情况下提交事务
6) 出现异常回滚事务
7) 最后关闭资源
package JDBC_use;
import JDBC_use.JdbcUtils;
import java.sql.*;
public class DemoTransaction {
public static void main(String[] args){
Connection con = null;
PreparedStatement ps = null;
try{
con = JdbcUtils.getConnection();
con.setAutoCommit(false);
ps = con.prepareStatement("update account set balance = balance - ? where name=?");
ps.setInt(1, 500);
ps.setString(2, "Jack");
ps.executeUpdate();
//出现异常
// System.out.println(100/0);
ps = con.prepareStatement("update account set balance = balance + ? where name=?");
ps.setInt(1, 500);
ps.setString(2, "Rose");
ps.executeUpdate();
con.commit();
System.out.println("转账成功");
}catch(Exception e){
e.printStackTrace();
try{
con.rollback();
}catch(SQLException e1){
e1.printStackTrace();
}
System.out.println("转账失败");
}finally{
JdbcUtils.close(con, ps);
}
}
}