jdbc、數據庫驅動、mybaties、數據庫連接池之間的關系


一、JDBC


  JDBC(Java Data Base Connectivity,java數據庫連接)是一種用於執行SQL語句的Java API,可以為多種關系數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基准,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序。

二.數據庫驅動

  不同的數據庫驅動就是為了連接不同的數據庫對JDBC進行了不同的實現。
我們安裝好數據庫之后,我們的應用程序也是不能直接使用數據庫的,必須要通過相應的數據庫驅動程序,通過驅動程序去和數據庫打交道。其實也就是數據庫廠商的JDBC接口實現,即對Connection等接口的實現類的jar文件。

常用接口:

1.Driver接口

  Driver接口由數據庫廠家提供,作為java開發人員,只需要使用Driver接口就可以了。在編程中要連接數據庫,必須先裝載特定廠商的數據庫驅動程序,不同的數據庫有不同的裝載方法。如:

  裝載MySql驅動:Class.forName("com.mysql.jdbc.Driver");

  裝載Oracle驅動:Class.forName("oracle.jdbc.driver.OracleDriver");

2.Connection接口

  Connection與特定數據庫的連接(會話),在連接上下文中執行sql語句並返回結果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定義的數據庫Connection連接上。

  連接MySql數據庫:Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");

  連接Oracle數據庫:Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user", "password");

  連接SqlServer數據庫:Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://host:port; DatabaseName=database", "user", "password");

  常用方法:

createStatement():創建向數據庫發送sql的statement對象。
prepareStatement(sql) :創建向數據庫發送預編譯sql的PrepareSatement對象。
prepareCall(sql):創建執行存儲過程的callableStatement對象。
setAutoCommit(boolean autoCommit):設置事務是否自動提交。
commit() :在鏈接上提交事務。
rollback() :在此鏈接上回滾事務。

3.Statement接口

  用於執行靜態SQL語句並返回它所生成結果的對象。

  三種Statement類:

Statement:由createStatement創建,用於發送簡單的SQL語句(不帶參數)。
PreparedStatement:繼承自Statement接口,由preparedStatement創建,用於發送含有一個或多個參數的SQL語句。PreparedStatement對象比Statement對象的效率更高,並且可以防止SQL注入,所以我們一般都使用PreparedStatement。
CallableStatement:繼承自PreparedStatement接口,由方法prepareCall創建,用於調用存儲過程。
  

常用Statement方法:

execute(String sql):運行語句,返回是否有結果集
executeQuery(String sql):運行select語句,返回ResultSet結果集。
executeUpdate(String sql):運行insert/update/delete操作,返回更新的行數。
addBatch(String sql) :把多條sql語句放到一個批處理中。
executeBatch():向數據庫發送一批sql語句執行。

4.ResultSet接口

  ResultSet提供檢索不同類型字段的方法,常用的有:

getString(int index)、getString(String columnName):獲得在數據庫里是varchar、char等類型的數據對象。

  ResultSet還提供了對結果集進行滾動的方法:

next():移動到下一行
Previous():移動到前一行
absolute(int row):移動到指定行
beforeFirst():移動resultSet的最前面。
afterLast() :移動到resultSet的最后面。
使用后依次關閉對象及連接:ResultSet → Statement → Connection

 

使用JDBC的步驟:

  加載JDBC驅動程序 → 建立數據庫連接Connection → 創建執行SQL的語句Statement → 處理執行結果ResultSet → 釋放資源

Class.forName(“com.MySQL.jdbc.Driver”);
 Connection conn = DriverManager.getConnection(url, user, password);

String id = "5";
String sql = "delete from table where id=" + id;
Statement st = conn.createStatement();
st.executeQuery(sql);

String sql = “insert into user (name,pwd) values(?,?)”;
PreparedStatement ps = conn.preparedStatement(sql);
ps.setString(1, “col_value”); //占位符順序從1開始
ps.setString(2, “123456”); //也可以使用setObject
ps.executeQuery();

ResultSet rs = ps.executeQuery();

5.釋放資源

//數據庫連接(Connection)非常耗資源,盡量晚創建,盡量早的釋放
//都要加try catch 以防前面關閉出錯,后面的就不執行了
//數據庫連接(Connection)非常耗資源,盡量晚創建,盡量早的釋放 //都要加try catch 以防前面關閉出錯,后面的就不執行了 1 try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (st != null) {
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}

三、MyBatis

參考:
https://www.w3cschool.cn/mybatis/
使用MyBatis時也要加載不同的數據庫驅動去連接不同的數據庫,只是寫代碼的時候 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。


springboot集成mybaties需要以下兩個配置:
1、mybatis.mapper-locations在SpringBoot配置文件中使用,作用是掃描Mapper接口對應的XML文件,如果全程使用@Mapper注解,可以不使用該配置。
2、@MapperScan會掃描Mapper接口類,並生成對應的實現類。

兩者缺一不可。


在介紹MyBatis之前先簡單了解幾個概念:ORM,JPA。

ORM
ORM(Object-Relationship-Mapping):是對象關系映射的意思,它是一種思想,是指將數據庫中的每一行數據用對象的形式表現出來。

JPA
JPA(Java-Persistence-API):是Java持久化接口的意思,它是JavaEE關於ORM思想的一套標准接口,僅僅是一套接口,不是具體的實現。

MyBatis是一個實現了JPA規范的用來連接數據庫並對其進行增刪改查操作的開源框架 (就和傳統的JDBC一樣,就是個連接數據庫的東西),其實,它底層就是一個JDBC封裝的組件。MyBatis的前身是Ibatis,Ibatis創建與2002年最初為Apache下面的一個開源項目,2010遷移到google code下面並改名為MyBatis。

MyBatis雖然實現了JPA但是它並不是一個完完全全的ORM組件,而是一個基於SQL開發的半ORM組件。

而Hibernate是一個完完全全的ORM組件,它是完全基於對象來操作數據庫中的記錄,並不和MyBatis一樣是一個假把式。

MyBatis的優點:

簡單易學,容易上手(相比於Hibernate) ---- 基於SQL編程
消除了JDBC大量冗余的代碼,不需要手動開關連接。

MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優秀的持久層框架。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以對配置和原生Map使用簡單的 XML 或注解,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。


我們把Mybatis的功能架構分為三層:

API接口層:提供給外部使用的接口API,開發人員通過這些本地API來操縱數據庫。接口層一接收到調用請求就會調用數據處理層來完成具體的數據處理。
數據處理層:負責具體的SQL查找、SQL解析、SQL執行和執行結果映射處理等。它主要的目的是根據調用的請求完成一次數據庫操作。
基礎支撐層:負責最基礎的功能支撐,包括連接管理、事務管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作為最基礎的組件。為上層的數據處理層提供最基礎的支撐

優點:

簡單易學:本身就很小且簡單。沒有任何第三方依賴,最簡單安裝只要兩個jar文件+配置幾個sql映射文件易於學習,易於使用,通過文檔和源代碼,可以比較完全的掌握它的設計思路和實現。
靈活:mybatis不會對應用程序或者數據庫的現有設計強加任何影響。 sql寫在xml里,便於統一管理和優化。通過sql基本上可以實現我們不使用數據訪問框架可以實現的所有功能,或許更多。
解除sql與程序代碼的耦合:通過提供DAL層,將業務邏輯和數據訪問邏輯分離,使系統的設計更清晰,更易維護,更易單元測試。sql和代碼的分離,提高了可維護性。
提供映射標簽,支持對象與數據庫的orm字段關系映射
提供對象關系映射標簽,支持對象關系組建維護
提供xml標簽,支持編寫動態sql。
缺點:

編寫SQL語句時工作量很大,尤其是字段多、關聯表多時,更是如此。
SQL語句依賴於數據庫,導致數據庫移植性差,不能更換數據庫。
框架還是比較簡陋,功能尚有缺失,雖然簡化了數據綁定代碼,但是整個底層數據庫查詢實際還是要自己寫的,工作量也比較大,而且不太容易適應快速數據庫修改。
二級緩存機制不佳


四、數據庫連接池

用戶每次請求都需要向數據庫獲得鏈接,而數據庫創建連接通常需要消耗相對較大的資源,創建時間也較長。假設網站一天10萬訪問量,數據庫服務器就需要創建10萬次連接,極大的浪費數據庫的資源,並且極易造成數據庫服務器內存溢出、拓機。

數據庫連接是一種關鍵的有限的昂貴的資源,這一點在多用戶的網頁應用程序中體現的尤為突出.對數據庫連接的管理能顯著影響到整個應用程序的伸縮性和健壯性,影響到程序的性能指標.數據庫連接池正是針對這個問題提出來的.數據庫連接池負責分配,管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是重新建立一個。

1、連接池是創建和管理一個連接的緩沖池的技術,這些連接准備好被任何需要它們的線程使用。
  作用:避免頻繁地創建與消毀,給服務器減壓力。
2、數據庫的弊端:
  1.當用戶群體少服務器可以支撐,如果群體比較大萬級別服務器直接死機。數據庫默認的並發訪問50.
  2.每一個用完數據庫之后直接關閉,不能重復利用太浪費資源。
3、設計連接池:
  1.在池子中創建出多個連接供使用。
  2.當用戶需要操作數據庫時直接從池子中獲取連接即可。
  3.當用戶使用完畢之后把連接歸還給連接池,可以達到重復使用。
  4.可以設定池子的最大容器。比如50個連接,當第51個人訪問的時候,需要等待。
  5.其它用戶釋放資源的時候,可以使用

4、自定義數據庫連接池
編寫連接池需實現java.sql.DataSource接口。
5、開源數據庫連接池
  現在很多WEB服務器(Weblogic, WebSphere,Tomcat)都提供了DataSoruce的實現,即連接池的實現。通常我們把DataSource的實現,按其英文含義稱之為數據源,數據源中都包含了數據庫連接池的實現。
  也有一些開源組織提供了數據源的獨立實現:

DBCP 數據庫連接池
C3P0 數據庫連接池
   在使用了數據庫連接池之后,在項目的實際開發中就不需要編寫連接數據庫的代碼了,直接從數據源獲得數據庫的連接。

Druid 相對於其他數據庫連接池的優點:
強大的監控特性,通過Druid提供的監控功能,可以清楚知道連接池和SQL的工作情況。
a. 監控SQL的執行時間、ResultSet持有時間、返回行數、更新行數、錯誤次數、錯誤堆棧信息;

b.SQL執行的耗時區間分布。什么是耗時區間分布呢?比如說,某個SQL執行了1000次,其中0~1毫秒區間50次,1~10毫秒800次,10~100毫秒100次,100~1000毫秒30次,1~10秒15次,10秒以上5次。通過耗時區間分布,能夠非常清楚知道SQL的執行耗時情況;

c. 監控連接池的物理連接創建和銷毀次數、邏輯連接的申請和關閉次數、非空等待次數、PSCache命中率等。

方便擴展。Druid提供了Filter-Chain模式的擴展API,可以自己編寫Filter攔截JDBC中的任何方法,可以在上面做任何事情,比如說性能監控、SQL審計、用戶名密碼加密、日志等等。
Druid集合了開源和商業數據庫連接池的優秀特性,並結合阿里巴巴大規模苛刻生產環境的使用經驗進行優化。

最小連接數是系統啟動時連接池所創建的連接數。如果創建過多,則系統啟動就慢,但創建后系統的響應速度會很快;如果創建過少,則系統啟動的很快,響應起來卻慢。這樣,可以在開發時,設置較小的最小連接數,開發起來會快,而在系統實際使用時設置較大的,因為這樣對訪問客戶來說速度會快些。最大連接數是連接池中允許連接的最大數目,具體設置多少,要看系統的訪問量,可通過軟件需求上得到。

五、數據庫事務


1、數據庫事務的4大特性:

原子性(ATOMICITY):
   一個事務要被完全的無二義性的做完或撤消。在任何操作出現一個錯誤的情況下,構成事務的所有操作的效果必須被撤消,數據應被回滾到以前的狀態。

  一致性(CONSISTENCY):   

   一個事務應該保護所有定義在數據上的不變的屬性(例如完整性約束)。在完成了一個成功的事務時,數據應處於一致的狀態。

  隔離性(ISOLATION):

   在同一個環境中可能有多個事務並發執行,而每個事務都應表現為獨立執行。串行的執行一系列事務的效果應該同於並發的執行它們。這要求兩件事:

   在一個事務執行過程中,數據的中間的(可能不一致)狀態不應該被暴露給所有的其他事務。
   兩個並發的事務應該不能操作同一項數據。數據庫管理系統通常使用鎖來實現這個特征。

  持久性(DURABILITY)或串行化: 不會有並發問題,但性能差。
   一個被完成的事務的效果應該是持久的。

2、事務的隔離級別:

在mysql下事務的隔離級別有四種且由低到高依次為Read uncommitted 、Read committed 、Repeatable read (默認)、Serializable ,這四個級別中的后三個級別可以逐個解決臟讀 、不可重復讀 、幻讀這幾類問題。

開啟事務:
start transaction;

提交事務:
commit;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM