日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL:JDBC基础及连接数据库的方式

發布時間:2023/12/10 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL:JDBC基础及连接数据库的方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章轉載多處:https://blog.csdn.net/weixin_34121282/article/details/93382694

文章目錄

  • 一、JDBC基礎
    • (一)ODBC到JDBC的發展歷程
      • 1.ODBC的結構模型
      • 2.JDBC的誕生
    • (二)JDBC技術概述
    • (三)JDBC技術及使用詳解
      • 1.何謂驅動?
      • 2.JDBC驅動程序的分類
  • 二、JDBC連接MySQL數據庫的基礎方式
    • (一)通過JDBC操作數據庫的基本步驟
      • 1.使用JDBC第一步:加載驅動
      • 2.使用JDBC第二步:建立連接
      • 3.使用JDBC第三步:創建執行對象
      • 4.使用JDBC第四步:執行SQL語句
      • 5.使用JDBC第五步:處理執行結果
      • 6.使用JDBC 第六步——釋放資源
    • (二)JDBC連接數據庫具體代碼示例
      • 1.確認數據庫是否存在
      • 2.連接并操作數據庫
  • 三、DBCP連接MySQL數據庫詳解
    • (一)DBCP2原理
    • (二)認識BasicDataSource類
      • 1.四個必須的set方法
      • 2.四個重要的拓展方法
      • 3.事務屬性配置
    • (三)讀取properties文件創建BasicDataSource
      • 1.properties文件格式
      • 2.用BasicDataSourceFactoy創建BasicDataSource數據庫連接池
    • (四) 在SpringIOC容器中創建BasicDataSource數據庫連接池
      • 1.配置xml核心配置文件
      • 2.測試在IOC容器中BasicDataSource數據庫連接池
    • (五)創建BasicDataSource工具類來創建連接池
      • 1.創建DBCP連接池管理工具類
      • 2.在靜態工廠工具類中采取BasicDataSourceFactory來創建DBCP數據庫連接池
        • (1) 直接調用
        • (2) IOC容器中采取靜態工廠方式調用
      • 3.配置IOC 核心配置文件xml
      • 4.分別從IOC容器和工具類中取得BasicDataSource數據庫連接池
  • 四、C3P0數據庫連接池詳解
    • (一)創建c3p0-config.xml文件
    • (二)采取IOC容器創建C3P0數據庫連接池
      • 1.c3p0屬性文件
      • 2.IOC容器配置文件xml

一、JDBC基礎

  • DBC (Java DB Connection)—Java數據庫連接

  • JDBC是一種可用于執行SQL語句的JAVA API(ApplicationProgramming Interface應用程序設計接口)。它由一些Java語言編寫的類和界面組成。

  • JDBC為數據庫應用開發人員和數據庫前臺工具開發人員提供了一種標準的應用程序設計接口,使開發人員可以用純JAVA語言編寫完整的數據庫應用程序。

  • JDBC代表JAVA數據庫連接。它是一個軟件層,允許開發者在JAVA中編寫客戶端/服務器應用。

(一)ODBC到JDBC的發展歷程

ODBC是OpenDatabaseConnectivity的英文簡寫。它是一種用來在相關或不相關的數據庫管理系統(DBMS)中存取數據的,用C語言實現的,標準應用程序數據接口。通過ODBCAPI,應用程序可以存取保存在多種不同數據庫管理系統(DBMS)中的數據,而不論每個DBMS使用了何種數據存儲格式和編程接口。

1.ODBC的結構模型

ODBC的結構包括四個主要部分:應用程序接口、驅動器管理器、數據庫驅動器和數據源。

應用程序接口:屏蔽不同的ODBC數據庫驅動器之間函數調用的差別,為用戶提供統一的SQL編程接口。

驅動器管理器:為應用程序裝載數據庫驅動器。

數據庫驅動器:實現ODBC的函數調用,提供對特定數據源的SQL請求。如果需要,數據庫驅動器將修改應用程序的請求,使得請求符合相關的DBMS所支持的文法。

數據源:由用戶想要存取的數據以及與它相關的操作系統、DBMS和用于訪問DBMS的網絡平臺組成。

雖然ODBC驅動器管理器的主要目的是加載數據庫驅動器,以便ODBC函數調用,但是數據庫驅動器本身也執行ODBC函數調用,并與數據庫相互配合。因此當應用系統發出調用與數據源進行連接時,數據庫驅動器能管理通信協議。當建立起與數據源的連接時,數據庫驅動器便能處理應用系統向DBMS發出的請求,對分析或發自數據源的設計進行必要的翻譯,并將結果返回給應用系統。

2.JDBC的誕生

自從Java語言于1995年5月正式公布以來,Java風靡全球。出現大量的用java語言編寫的程序,其中也包括數據庫應用程序。由于沒有一個Java語言的API,編程人員不得不在Java程序中加入C語言的ODBC函數調用。這就使很多Java的優秀特性無法充分發揮,比如平臺無關性、面向對象特性等。隨著越來越多的編程人員對Java語言的日益喜愛,越來越多的公司在Java程序開發上投入的精力日益增加,對java語言接口的訪問數據庫的API的要求越來越強烈。也由于ODBC的有其不足之處,比如它并不容易使用,沒有面向對象的特性等等,SUN公司決定開發一Java語言為接口的數據庫應用程序開發接口。在JDK1.x版本中,JDBC只是一個可選部件,到了JDK1.1公布時,SQL類包(也就是JDBCAPI)就成為Java語言的標準部件。

(二)JDBC技術概述

  • JDBC是一種可用于執行SQL語句的JavaAPI(ApplicationProgrammingInterface,應用程序設計接口)。通過使用JDBC,開發人員可以很方便地將SQL語句傳送給幾乎任何一種數據庫。也就是說,開發人員可以不必寫一個程序訪問Sybase,寫另一個程序訪問Oracle,再寫一個程序訪問Microsoft的SQLServer。用JDBC寫的程序能夠自動地將SQL語句傳送給相應的數據庫管理系統(DBMS)。不但如此,使用Java編寫的應用程序可以在任何支持Java的平臺上運行,不必在不同的平臺上編寫不同的應用。Java和JDBC的結合可以讓開發人員在開發數據庫應用時真正實現“WriteOnce,RunEverywhere!”

  • Java具有健壯、安全、易用等特性,而且支持自動網上下載,本質上是一種很好的數據庫應用的編程語言。它所需要的是Java應用如何同各種各樣的數據庫連接,JDBC正是實現這種連接的關鍵。

  • JDBC擴展了Java的能力,如使用Java和JDBCAPI就可以公布一個Web頁,頁中帶有能訪問遠端數據庫的Ap plet。或者企業可以通過JDBC讓全部的職工(他們可以使用不同的操作系統,如Windwos,Machintosh和UNIX)在In tranet上連接到幾個全球數據庫上,而這幾個全球數據庫可以是不相同的。隨著越來越多的程序開發人員使用Java語言,對Java訪問數據庫易操作性的需求越來越強烈。

  • JDBC API定義了一組用于與數據庫通信的接口和類。這些接口和類位于java.sql包中。

  • JDBC是用來(讓我們的程序)通過網絡來操作數據庫的,作用很重要;JDBC技術也是Java核心技術之一。凡是需要用網絡操作數據庫的程序,JDBC編程有問題,一切都是白搭。

  • (三)JDBC技術及使用詳解

    從結構圖中可以看出,通過JDBC API 讓我們的Java應用程序可以利用JDBCDriver Manager[JDBC驅動管理],連接到JDBC驅動;體現在我們的工程中也就是要導入驅動jar包。

    1.何謂驅動?

    不同的數據庫廠商或者同一廠商的不同數據庫版本都會提供不同的驅動,任何應用程序都是通過這個驅動來操作特定廠商、特定版本的數據庫的。

    2.JDBC驅動程序的分類

    • 第一類JDBC驅動程序是JDBC-ODBC橋再加上一個ODBC驅動程序。這類驅動一般不用現在的編程應用中。

    • 第二類JDBC驅動程序是部分JAVAAPI代碼的驅動程序,用于把JDBC調用轉換成主流數據庫API的本機調用。

    • 第三類JDBC驅動程序是面向數據庫中間件的純JAVA驅動程序,JDBC調用被轉換成一種中間件廠商的協議,中間件再把這些調用轉換到數據庫API。

    • 第四類JDBC驅動程序是直接面向數據庫的純JAVA驅動程序。

    二、JDBC連接MySQL數據庫的基礎方式

    (一)通過JDBC操作數據庫的基本步驟

    • 第1步:注冊驅動 (只做一次)

    • 第2步:建立連接(Connection)

    • 第3步:創建執行SQL的語句(Statement)

    • 第4步:執行語句

    • 第5步:處理執行結果(ResultSet)

    • 第6步:釋放資源

    1.使用JDBC第一步:加載驅動

    注冊驅動有三種方式:

    • Class.forName(“com.mysql.jdbc.Driver”);推薦這種方式,不會對具體的驅動類產生依賴

    • DriverManager.registerDriver(com.mysql.jdbc.Driver);會對具體的驅動類產生依賴

    • System.setProperty(“jdbc.drivers”, “driver1:driver2”);雖然不會對具體的驅動類產生依賴;但注冊不太方便,所以很少使用

    2.使用JDBC第二步:建立連接

    通過Connection建立連接,Connection是一個接口類,其功能是與數據庫進行連接(會話)。

    • 建立Connection接口類對象:

    Connection conn =DriverManager.getConnection(url, user, password);

    • URL的格式要求為:

      JDBC:子協議:子名稱//主機名:端口/數據庫名?屬性名=屬性值&
      如:"jdbc:mysql://localhost:3306/test“

    • user即為登錄數據庫的用戶名,如root

    • password即為登錄數據庫的密碼,為空就填””

    3.使用JDBC第三步:創建執行對象

    執行對象Statement負責執行SQL語句,由Connection對象產生。

    Statement接口類還派生出兩個接口類PreparedStatement和CallableStatement,這兩個接口類對象為我們提供了更加強大的數據訪問功能。

    • 創建Statement的語法為:

    Statement st = conn.createStatement();

    4.使用JDBC第四步:執行SQL語句

    執行對象Statement提供兩個常用的方法來執行SQL語句。

    • executeQuery(Stringsql),該方法用于執行實現查詢功能的sql語句,返回類型為ResultSet(結果集)。

    如:ResultSet rs =st.executeQuery(sql);

    • executeUpdate(Stringsql),該方法用于執行實現增、刪、改功能的sql語句,返回類型為int,即受影響的行數。

    如:int flag = st.executeUpdate(sql);

    5.使用JDBC第五步:處理執行結果

    ResultSet對象

    ResultSet對象負責保存Statement執行后所產生的查詢結果。

    結果集ResultSet是通過游標來操作的。

    游標就是一個可控制的、可以指向任意一條記錄的指針。有了這個指針我們就能輕易地指出我們要對結果集中的哪一條記錄進行修改、刪除,或者要在哪一條記錄之前插入數據。一個結果集對象中只包含一個游標。

    6.使用JDBC 第六步——釋放資源

    Connection對象的close方法用于關閉連接,并釋放和連接相關的資源。

    (二)JDBC連接數據庫具體代碼示例

    1.確認數據庫是否存在

    要查詢、增、刪數據庫,首先得確認在mysql中是否存在數據庫及相應的表,可以通過cmd在mysql中進行確認

    2.連接并操作數據庫

    // TODO: 2021/7/8 傳統的連接方式@Overridepublic void connectionByJdbc() throws ClassNotFoundException, IOException, SQLException {Class.forName("com.mysql.cj.jdbc.Driver");InputStream resourceAsStream = JdbcConnectionImpl.class.getClassLoader().getResourceAsStream("jdbcproperties/jdbc.properties");Properties properties = new Properties();properties.load(resourceAsStream);String url = properties.getProperty("url");String user = properties.getProperty("user");String password = properties.getProperty("password");Connection connection = DriverManager.getConnection(url, user, password);Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery("select * from customer where id = 1");while (resultSet.next()) {System.out.println(resultSet.getString("name"));int salary = resultSet.getInt("salary");System.out.println(salary);}}


    三、DBCP連接MySQL數據庫詳解

    DBCP(DataBase Connection Pool)數據庫連接池,是java數據庫連接池的一種,由Apache開發,通過數據庫連接池,可以讓程序自動管理數據庫連接的釋放和斷開。

    DBCP(DataBase connection pool),數據庫連接池。是 apache 上的一個 java 連接池項目,也是 tomcat 使用的連接池組件。單獨使用dbcp需要2個包:

    • commons-dbcp.jar,
    • commons-pool.jar

    由于建立數據庫連接是一個非常耗時耗資源的行為,所以通過連接池預先同數據庫建立一些連接,放在內存中,應用程序需要建立數據庫連接時直接到連接池中申請一個就行,用完后再放回去。

    (一)DBCP2原理

    DBCP2在初始化時會從數據庫獲取指定數量的連接,把這些連接存放到空閑連接隊列LinkedBlockingDeque里面,這個隊列是雙向鏈路阻塞型隊列,先進先出,每次要使用連接時就從這個隊列獲取頭部結點,獲取連接時使用的鎖是ReentrantLock.獲取到連接時,該連接節點出隊列,更改狀態并且存放到一個ConcurrentHashMap中,標識該連接已被使用,另外會有一個空閑連接檢測線程不斷去檢測ConcurrentHashMap中連接的狀態,如果連接已經關閉(不是數據庫連接關閉,而是連接在DBCP連接池中關閉),則把它從ConcurrentHashMap中刪除,并且回收到LinkedBlockingDeque里面。

    • 優點:
      配置簡單
    • 缺點:
      無論是空閑連接還是已使用的連接,都是存放加鎖的ConcurrentHashMap或LinkedBlockingDeque中,并發量低,性能不好,適用于小型系統。從數據庫獲取連接的過程中還加了synchronized同步鎖,如果網絡容易中斷的場景下,一旦與數據庫建立的網絡出現問題,容易導致死鎖。

    (二)認識BasicDataSource類

    commons-dbcp.jar包中有一個類BasicDataSource類,該類有一個無參構造方法,可以實例化一個BasicDataSource對象,更重要的是這個是實現了DataSource接口,這樣更有利于規范化還更符合面向對象接口編程。該類當中有四個必須的set方法和四個重要的拓展方法

    1.四個必須的set方法

    參數描述
    setDriverClassName(String driverClassName)設置驅動名
    setUrl(String url)設置url參數
    setUsername(String username)設置數據庫連接用戶名
    setPassword(String password)設置數據庫連接密碼

    2.四個重要的拓展方法

    參數描述
    setMaxActive(int maxActive)最大活動連接:連接池在同一時間能夠分配的最大活動連接的數量, 如果設置為非正數則表示不限制.
    setInitialSize(int initialSize)初始化連接:連接池啟動時創建的初始化連接數量,1.2版本后支持
    setMaxIdle(int maxIdle)最大空閑連接:連接池中容許保持空閑狀態的最大連接數量,超過的空閑連接將被釋放,如果設置為負數表示不限制
    setMinIdle(int minIdle)最小空閑連接:連接池中容許保持空閑狀態的最小連接數量,低于這個數量將創建新的連接,如果設置為0則不創建
    maxWaitMillis最大等待時間:當沒有可用連接時,連接池等待連接被歸還的最大時間(以毫秒計數),超過時間則拋出異常

    3.事務屬性配置


    數據源連接健康狀況檢查

    緩存語句

    連接泄露回收

    (三)讀取properties文件創建BasicDataSource

    1.properties文件格式

    driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/mydb?usessl=false&serverTimezone=UTC username=root password=123456

    2.用BasicDataSourceFactoy創建BasicDataSource數據庫連接池

    @Testpublic void test30() throws Exception {InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("jdbcproperties/jdbc.properties");Properties properties = new Properties();properties.load(resourceAsStream);BasicDataSource dataSource = BasicDataSourceFactory.createDataSource(properties);// TODO: 2021/7/8 設置創建數據庫連接池時初始的連接數量 dataSource.setInitialSize(10);// TODO: 2021/7/8 設置最小閑置連接數,如果閑置的連接數小于設定的值,則會自動創建連接 dataSource.setMinIdle(2);// TODO: 2021/7/8 設置最大閑置連接數量,如果閑置連接數量超過此值,則會釋放多余的連接 dataSource.setMaxIdle(5);// TODO: 2021/7/8 設置最大活動連接數 dataSource.setMaxTotal(10);Connection connection = dataSource.getConnection();Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery("select * from customer where id =1");while (resultSet.next()) {String name = resultSet.getString("name");String salary = resultSet.getString("salary");System.out.println("Name:" + name + "Salary:" + salary);}}

    (四) 在SpringIOC容器中創建BasicDataSource數據庫連接池

    1.配置xml核心配置文件

    <!-- TODO:在IOC容器中創建一個BasicDataSource數據庫連接池,并將屬性數據裝配到Bean中,這里的屬性與Properties后置處理器配合,解析Bean中的屬性,產生新的屬性名稱,并從屬性文件中找到對應的屬性值,再次傳遞給BasicDataSource這個bean的屬性--><bean id="datasource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"><property name="driverClassName" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.passowrd}"/></bean><!-- TODO:Properties后置處理器,主要用用是解析Bean中的屬性,從屬性文件中讀取對應值,再次傳入到Bean中--><!-- <context:property-placeholder location="classpath:dbcp.properties"/>--><bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"><property name="location" value="classpath:dbcp.properties"/></bean><!-- TODO:Spring-jdbc中的數據空間,可將BasicDataSource的Bean封裝到其中,可以優化處理--><bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate" autowire="byType"/>

    2.測試在IOC容器中BasicDataSource數據庫連接池

    • 2.1 第一種測試(基本測試,直接調用的是數據庫連接池)
    @Testpublic void test22() throws SQLException {ApplicationContext ac = new ClassPathXmlApplicationContext("dbcp.xml");BasicDataSource datasource = (BasicDataSource) ac.getBean("datasource");Connection connection = datasource.getConnection();Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery("select * from customer where id = 1");while (resultSet.next()) {String name = resultSet.getString("name");int salary = resultSet.getInt("salary");System.out.println("姓名為:" + name + ";薪資為:" + salary + ";");}}
    • 2.2 第二種測試,(調用的是spring-jdbc中的JdbcTemplate的Bean),他是將連接池的Bean注入其中,用他來管理并操作連接池查詢、增、刪數據,比較方便
    @Testpublic void test47() {ApplicationContext ac = new ClassPathXmlApplicationContext("dbcp.xml");JdbcTemplate jdbcTemplate = (JdbcTemplate) ac.getBean("jdbcTemplate");List<Map<String, Object>> maps = jdbcTemplate.queryForList("select * from customer");for (Map<String, Object> map : maps) {String name = (String) map.get("name");Long salary = (Long) map.get("salary");System.out.println(name + "=" + salary);}}

    (五)創建BasicDataSource工具類來創建連接池

    1.創建DBCP連接池管理工具類

    public class BasicDataSourceUtil {private static BasicDataSource thisbasicDataSource;public BasicDataSource createDataSource() throws IOException {BasicDataSource basicDataSource = new BasicDataSource();InputStream resourceAsStream = this.getClass().getClassLoader().getResourceAsStream("dbcp2.properties");Properties properties = new Properties();properties.load(resourceAsStream);String driverClassName = properties.getProperty("driverClassName");String url = properties.getProperty("url");String username = properties.getProperty("username");String password = properties.getProperty("password");basicDataSource.setDriverClassName(driverClassName);basicDataSource.setUrl(url);basicDataSource.setUsername(username);basicDataSource.setPassword(password);thisbasicDataSource = basicDataSource;return basicDataSource;}// TODO: 2021/7/9 返回一個dbcp數據為連接池,一般不會采取這樣的做法,不安全public static BasicDataSource getBaiseDataResouce(){return thisbasicDataSource;}// TODO: 2021/7/9 返回一個連接public static Connection getConnection() throws SQLException {return thisbasicDataSource.getConnection();} }

    在上面的代碼中,是通過讀取proeperties文件中對應的屬性值,然后傳遞給DBCP數據庫連接池對象,我們也可以通過BasicDataSourceFactory工廠,只接加載屬性文件對象,這樣更快速便捷,只是對Properties文件的格式有一定的要求。要求屬性文件中的屬性名必須和BasicDataSource中的屬性名一致,具體部分屬性如下:

    driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC&useSSL=false username=root password=123456maxTotal:100 initialSize:10 maxWait:60000 minIdle:10 maxIdle:15logAbandoned:true removeAbandoned:true removeAbandonedTimeout:10 timeBetweenEvictionRunsMillis:10000 numTestsPerEvictionRun:10 minEvictableIdleTimeMillis:10000 validationQuery:SELECT 1 FROM DUAL#\u6821\u9A8C\u94FE\u63A5 testWhileIdle:true testOnBorrow:true

    2.在靜態工廠工具類中采取BasicDataSourceFactory來創建DBCP數據庫連接池

    在前一小節中,我們采取的是讀取屬性文件的屬性值后,再單獨將每個屬性值傳遞給BasicDataSource數據庫連接池對象,這樣的效率比較慢,在這里,我們可以采取BasicDataSourceFactiory類加載屬性對象,來創建一個DBCP數據庫連接池。

    public class BasicDataSourcePropertiesUtil {private static BasicDataSource staticdataSource;private static JdbcTemplate staticjdbcTemplate;public static BasicDataSource createBasicDataSource(String xmlName) throws Exception {InputStream resource AsStream = BasicDataSource.class.getClassLoader().getResourceAsStream(xmlName);Properties properties = new Properties();properties.load(resourceAsStream);BasicDataSource dataSource = BasicDataSourceFactory.createDataSource(properties);JdbcTemplate jdbcTemplate = new JdbcTemplate();jdbcTemplate.setDataSource(dataSource);staticdataSource = dataSource;staticjdbcTemplate = jdbcTemplate;return dataSource;}public static Connection getConnection() throws SQLException {return staticdataSource.getConnection();}public static List<Map<String, Object>> getConnectionQuery(String strQuery) {List<Map<String, Object>> maps = staticjdbcTemplate.queryForList(strQuery);return maps;} }

    針對上的工具類創建的數據庫連接池,可通直接調用,也可以通過IOC容器,采取靜態工廠的方法來創建.

    (1) 直接調用

    @Testpublic void test112() throws Exception {BasicDataSource basicDataSource = BasicDataSourcePropertiesUtil.createBasicDataSource("dbcp4.properties");List<Map<String, Object>> connectionQuery = BasicDataSourcePropertiesUtil.getConnectionQuery("select * from customer");for (Map<String, Object> stringObjectMap : connectionQuery) {String name = (String) stringObjectMap.get("name");Integer salary = (Integer) stringObjectMap.get("salary");System.out.println(name + "=" + salary + ";");}}

    (2) IOC容器中采取靜態工廠方式調用

    • 首先得創建IOC容器的xml核心配置文件
    <bean class="util.BasicDataSourcePropertiesUtil" factory-method="createBasicDataSource" id="dataSource"><constructor-arg name="xmlName" value="dbcp4.properties"/></bean><bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate"><property name="dataSource" ref="dataSource"/></bean>
    • 創建IOC容器,并從IOC容器中得到DBCP數據庫連接池,或者得到JdbcTemplate對象(用于封裝DBCP數據庫連接池對象BasicDataSource,提供了操作數據庫方法)
    @Testpublic void test124() {ApplicationContext ac = new ClassPathXmlApplicationContext("dbcp4.xml");JdbcTemplate jdbcTemplate = (JdbcTemplate) ac.getBean("jdbcTemplate");List<Map<String, Object>> maps = jdbcTemplate.queryForList("select * from customer");for (Map<String, Object> map : maps) {String name = (String) map.get("name");Integer salary = (Integer) map.get("salary");System.out.println(name + "=" + salary + ";");}}

    3.配置IOC 核心配置文件xml

    核心 文件的配置實現了現以下兩個功能:

    • 在IOC容器中創建了工具類的一個Bean,做為實例工廠類Bean
    • 調用實例工廠類bean中的方法,在IOC中創建一個BasicDataSource連接池Bean,同時將這個Bean的引用傳遞到工具類中
    <!-- TODO:創建一個BasicDataSource工具類實例 --><bean id="datasourceutil" class="util.BasicDataSourceUtil"/><!-- TODO:實例工廠類,通過一個方法return 一個BasicDataSource對象,同時在這個實例工廠方法中,將這個數據庫連接池的Bean的引用傳遞給工具類的BasicDataSource的引用 --><bean id="datasource" factory-bean="datasourceutil" factory-method="createDataSource" destroy-method="close"/>

    4.分別從IOC容器和工具類中取得BasicDataSource數據庫連接池

    • 從IOC中取得連接池
    // TODO: 2021/7/9 這個是從IOC容器中取得到的數據為連接池@Testpublic void test44() throws SQLException {ApplicationContext ac = new ClassPathXmlApplicationContext("dbcp2.xml");BasicDataSource datasource = (BasicDataSource) ac.getBean("datasource");Connection newconnection = datasource.getConnection();Statement statement = newconnection.createStatement();ResultSet resultSet = statement.executeQuery("select * from customer where id = 1");while (resultSet.next()) {String name = resultSet.getString("name");int salary = resultSet.getInt("salary");System.out.println("姓名為:" + name + ";薪資為:" + salary + ";");}resultSet.close();statement.close();newconnection.close();}
    • 從工具類中取得連接池
    // TODO: 2021/7/9 調用工具類的做法 ,從工具類中得到數據庫連接池@Testpublic void test63() throws SQLException {ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("dbcp2.xml");Connection connection = BasicDataSourceUtil.getConnection();Statement statement = connection.createStatement();ResultSet resultSet = statement.executeQuery("select * from customer where id = 1");while (resultSet.next()) {String name = resultSet.getString("name");int salary = resultSet.getInt("salary");System.out.println("姓名為:" + name + ";薪資為:" + salary + ";");}resultSet.close();statement.close();connection.close();}

    四、C3P0數據庫連接池詳解

    C3P0,它實現了數據源和JNDI綁定,支持JDBC3規范和JDBC2的標準擴展。目前使用它的開源項目有Hibernate,Spring等,這個被推薦使用.他的配置相對簡單,可以直接通過加載文件就可以配置成功!

    (一)創建c3p0-config.xml文件

    這是一個c3p0數據庫連接池的配置文件,他可以默認狀態,也可以指定配置名稱配置.這樣的話,c3p0數據庫連接池在創建中,可以指定不同的名,加載一個c3p0-config.xml文件,創建不同的數據庫連接池!

    • xml連接池配置文件
    <?xml version="1.0" encoding="UTF-8"?><!-- TODO: 此文件必須命名為: c3p0-confing.xml--> <c3p0-config><!-- TODO:此處為給此文件命名為:jdbcConfig,在創建c3p0數據庫連接池時,可以通過此名來加載引xml文件 --><named-config name="jdbcConfig"><property name="driverClass">com.mysql.cj.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb?useSSL=false&amp;serverTimezone=UTC</property><property name="user">root</property><property name="password">123456</property><!-- 當連接數量用盡時,可定期的增量數 --><property name="acquireIncrement">10</property><!-- 數據庫初始化時,需要初始化連接池中連接的數量 --><property name="initialPoolSize">100</property><!-- 連接池的最小連接數 --><property name="minPoolSize">10</property><!-- 連接池的最大連接數 --><property name="maxPoolSize">200</property><!-- 連接池中 Statement 的最大個數 --><property name="maxStatements">20</property><!-- 連接池中每個連接可以同時使用的 Statement 的個數 --><property name="maxStatementsPerConnection">5</property></named-config><named-config name="abcd"><property name="driverClass">com.mysql.cj.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb?useSSL=false&amp;serverTimezone=UTC</property><property name="user">root</property><property name="password">123456</property><!-- 當連接數量用盡時,可定期的增量數 --><property name="acquireIncrement">10</property><!-- 數據庫初始化時,需要初始化連接池中連接的數量 --><property name="initialPoolSize">100</property><!-- 連接池的最小連接數 --><property name="minPoolSize">10</property><!-- 連接池的最大連接數 --><property name="maxPoolSize">200</property><!-- 連接池中 Statement 的最大個數 --><property name="maxStatements">20</property><!-- 連接池中每個連接可以同時使用的 Statement 的個數 --><property name="maxStatementsPerConnection">5</property></named-config><default-config><!-- TODO:這個地方可以寫默認的c3p0數據庫連接池配置文件 --></default-config></c3p0-config>
    • 直接創建連接池
    public class CmoboPoolUtil {private static ComboPooledDataSource dataSource;public static ComboPooledDataSource createComboPoolDataSource(String c3p0config) {ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(c3p0config);dataSource = comboPooledDataSource;return comboPooledDataSource;}public static Connection getConnection() throws SQLException {return dataSource.getConnection();} }
    • 在IOC容器中以靜態工廠的方式創建連接池
    ?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="datasource" class="util.CmoboPoolUtil" factory-method="createComboPoolDataSource" destroy-method="close"><constructor-arg name="c3p0config" value="jdbcConfig"/></bean><bean class="org.springframework.jdbc.core.JdbcTemplate" name="jdbcTemplate"><property name="dataSource" ref="datasource"/></bean><bean id="abcd" class="util.CmoboPoolUtil" factory-method="createComboPoolDataSource" destroy-method="close"><constructor-arg name="c3p0config" value="abcd"/></bean><bean id="springjdbc" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="abcd"/></bean></beans>

    (二)采取IOC容器創建C3P0數據庫連接池

    在IOC容器中,可以直接創建一個C3p0的數據庫連接池的Bean,并設置配置屬性,配置屬性可以創建一個配置屬性properties文件,在IOC容器中上,通過properties后置處理器解析c3p0數據庫連接池Bean的屬性,通過解析的名字,從屬性文件中得到對應的屬性值,并得新給c3p0數據庫連接池中的屬性賦值,在這個地方,properties后置處理器的主要功能有:

    • 解析IOC Bean中的屬性
    • 加載propertids屬性文件
    • 通過解析后的字符找到相應的屬性值,并重新賦值給Bean中的屬性.

    1.c3p0屬性文件

    driverClass=com.mysql.cj.jdbc.Driver jdbcUrl=jdbc:mysql://localhost:3306/newdb?useSSL=false&serverTimezone=UTC user=root password=123456 acquireIncrement=10 initialPoolSize=100 minPoolSize=10 maxPoolSize=200 maxStatements=20 maxStatementsPerConnection=5

    2.IOC容器配置文件xml

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!-- TODO:在IOC容器中創建c3p0數據庫連接池 --><bean id="c3p0" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"><property name="driverClass" value="${driverClass}"/><property name="jdbcUrl" value="${jdbcUrl}"/><property name="user" value="${user}"/><property name="password" value="${password}"/><property name="acquireIncrement" value="${acquireIncrement}"/><property name="initialPoolSize" value="${initialPoolSize}"/><property name="minPoolSize" value="${minPoolSize}"/><property name="maxPoolSize" value="${maxPoolSize}"/><property name="maxStatements" value="${maxStatements}"/><property name="maxStatementsPerConnection" value="${maxStatementsPerConnection}"/></bean><!-- TODO:IOC后置處理器,解析Bean中的屬性,從指定的屬性文件中讀取對應的屬性值,重新注入到Bean中 --><!-- <context:property-placeholder location="classpath:c3p0.properties"/>--><bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"><property name="location" value="classpath:c3p0.properties"/></bean><!-- TODO:創建一個Srping-jdbc包裝類,用于封裝c3po數據庫連接池,可以對數據庫連接池進行操作 --><bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate" autowire="byType"/></beans>

    總結

    以上是生活随笔為你收集整理的MySQL:JDBC基础及连接数据库的方式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。