JDBC基本概念
概念
Java database connectivity :Java数据库连接,Java语言操作数据库
本质
sun公司定义的一套操作所有关系型数据库的规则(接口)。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口编程,真正执行的代码是驱动包内的实现类
快速使用
步骤
- 导入驱动jar包
- 注册驱动
- 获取数据库连接对象Connection
- 定义SQL
- 获取执行SQL语句的对象Statement
- 执行SQL,接收返回值
- 处理结果
- 释放资源
Class.forName("com.mysql.cj.jdbc.Driver");
)
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");
String sql="update account set balance = 2000 where id = 2";
Statement stat = con.createStatement();
int cont = stat.executeUpdate(sql);
System.out.println(cont);
stat.close();
con.close();
各个接口和类详情
DriverManager:驱动管理对象
功能
- 注册驱动:告诉程序启动哪一个数据库驱动jar
static void registerDriver(Driver driver, DriverAction da) : 注册与给定的驱动程序 DriverManager 。 写代码使用: Class.forName(“com.mysql.cj.jdbc.Driver”); 原因:Driver中静态代码块中有registerDriver静态方法 - 获取数据库连接:
方法: static Connection getConnection(String url, String user, String password)
Connection:数据库连接对象
功能
- 获取执行SQL对象
Statement createStatement() : 创建一个 Statement对象,用于将SQL语句发送到数据库。 PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) : 创建一个默认的 PreparedStatement对象,该对象具有检索自动生成的密钥的能力。 - 管理事务
开启事务:void setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态。 提交事务:void commit() 使自上次提交/回滚以来所做的所有更改都将永久性,并释放此 Connection对象当前持有的任何数据库锁。 回滚事务:void rollback() 撤消在当前事务中所做的所有更改,并释放此 Connection对象当前持有的任何数据库锁。
Statement:执行SQL对象
执行SQL
- boolean execute(String sql):
执行给定的SQL语句,这可能会返回多个结果。 - int executeUpdate(String sql) :
执行给定的SQL语句,这可能是 INSERT , UPDATE ,或 DELETE语句,或者不返回任何内容,如SQL DDL语句的SQL语句。 - ResultSet executeQuery(String sql) :
执行给定的SQL语句,该语句返回单个 ResultSet对象。
ResultSet:结果集对象
- boolean next()
将光标从当前位置向前移动一行。 - getXxx(参数):获取数据
Xxx:代表数据类型 参数:1、int:列的编号,从1开始;2、String:列的名称
PreparedStatement:执行SQL的对象
- sql注入问题:在拼接SQL时候,有一些SQL关键字拼接。会造成安全问题
- 解决SQL注入问题:preparedStatement对象来解决
- 预编译SQL:参数使用?作为占位符
public boolean login(String username,long password) {
if (username == null){
return false;
}
Connection conn = null;
PreparedStatement pstmt=null;
ResultSet res =null;
try {
conn = JDBCUtils.getConnection();
String str = "select * from account where username = ? and balance = ?";
pstmt = conn.prepareStatement(str);
pstmt.setString(1,username);
pstmt.setLong(2,password);
res = pstmt.executeQuery();
return res.next();
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.close(res,pstmt,conn);
}
return false;
}
JDBC工具类:JDBCUtils
目的
简化书写
分析
- 注册驱动抽取
- 获取连接对象抽取
-问题:不想传递参数,保证工具类通用 -解决:配置文件 jdbc.properties url= user= password= - 释放资源方法抽取
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
static {
Properties pro = new Properties();
try {
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL resource = classLoader.getResource("jdbc.properties");
String path = resource.getPath();
System.out.println(path);
pro.load(new FileReader(path));
JDBCUtils.url = pro.getProperty("url");
user =pro.getProperty("user");
password=pro.getProperty("password");
driver=pro.getProperty("Driver");
Class.forName(driver);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
public static void close(Statement stmt,Connection conn){
if (stmt !=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn !=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(ResultSet res, Statement stmt, Connection conn){
if (stmt !=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn !=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (res !=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
JDBC控制事务
事务
一个包含多个业务的操作。如果这个业务被事务管理,则多个步骤要么同时成功,要么同时失败。
操作
- 开启事务
- 提交事务
- 回滚事务
使用connection对象来管理事务
- 开启事务:void setAutoCommit(boolean autoCommit) 将此连接的自动提交模式设置为给定状态。
- 提交事务:void commit() 使自上次提交/回滚以来所做的所有更改都将永久性,并释放此 Connection对象当前持有的任何数据库锁。
- 回滚事务:void rollback() 撤消在当前事务中所做的所有更改,并释放此 Connection对象当前持有的任何数据库锁。
public static void main(String[] args) {
Connection connection=null;
PreparedStatement pstmt1=null;
PreparedStatement pstmt2=null;
try {
connection = JDBCUtils.getConnection();
connection.setAutoCommit(false);
String sql1="update account set balance =balance - ? where id = ?";
String sql2="update account set balance =balance + ? where id = ?";
pstmt1 = connection.prepareStatement(sql1);
pstmt2 = connection.prepareStatement(sql2);
pstmt1.setDouble(1,500);
pstmt1.setInt(2,2);
pstmt2.setDouble(1,500);
pstmt2.setDouble(2,3);
pstmt1.executeUpdate();
pstmt2.executeUpdate();
connection.commit();
} catch (Exception e) {
try {
if (connection!=null){
connection.rollback();
}
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
}finally {
JDBCUtils.close(pstmt1,connection);
JDBCUtils.close(pstmt2,null);
}
}
|