Java實(shí)現(xiàn)數(shù)據(jù)庫連接的最詳細(xì)教程分享
JDBC,Java Database Connectivity,即 Java 數(shù)據(jù)庫連接。實(shí)際上 JDBC 是 Java 中的一套和數(shù)據(jù)庫進(jìn)行交互的API。
因?yàn)?Java 程序員需要連接多種數(shù)據(jù)庫,為了避免每一個(gè)數(shù)據(jù)庫都學(xué)習(xí)一套新的API,SUN公司提出一個(gè)JDBC接口,各個(gè)數(shù)據(jù)庫廠商根據(jù)接口寫實(shí)現(xiàn)類(驅(qū)動(dòng)),這樣 Java 程序員只需要掌握 JDBC 接口中的一套方法,就可以訪問任何數(shù)據(jù)庫。
使用 JDBC 可以創(chuàng)建一個(gè) Maven 工程,使用 Maven 工具便捷的下載 MySQL 驅(qū)動(dòng)相關(guān) Jar 包。使用實(shí)例如下:
1.創(chuàng)建 Maven 工程
使用 IntelliJ IDEA 新建工程,選擇 Maven 工程:
設(shè)置項(xiàng)目名稱:
2.添加 MySQL 驅(qū)動(dòng)依賴 Jar 包
在 Maven 工程的 pom.xml 文件中加入 MySQL 驅(qū)動(dòng)依賴,并下載 Jar 包:
3.創(chuàng)建一個(gè)測試使用的 MySQL 數(shù)據(jù)庫
// 創(chuàng)建名為 test_base 的數(shù)據(jù)庫 CREATE DATABASE test_base; // 使用 test_base 數(shù)據(jù)庫 USE test_base; // 創(chuàng)建名為 websites 的表 CREATE TABLE `websites` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` char(20) NOT NULL DEFAULT '' COMMENT '站點(diǎn)名稱', `url` varchar(255) NOT NULL DEFAULT '', `alexa` int(11) NOT NULL DEFAULT '0' COMMENT 'Alexa 排名', `country` char(10) NOT NULL DEFAULT '' COMMENT '國家', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; // 在 websites 中插入數(shù)據(jù) INSERT INTO `websites` VALUES ('1', 'Google', 'https://www.google.cm/', '1', 'USA'), ('2', '淘寶', 'https://www.taobao.com/', '13', 'CN'), ('3', '菜鳥教程', 'http://www.runoob.com', '5892', ''), ('4', '微博', 'http://weibo.com/', '20', 'CN'), ('5', 'Facebook', 'https://www.facebook.com/', '3', 'USA'), ('6', 'JueJin', 'https://www.juejin.cn/', '2213', 'CN');
4.創(chuàng)建 Java 文件,編寫 JDBC 相關(guān)代碼
import java.sql.*; /** * @Author:WG * @Package:PACKAGE_NAME * @Project:JDBCTest * @name:MySQLDemo * @Date:2023/5/17 21:35 * @Filename:MySQLDemo */ public class MySQLDemo { // MySQL 8.0 以下版本 - JDBC 驅(qū)動(dòng)名及數(shù)據(jù)庫 URL static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost:3306/test_base?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"; // MySQL 8.0 以上版本 - JDBC 驅(qū)動(dòng)名及數(shù)據(jù)庫 URL //static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; //static final String DB_URL = "jdbc:mysql://localhost:3306/test_base?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"; // 數(shù)據(jù)庫的用戶名與密碼,需要根據(jù)自己的設(shè)置 static final String USER = "root"; static final String PASS = "root"; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try{ // 注冊 JDBC 驅(qū)動(dòng) Class.forName(JDBC_DRIVER); System.out.println("連接數(shù)據(jù)庫..."); // 獲取連接對(duì)象 conn = DriverManager.getConnection(DB_URL,USER,PASS); System.out.println(" 實(shí)例化Statement對(duì)象..."); // 創(chuàng)建 Sql 執(zhí)行對(duì)象 stmt = conn.createStatement(); // Sql 查詢語句 String sql = "SELECT id, name, url FROM websites"; // 執(zhí)行 Sql ResultSet rs = stmt.executeQuery(sql); // 展開結(jié)果集數(shù)據(jù)庫,next()會(huì)判斷有無下條數(shù)據(jù),有的話返回 true while(rs.next()){ // 通過字段檢索 int id = rs.getInt("id"); String name = rs.getString("name"); String url = rs.getString("url"); // 輸出數(shù)據(jù) System.out.print("ID: " + id); System.out.print(", 站點(diǎn)名稱: " + name); System.out.print(", 站點(diǎn) URL: " + url); System.out.print("\n"); } // 完成后關(guān)閉 rs.close(); stmt.close(); conn.close(); }catch(SQLException se){ // 處理 JDBC 錯(cuò)誤 se.printStackTrace(); }catch(Exception e){ // 處理 Class.forName 錯(cuò)誤 e.printStackTrace(); }finally{ try{ // 關(guān)閉資源 if(stmt!=null) stmt.close(); }catch(SQLException se2){ // 什么都不做 } try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); } } System.out.println("Goodbye!"); } } // 程序運(yùn)行結(jié)果如下: // 連接數(shù)據(jù)庫... // 實(shí)例化Statement對(duì)象... // ID: 1, 站點(diǎn)名稱: Google, 站點(diǎn) URL: https://www.google.cm/ // ID: 2, 站點(diǎn)名稱: 淘寶, 站點(diǎn) URL: https://www.taobao.com/ // ID: 3, 站點(diǎn)名稱: 菜鳥教程, 站點(diǎn) URL: http://www.runoob.com // ID: 4, 站點(diǎn)名稱: 微博, 站點(diǎn) URL: http://weibo.com/ // ID: 5, 站點(diǎn)名稱: Facebook, 站點(diǎn) URL: https://www.facebook.com/ // ID: 6, 站點(diǎn)名稱: JueJin, 站點(diǎn) URL: https://www.juejin.cn/ // Goodbye!
DBCP - 數(shù)據(jù)庫連接池
數(shù)據(jù)庫連接池可以預(yù)先設(shè)置一定數(shù)量的初始連接,如果有業(yè)務(wù)需要使用連接,則從連接池中直接獲取,如果連接池中連接用光,這些連接請求將被加入到等待隊(duì)列中,等待連接歸還后再獲取連接。
數(shù)據(jù)庫連接池避免了每一次業(yè)務(wù)都需要和數(shù)據(jù)庫服務(wù)器建立一次連接,業(yè)務(wù)處理完成后再斷開連接,因?yàn)轭l繁的開關(guān)連接非常的浪費(fèi)資源,甚至造成服務(wù)器崩潰。
DBCP 使用實(shí)例:
1.使用數(shù)據(jù)庫連接池需要在 Maven 工程的 pom.xml 文件中加入依賴,并下載 Jar 包:
<!-- dependencies標(biāo)簽主要用于管理項(xiàng)目中需要引入的其他依賴 --> <dependencies> <!--mysql驅(qū)動(dòng)--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.39</version> </dependency> <!--數(shù)據(jù)庫連接池--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.1.1</version> </dependency> </dependencies>
2.創(chuàng)建 Java 文件,編寫 JDBC 相關(guān)代碼:
import org.apache.commons.dbcp2.BasicDataSource; import java.sql.*; /** * @Author:WG * @Package:PACKAGE_NAME * @Project:JDBCTest * @name:DBCPDemo * @Date:2023/5/18 15:09 * @Filename:DBCPDemo */ public class DBCPDemo { public static void main(String[] args) { Connection conn = null; Statement stmt = null; // 獲取連接池 BasicDataSource dataSource = JdbcUtils.getDataSource(); try { // 在連接池中獲取連接 conn = dataSource.getConnection(); // 創(chuàng)建 Sql 執(zhí)行對(duì)象 stmt = conn.createStatement(); // Sql 查詢語句 String sql = "SELECT id, name, url FROM websites"; // 執(zhí)行 Sql ResultSet rs = stmt.executeQuery(sql); // 展開結(jié)果集數(shù)據(jù)庫,next()會(huì)判斷有無下條數(shù)據(jù),有的話返回 true while(rs.next()){ // 通過字段檢索 int id = rs.getInt("id"); String name = rs.getString("name"); String url = rs.getString("url"); // 輸出數(shù)據(jù) System.out.print("ID: " + id); System.out.print(", 站點(diǎn)名稱: " + name); System.out.print(", 站點(diǎn) URL: " + url); System.out.print("\n"); } // 完成后關(guān)閉 rs.close(); stmt.close(); conn.close(); } catch (SQLException se) { // 獲取連接錯(cuò)誤 se.printStackTrace(); }finally{ try{ // 關(guān)閉資源 if(stmt!=null) stmt.close(); }catch(SQLException se2){ // 什么都不做 } try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); } } System.out.println("Goodbye!"); } } class JdbcUtils { // 創(chuàng)建連接池 private static BasicDataSource dataSource = new BasicDataSource(); static { //必須要的配置 dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/test_base?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"); dataSource.setUsername("root"); dataSource.setPassword("root"); //可選配置 dataSource.setMaxTotal(10);//連接池最大連接數(shù) dataSource.setMaxIdle(5);//連接池最大空閑數(shù) dataSource.setMinIdle(3);//連接池最小空閑數(shù) dataSource.setInitialSize(10);//初始化連接池時(shí)的連接數(shù) } // 獲取連接池 public static BasicDataSource getDataSource() { return dataSource; } } // 程序運(yùn)行結(jié)果如下: // ID: 1, 站點(diǎn)名稱: Google, 站點(diǎn) URL: https://www.google.cm/ // ID: 2, 站點(diǎn)名稱: 淘寶, 站點(diǎn) URL: https://www.taobao.com/ // ID: 3, 站點(diǎn)名稱: 菜鳥教程, 站點(diǎn) URL: http://www.runoob.com // ID: 4, 站點(diǎn)名稱: 微博, 站點(diǎn) URL: http://weibo.com/ // ID: 5, 站點(diǎn)名稱: Facebook, 站點(diǎn) URL: https://www.facebook.com/ // ID: 6, 站點(diǎn)名稱: JueJin, 站點(diǎn) URL: https://www.juejin.cn/ // Goodbye!
使用數(shù)據(jù)庫連接池也同樣連接到了 MySQL 數(shù)據(jù)庫,并打印了查詢數(shù)據(jù),這里并沒有看出使用數(shù)據(jù)庫連接池有什么優(yōu)勢,但如果使用 JDBC(非數(shù)據(jù)庫連接池方式) 與 DBCP (數(shù)據(jù)庫連接池方式)同時(shí)進(jìn)行20000次數(shù)據(jù)庫連接查詢,消耗時(shí)間大概如下:
JDBC 耗時(shí) 40898毫秒
DBCP 耗時(shí) 3726毫秒
以上就是Java實(shí)現(xiàn)數(shù)據(jù)庫連接的最詳細(xì)教程分享的詳細(xì)內(nèi)容,更多關(guān)于Java數(shù)據(jù)庫連接的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot集成JPA持久層框架,簡化數(shù)據(jù)庫操作
JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化規(guī)范。主要是為了簡化持久層開發(fā)以及整合ORM技術(shù),結(jié)束Hibernate、TopLink、JDO等ORM框架各自為營的局面。JPA是在吸收現(xiàn)有ORM框架的基礎(chǔ)上發(fā)展而來,易于使用,伸縮性強(qiáng)。2021-06-06SpringAop切入點(diǎn)execution表達(dá)式的深入講解
Spring AOP 可能會(huì)經(jīng)常使用 execution切入點(diǎn)指示符,下面這篇文章主要給大家介紹了關(guān)于SpringAop切入點(diǎn)execution表達(dá)式的相關(guān)資料,需要的朋友可以參考下2021-08-08Java集合定義與用法實(shí)例總結(jié)【Set、List與Map】
這篇文章主要介紹了Java集合定義與用法,結(jié)合實(shí)例形式總結(jié)分析了Java集合中Set、List和Map相關(guān)概念、功能、用法及操作注意事項(xiàng),需要的朋友可以參考下2018-08-08解決IDEA報(bào)錯(cuò)java無效的目標(biāo)發(fā)行版:22
在使用IDEA編譯項(xiàng)目時(shí),可能會(huì)遇到JDK版本不一致的錯(cuò)誤,這篇文章主要介紹了解決IDEA報(bào)錯(cuò)java無效的目標(biāo)發(fā)行版:22的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10