最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)數(shù)據(jù)庫連接的最詳細(xì)教程分享

 更新時(shí)間:2023年05月21日 08:27:29   作者:無聲編碼器  
JDBC,Java?Database?Connectivity,即Java數(shù)據(jù)庫連接,是?Java?中的一套和數(shù)據(jù)庫進(jìn)行交互的API,本文就來講講Java如何利用JDBC實(shí)現(xiàn)數(shù)據(jù)庫的連接吧

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{
            // 注冊(cè) 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ù)需要使用連接,則從連接池中直接獲取,如果連接池中連接用光,這些連接請(qǐng)求將被加入到等待隊(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ù)庫連接的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot基于Redis實(shí)現(xiàn)token的在線續(xù)期的實(shí)踐

    SpringBoot基于Redis實(shí)現(xiàn)token的在線續(xù)期的實(shí)踐

    本文主要介紹了使用Redis實(shí)現(xiàn)JWT令牌在線續(xù)期的方案,通過在線續(xù)期token,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • Java實(shí)現(xiàn)多叉樹和二叉樹之間的互轉(zhuǎn)

    Java實(shí)現(xiàn)多叉樹和二叉樹之間的互轉(zhuǎn)

    本文主要介紹了Java實(shí)現(xiàn)多叉樹和二叉樹之間的互轉(zhuǎn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 詳解Spring Kafka中關(guān)于Kafka的配置參數(shù)

    詳解Spring Kafka中關(guān)于Kafka的配置參數(shù)

    這篇文章主要介紹了詳解Spring Kafka中關(guān)于Kafka的配置參數(shù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • 詳解基于java的Socket聊天程序——初始設(shè)計(jì)(附demo)

    詳解基于java的Socket聊天程序——初始設(shè)計(jì)(附demo)

    本篇文章主要介紹了Socket聊天程序——初始設(shè)計(jì)(附demo),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-12-12
  • java中刪除數(shù)組中重復(fù)元素方法探討

    java中刪除數(shù)組中重復(fù)元素方法探討

    這個(gè)是一個(gè)老問題,但是發(fā)現(xiàn)大多數(shù)人說的還不夠透。小弟就在這里拋磚引玉了,歡迎拍磚
    2013-10-10
  • Java?JDK的多版本共存實(shí)現(xiàn)方法

    Java?JDK的多版本共存實(shí)現(xiàn)方法

    有時(shí)候系統(tǒng)中需要多個(gè)jdk版本共存,我們?cè)谧鎏囟ǖ牟僮鲿r(shí)需要特定的版本,這篇文章主要給大家介紹了關(guān)于Java?JDK的多版本共存實(shí)現(xiàn)?的相關(guān)資料,需要的朋友可以參考下
    2023-09-09
  • Java中equals()方法重寫實(shí)現(xiàn)代碼

    Java中equals()方法重寫實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java中equals()方法重寫實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • java 遠(yuǎn)程文件url如何轉(zhuǎn)為輸入流

    java 遠(yuǎn)程文件url如何轉(zhuǎn)為輸入流

    這篇文章主要介紹了java 遠(yuǎn)程文件url如何轉(zhuǎn)為輸入流方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot中的異步任務(wù)解析

    SpringBoot中的異步任務(wù)解析

    這篇文章主要介紹了SpringBoot中的異步任務(wù)解析,SpringBoot 異步任務(wù)是一種在SpringBoot框架中使用的異步處理機(jī)制,可以提高系統(tǒng)的并發(fā)能力和響應(yīng)速度,需要的朋友可以參考下
    2023-10-10
  • IDEA2020.1同步系統(tǒng)設(shè)置到GitHub的方法

    IDEA2020.1同步系統(tǒng)設(shè)置到GitHub的方法

    這篇文章主要介紹了IDEA2020.1同步系統(tǒng)設(shè)置到GitHub的方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05

最新評(píng)論

辽宁省| 漳浦县| 广安市| 册亨县| 嵩明县| 谢通门县| 汾阳市| 新沂市| 来安县| 晋江市| 克东县| 怀安县| 安达市| 乐亭县| 景洪市| 资源县| 昆山市| 济源市| 涡阳县| 嘉峪关市| 志丹县| 霍城县| 张家界市| 来安县| 湖口县| 南宫市| 京山县| 乐亭县| 汉沽区| 南澳县| 田林县| 隆林| 日照市| 庄浪县| 孙吴县| 天长市| 临海市| 大英县| 积石山| 徐汇区| 本溪市|