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