Content:
- 概念:
JDBC全稱是Java Database Connection(Java數據庫連接),它用於執行SQL語句的標準Java API。 - 在實際開發中可以直接使用JDBC進行各個數據庫的連接與操作,而且可以方便的向數據庫發送各種SQL命令。在JDBC中提供了一套標準的接口,這樣,各個支持Java的數據庫的生產商只要按照此接口提供相應的實現,就都可以使用JDBC進行操作,極大的體現了Java的可移植性。
- JDBC本身提供的是一套數據庫操作標準,而這些標準又需要各個數據庫廠商實現,所以針對每一個數據庫廠商都會提供一個JDBC的驅動程序
一、Jdbc基礎:
- 使用JDBC快速操作數據庫,實例。
/**
* Jdbc 快速入門
* */
public class JdbcDemo1 {
public static void main(String[] args) throws Exception {
//1.導入MySQL驅動jar包 (自行百度)
//2.註冊驅動
Class.forName("com.mysql.jdbc.Driver"); //MySQL5之後的驅動jar包可以省略註冊驅動的步驟
//3.獲取數據庫連接對象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db2","root","root");
//4.定義sql語句
String sql = "DELETE FROM stu WHERE id =14"; //靜態語句存在sql注入風險
//5.獲取執行SQL語句的對象 Statemtent
Statement statement = conn.createStatement();
//6.執行sql
int count = statement.executeUpdate(sql); //excuteUpdate();執行DML語句,數據的增刪改
//7.處理執行結果
System.out.println(count); // 返回的是[影響表中的行數]
//8.釋放資源
statement.close();
conn.close();
}
}
二、Jdbc實現:
- fun:通過事物來管理轉賬過程
涉及知識:
1、事物(保證整個轉賬過程,在數據庫中完整進行。)
2、PreparedStatement(預執行,執行動態sql)
3、新建工具類(包裝重複使用功能)
- 程序入口:
/**
* @author
* @date 2019-12-31 10:53
* @fun:
* 通過事物來管理轉賬過程
*/
public class JdbcDemo8 {
public static void main(String[] args) {
Connection con = null;
PreparedStatement pstat1 = null;
PreparedStatement pstat2 = null;
try {
//1.註冊驅動
con = JDBCUtils.getConnection();
//2.開啓事物
con.setAutoCommit(false);
// 3.創建sql語句
String sql1 = "update account set balance = balance - ? where id = ?";
String sql2 = "update account set balance = balance + ? where id = ?";
//4.創建PrepareStatement
pstat1 = con.prepareStatement(sql1);
pstat2 = con.prepareStatement(sql2);
//5.給?賦值
pstat1.setDouble(1,500);
pstat1.setDouble(2,1);
pstat2.setDouble(1,500);
pstat2.setDouble(2,2);
//6.執行sql
pstat1.executeUpdate();
//手動添加異常, 這裏需要添加事物來管理整個轉賬過程
//int i = 5/0;
pstat2.executeUpdate();
//7.提交事物
con.commit();
} catch (Exception e) {
try {
//8.事物回滾
con.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
//9.關閉資源
JDBCUtils.close(pstat1,con);
JDBCUtils.close(pstat2,null);
}
}
}
- 工具類
package util;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;
/**
* @author
* @date 2019-12-30 20:53
*/
public class JDBCUtils {
private static String url;
private static String user;
private static String password;
private static String driver;
//加載配置文件中的參數
static {
try {
//1.創建properties集合類
Properties properties = new Properties();
// 2.加載文件
ClassLoader classLoader = JDBCUtils.class.getClassLoader();
URL res = classLoader.getResource("jdbc.properties");
String path = res.getPath();
System.out.println(path);
properties.load(new FileReader(path));
// properties.load(new FileReader("F:\\JavaCode\\jdbc\\day_jdbc\\src\\jdbc.properties") ); //這裏用絕對路徑在遷移代碼時常報錯
// 3.獲取數據
url = properties.getProperty("url"); //獲取數據,傳的是配置文件中的key,字符串,記得加引號
user = properties.getProperty("user");
password = properties.getProperty("password");
driver = properties.getProperty("driver");
//4.註冊驅動
Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
*獲取連接對象
* @return con
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url,user,password);
}
public static void close(Statement statement,Connection connection){
close(null,statement,connection);
}
public static void close(ResultSet resultSet,Statement statement, Connection connection ){
if (resultSet != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
- 工具類所加載的配置文件
url=jdbc:mysql:///db3
user=root
password=root
driver=com.mysql.jdbc.Driver