JDBC基础知识复习
JDBC基礎知識復習
- 1、JDBC連接數據庫
- 1.1、導入JDBC驅動
- 1.2、注冊JDBC驅動程序
- 1.3、創建連接對象
- 1.4、關閉JDBC連接
- 1.5、每種數據庫對應的驅動名和URL
- 2、JDBC接口
- 2.2、Statement
- 2.3、PreparedStatement
- 2.4、兩者區別
- 3、ResultSet集合
- 3.1、導航
- 3.2、獲取
- 3.3、更新
- 4、事務
- 4.1、事務提交
- 4.2、事務回滾
- 5、實現自己的數據庫連接池
- 5.1、自己實現的連接池
- 5.2、測試
- 5.3、測試結果
1、JDBC連接數據庫
分3步:導入、注冊、創建連接對象
1.1、導入JDBC驅動
導入對應數據庫的驅動包(Jar文件),或者使用mvn導入對應數據庫的依賴。
1.2、注冊JDBC驅動程序
2個方法注冊驅動,以Mysql為例子
1.3、創建連接對象
一般使用DriverManager.getConnection(String url, String user, String pass)方法獲取
還有另外兩種:
1.4、關閉JDBC連接
代碼:Connection對象的close()方法
1.5、每種數據庫對應的驅動名和URL
如下表:
| Mysql | com.mysql.jdbc.Driver | jdbc:mysql://hostname:port/ databaseName |
| Oracle | oracle.jdbc.driver.OracleDriver | jdbc:oracle:thin:@hostname:port Number:databaseName |
2、JDBC接口
通過使用 JDBC Statement, CallableStatement 和 PreparedStatement 接口定義的方法和屬性,使可以使用 SQL 或 PL/SQL 命令和從數據庫接收數據。
| Statement | 當在運行時使用靜態 SQL 語句時(Statement接口不能接收參數) |
| PreparedStatement | 當計劃多次使用 SQL 語句時(PreparedStatement 接口接收在運行時輸入參數) |
2.2、Statement
我們需要使用 Connection 對象的 createStatement() 方法進行創建。
Statement的方法:
| boolean execute(String SQL) | 如果 ResultSet 對象可以被檢索返回布爾值 true,否則返回 false。使用這個方法來執行 SQL DDL 語句,或當需要使用真正的動態 SQL |
| int executeUpdate(String SQL) | 用于執行 INSERT、UPDATE 或 DELETE 語句以及 SQL DDL(數據定義語言)語句。返回值是一個整數,指示受影響的行數(即更新計數) |
| ResultSet executeQuery(String SQL) | 返回 ResultSet 對象。用于產生單個結果集的語句,例如 SELECT 語句 |
釋放Statement對象的方法是close()
2.3、PreparedStatement
占位符的概念而已,序號從1開始(不是從0開始哦)
2.4、兩者區別
Statement適合靜態SQL,PreparedStatement適合動態SQL。
因為PreparedStatement可以防止SQL注入!
3、ResultSet集合
結果集通常是通過執行查詢數據庫的語句生成,表示數據庫查詢結果的數據表。ResultSet 對象具有指向其當前數據行的光標。
ResultSet接口的方法可分為3類:
3.1、導航
迭代集合
3.2、獲取
使用get方法
3.3、更新
使用update方法
4、事務
與數據庫理論的事務概念一樣,必須具有原子性、一致性、隔離性、持久性。
需要先關閉提交的代碼:使用Connection的setAutoCommit(false)方法
4.1、事務提交
使用Connection對象的commit()方法
4.2、事務回滾
使用Conncetion對象的rollback()方法
5、實現自己的數據庫連接池
使用之前項目的圖像算法中的均值hash的數據表:
5.1、自己實現的連接池
package util;import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.LinkedList;/*** 數據庫連接池* 循環鏈表實現* @author zzw*/ public class DBPool {/*** 池大小*/private static final int size = 20;/*** 數據庫驅動名*/private static final String driverName = "com.mysql.jdbc.Driver";/*** 數據庫名*/private static final String url = "jdbc:mysql://localhost:3306/imghashdb";/*** 數據庫用戶名*/private static final String user = "root";/*** 數據庫密碼*/private static final String password = "3306";/*** 連接池*/private static final LinkedList<Connection> pool = new LinkedList<>();// 工具類不配實例化private DBPool() {}/*** 創建size個連接對象放入連接池*/private static void createConnection() {for(int i=0;i<size;i++) {try {pool.add(DriverManager.getConnection(url, user, password));} catch (SQLException e) {e.printStackTrace();}}}// 靜態代碼塊用于加載數據庫驅動static {try {Class.forName(driverName);} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** 獲取一個數據庫連接* @return Connection*/public static synchronized Connection getConn() {if(pool.isEmpty()) {createConnection();}return pool.removeFirst();}/*** 歸還一個數據庫連接* @param conn 數據庫連接*/public static synchronized void callback(Connection conn) {// 如果當前連接池大小超過規定連接池大小,則不再歸還if(pool.size() > size) {try {conn.close();System.out.println("此連接不必歸還");} catch (SQLException e) {e.printStackTrace();}}else {pool.add(conn);}} }5.2、測試
測試代碼如下:
package app;import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;import util.DBPool;public class App {public static void main(String[] args) throws SQLException {// 1. 增Connection conn = DBPool.getConn();conn.setAutoCommit(false);PreparedStatement prepareStatement = conn.prepareStatement("insert ahash values(?, ?, ?)");prepareStatement.setInt(1, 1);prepareStatement.setString(2, "00101101");prepareStatement.setString(3, "hello.jpg");int insert = prepareStatement.executeUpdate();System.out.println(insert);conn.commit();DBPool.callback(conn);// 2. 改//# 類似..略// 3. 查conn = DBPool.getConn();prepareStatement = conn.prepareStatement("select * from ahash");ResultSet resultSet = prepareStatement.executeQuery();resultSet.first();while(resultSet.next()) {System.out.println("id: "+resultSet.getInt(1)+", hash: "+resultSet.getString(2).substring(0, 8)+"..., path: "+resultSet.getString(3));}DBPool.callback(conn);// 4. 刪//# 類似..略} }5.3、測試結果
控制臺輸出:
總結
以上是生活随笔為你收集整理的JDBC基础知识复习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年互联网婚庆行业洞察
- 下一篇: 电商节直播研究报告—以618为例