1.JDBC:
1. 概念:Java DataBase Connectivity Java 數據庫連接,Java 語言操作數據庫
* JDBC本質:其實是官方(sun公司)定義的一套操作所有關係型數據庫的規則,即接口。各個數據庫廠商去實現這套接口,提供數據庫驅動jar包。我們可
以使用這套接口(JDBC)變成,真正執行的代碼是驅動jar包中的實現類。
2. 入門:MYSQL(數據庫爲例)
* 步驟:
1.導入驅動jar包
* 右鍵項目 --- > Build Path --- > Configure Build Path... --- > Libraries ---> Add External JARs...
2.註冊驅動
Class.forName("com.mysql.jdbc.Driver");
3.獲取數據庫連接對象 Connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/數據庫名稱" , "用戶名" , "密碼");
4.定義sql
String sql = "insert into student values ('張三' , '男' , 18)";
5.獲取執行sql語句的對象 Statement
Statement stmt = conn.createStatement();
6.執行sql , 接受返回結果
int length = stmt.executeUpdate(sql);
7.處理結果
System.out.println(length);
8.關閉
stmt.close();
conn.close();
* 注意:如果出現 Could not create connection to database server 異常 這是因爲jar包版本與數據庫不一致造成
可以將 mysql驅動名改成:com.mysql.cj.jdbc.Driver
* 處理如下: 我這裏使用的是 mysql - 8.0.12 版本
* Class.forName("com.mysql.cj.jdbc.Driver");
* Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/數據庫名稱?useSSL=false&serverTimezone=UTC" , "用戶名" , "密碼");
**3.詳解各個對象:**
1.DriverManager :驅動管理對象
* 功能:
1.註冊驅動
static void registerDriver(Driver driver)
注意:mysql5之後的驅動jar包加載可以省略
2.獲取數據庫連接
static Connection getConnction(String url , String user , String pwd)
* url :
語法:jdbc:mysql://ip地址 : 端口號/數據庫名稱
細節:如果ip地址是本機號,端口是3306 則可以簡寫爲 jdbc:mysql:///數據庫名稱
2.Connection :數據庫連接對象
1. 功能:
1.獲取sql 對象
* Statement createStatement();
* PreparedStatement prepareStatement(String sql);
2. 管理事務:
* 開啓事務:setAutoCommit(Boolean s);
* 提交事務:commit();
* 回滾事務:rollback();
3.Statement:執行sql對象
1. 執行sql語句
1.boolean execute(String sql) :可以執行任意SQL語句
2.int executeUpdate(String sql) : 執行DML(insert , update , delete) 語句 DDL(create, alter , drop )語句
3.ResultSet executeQuery(String sql) :執行DQL語句 (Select)
4.ResultSet:返回結果集對象
* next() : 遊標向下移動一行
* getXxx(參數):獲取數據
* Xxx :代表數據類型:int getInt() , String getString();
* 參數:
1. int : 代表列的編號, 從1開始 getString(1) 獲取第一列的值
2. String : 代表列名稱 : getDouble("age");
5.PreparedStatement:執行sql對象
1.SQL注入問題:在拼接sql時,有一些sql的特殊關鍵字參與字符串的拼接。會造成安全隱患
1. 用戶隨便輸入 , 'a' = 'a' 恆等式
2. sql:select * from T_project where Project_id = '2003-01' and Project_name = '教學大樓' or 'a' = 'a' -- 恆等式存在
2.解決sql諸如問題:使用 PreparedStatement 對象來解決
3.預編譯的SQL:參數使用 ?作爲佔位符
4.步驟:
1.導入驅動jar包
* 右鍵項目 --- > Build Path --- > Configure Build Path... --- > Libraries ---> Add External JARs...
2.註冊驅動
Class.forName("com.mysql.jdbc.Driver");
3.獲取數據庫連接對象 Connection
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/數據庫名稱" , "用戶名" , "密碼");
4.定義sql
String sql = "insert into student values ('?' , '?' , ?)";
5.獲取執行sql語句的對象 Statement
PreparedStatement ps= conn.prepareStatement(sql );
6.執行sql , 接受返回結果
int length = ps.executeUpdate();
7.處理結果
System.out.println(length);
8.關閉
stmt.close();
conn.close();
2.JDBC控制事務:
1.事務:一個包含多個步驟的業務操作。如果這個業務操作被事務管理,那麼這個業務操作要麼同時成功,要麼同時失敗
2.操作 :
1.開啓事務
2.提交事務
3.回滾事務
3.使用Connection對象來管理事務
* 開啓事務:setAutoCommit(boolean autoCommit) : 調用該方法設置參數爲false , 即開啓事務
* 在執行sql之前開啓事務
* 提交事務:commit()
* 當所有sql執行完畢之後
* 回滾事務:rollback();
* 出現異常時回滾
- 事務案例:這裏演示最簡便的寫法 以便於理解
Connection conn = null;
Statement stmt = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
//3.獲取數據庫連接對象 Connection
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/db1?useSSL=false&serverTimezone=UTC" , "root" , "123456");
//3.1開啓事務
conn.setAutoCommit(false);
//4.定義sql
String sql = "insert into student values (null ,'張三' , '男' ,'2018-01-02' , 18 , 'asd')";
//5.獲取執行sql語句的對象 Statement
stmt = conn.createStatement();
//6.執行sql , 接受返回結果
int length = stmt.executeUpdate(sql);
//7.處理結果
System.out.println(length);
//8.提交
conn.commit();
} catch (Exception e) {
//事務回滾
if(conn != null)
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally{
//9.關閉
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3.JDBC工具類:(基於原型)
這裏給出實例代碼:
private static String url ;
private static String username ;
private static String password ;
private static String driver ;
/**
* @param _Project_id
* @return
*/
static{
try {
//讀取 properties
Properties pro = new Properties();
//2.加載文件
//3.加載進內存
pro.load(new FileReader(JDBCUtils.class.getClassLoader().getResource("db.properties").getPath()));
//3.獲取值
url = pro.getProperty("url");
username = pro.getProperty("username");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
Class.forName(driver);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConn() throws SQLException{
return DriverManager.getConnection(url,username,password);
}
db.properties 配置文件如下:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql:///db1?useSSL=false&serverTimezone=UTC
username=root
password=123456
initialSize=5
maxActive=10
maxWait=3000
maxIdle=8
minIdle=3