午夜精品人妻久久久-成年美女很黄的网站-在线看片免费人成视久网app-国产精品美女无遮挡一区二区-91精品国产综合久久久久-国产的免费视频又猛又爽又刺激-在线看片免费人成视久网app-久久香蕉国产精品视频-av一区二区三区高清

10年開發(fā)經(jīng)驗程序員一文帶你把5種數(shù)據(jù)庫操作框架給直接理解透徹

數(shù)據(jù)庫操作框架
數(shù)據(jù)庫操作框架指的是第三方軟件操作數(shù)據(jù)庫的組件工具 。雖然數(shù)據(jù)庫操作框架根據(jù)不同的開發(fā)語言而有所不同 , 但是它們所要解決的問題是相同的 , 即建立連接、斷開連接、發(fā)送操作指令(一般是SQL語句)和轉(zhuǎn)換返回結(jié)果 。
對于使用Java編寫的后端應(yīng)用程序而言,比較流行的數(shù)據(jù)庫框架有JDBC、JDBC 、、JPA和 。
下面將對這5種數(shù)據(jù)庫操作框架進行介紹和對比 。
1.JDBC
JDBC(Java)是Java操作數(shù)據(jù)庫的基本工具,它為多種數(shù)據(jù)庫提供統(tǒng)一的規(guī)范和接口 。通過使用JDBC,Java應(yīng)用程序可以通過使用相同的接口操作不同的數(shù)據(jù)庫(如MySQL、等) 。但實際上,JDBC不直接與數(shù)據(jù)庫通信,它只是作為Java程序與數(shù)據(jù)庫驅(qū)動器之間的橋梁,如圖4.72所示 。
圖4.72 JDBC的工作原理
說明:數(shù)據(jù)庫驅(qū)動器是使用Java編寫的組件 , 負(fù)責(zé)與其對應(yīng)的數(shù)據(jù)庫通信 。數(shù)據(jù)庫驅(qū)動器本身是可以直接使用的,JDBC只是統(tǒng)一了多種驅(qū)動器的使用方法 。使用JDBC操作數(shù)據(jù)庫之前,需要手動指定數(shù)據(jù)庫驅(qū)動器 。
JDBC可以在任意Java程序中使用,使用JDBC操作數(shù)據(jù)庫如代碼4.44所示 。
但是 , 不推薦在后端應(yīng)用程序中使用JDBC,因為JDBC相當(dāng)原始,使用者需要編寫大量代碼以完善對數(shù)據(jù)庫的操作 , 而在后端應(yīng)用程序當(dāng)中,使用其他數(shù)據(jù)庫框架的話,則能省去很多代碼(如建立連接、斷開連接等) 。
代碼4.操作數(shù)據(jù)庫的代碼
#更新數(shù)據(jù)
set = where id=id_1

//指定MySQL數(shù)據(jù)庫驅(qū)動
Class.(“com.mysql.jdbc.”);
//建立連接
= .(
//數(shù)據(jù)庫連接地址,xxx為具體的數(shù)據(jù)庫名
“jdbc:mysql://ip:port/xxx”,
“”, //用戶名
“”); //密碼
//編寫查詢SQL語句,?為占位符 , 后續(xù)通過參數(shù)替換
= ” * fromwhere key = ?”;
= .();
//替換中的?占位符,1標(biāo)識第一個占位符
.(1, “王五”);
//執(zhí)行SQL語句
= .();
//處理查詢集合
while(.next()){
//對每條查詢結(jié)果的處理,根據(jù)字段獲取值的方法為.(“id”)
}
2.JDBC
JDBC 是針對相關(guān)框架(如 Boot、 MVC等)設(shè)計的數(shù)據(jù)庫操作框架,是JDBC的上層封裝 。通過使用JDBC,開發(fā)者不需要關(guān)心數(shù)據(jù)庫連接過程(不需要寫連接和斷開數(shù)據(jù)庫的代碼),只需要在后端應(yīng)用程序的配置文件中配置數(shù)據(jù)庫連接信息即可實現(xiàn)自動連接數(shù)據(jù)庫 。
JDBC只能在使用相關(guān)框架的后端應(yīng)用程序中使用 。JDBC 實現(xiàn)了自動連接和斷開數(shù)據(jù)庫 , 省去了JDBC中手動連接和斷開數(shù)據(jù)庫的麻煩 。
與數(shù)據(jù)庫通信方面 , JDBC 保持了SQL語句的方式,但簡化了JDBC的調(diào)用方式,如代碼4.45所示 。
代碼4. 操作數(shù)據(jù)庫的代碼
//編寫查詢SQL語句,?為占位符,后續(xù)通過參數(shù)替換
=” * fromwhere key_1 = ? and key_2 = ?”;
//執(zhí)行SQL語句
List list = .(, “王五” , “50”);
//處理查詢集合
for (int i = 0; i < list.size(); i++) {
//轉(zhuǎn)換每條結(jié)果的數(shù)據(jù)類型
Map= (Map) list.get(i);
… //處理每條結(jié)果
}
3.
是一個高度自動化的數(shù)據(jù)庫操作框架 , 是JDBC的上層封裝 。通過使用 , 數(shù)據(jù)庫中的表可以映射成Java的類,如代碼4.46所示 。開發(fā)者只需要使用這些映射的類就可以操作數(shù)據(jù)庫(自動生成SQL語句),如代碼4.47所示 。
說明:根據(jù)數(shù)據(jù)庫的表映射成的Java類被稱為(實體)模型,使用的話,需要為每個需要操作的表都建立對應(yīng)的模型 。
模型可以使用相關(guān)工具自動生成,不需要手動填寫 。
代碼4.46數(shù)據(jù)庫映射的Java類
//映射數(shù)據(jù)庫的user表,表中有id和info兩個字段
@
@Table(name=”user”)
class User {
@Id
@(=.)
@(name=”id”, =true, =false) Long id;
@(name=”info”)
info;
Long getId() {
id;
}
void setId(Long id) {
this.id = id;
}
() {
info;
}
void ( info) {
= info;
}
}
代碼4.操作數(shù)據(jù)庫的代碼
//獲取數(shù)據(jù)庫連接的,此處的有別于4.3.4小節(jié)中的
= .();
//編寫查詢HQL語句,?為占位符,后續(xù)通過參數(shù)替換
= “fromwhere key_1 = ?”;
Query query= .(hql);
query.(0, “王五”);
//獲取結(jié)果
List= query.list();
//處理查詢結(jié)果
for (int i = 0; i < list.size(); i++) {
//把每條結(jié)果轉(zhuǎn)換成對應(yīng)的Java對象,其中User為代碼4.45中定義的數(shù)據(jù)庫映射成的
Java類
User user = (User) list.get(i);
… //處理每條結(jié)果
}
可以在任意Java程序中使用 ??梢宰詣舆B接和斷開數(shù)據(jù)庫(通過XML配置文件設(shè)置) 。在與數(shù)據(jù)庫通信方面,可以根據(jù)映射關(guān)系自動生成SQL語句 。為了增加自動生成的SQL語句的靈活性,提供了HQL( Query )語句 。HQL語法與SQL類似,但功能上沒有SQL健全 。這種“自動生成SQL語句”的做法其實是為了節(jié)省學(xué)習(xí)SQL的時間oracle數(shù)據(jù)庫安裝說明oracle數(shù)據(jù)庫安裝說明,并且希望以面向?qū)ο蟮木幊趟枷胧褂脭?shù)據(jù)庫 。但是在實際編程當(dāng)中,部分操作只能通過SQL語句實現(xiàn)(不能完全脫離SQL語句),而且當(dāng)需要操作的數(shù)據(jù)表較多時,映射關(guān)系也會很復(fù)雜 。因此,目前的熱度正在慢慢減退 。
說明:類似于這種把關(guān)系型數(shù)據(jù)庫中的表映射成Java類的數(shù)據(jù)庫操作框架,被稱為ORM框架(,對象-關(guān)系映射) 。比較流行的ORM框架有、等 。
4.JPA
JPA(JavaAPI,Java持久層API)是ORM框架的統(tǒng)一規(guī)范,為多個ORM框架提供統(tǒng)一的使用接口 。使用JPA的好處是,可以自由切換ORM框架而不影響代碼 。JPA與ORM框架的關(guān)系如圖4.73所示 。需要注意的是 , 在使用JPA之前,需要指定具體ORM框架和數(shù)據(jù)庫驅(qū)動 。
圖4.73 JPA內(nèi)部結(jié)構(gòu)

10年開發(fā)經(jīng)驗程序員一文帶你把5種數(shù)據(jù)庫操作框架給直接理解透徹

文章插圖
10年開發(fā)經(jīng)驗程序員一文帶你把5種數(shù)據(jù)庫操作框架給直接理解透徹

文章插圖
5.
是一個不完全的ORM框架,是JDBC的上層封裝 。也需要把數(shù)據(jù)庫中的表映射成Java類,但是它不會根據(jù)Java對象自動生成SQL語句 。使用作為數(shù)據(jù)庫操作框架的話,開發(fā)者需要編寫SQL語句模板,會根據(jù)指定的SQL語句模板和Java對象生成對應(yīng)的SQL語句,如代碼4.48所示 。
代碼4.操作數(shù)據(jù)庫的代碼
@
{
//定義SQL模板 , 其中#{}為待替換的參數(shù)@(” * fromwhere key_1 = #{} and key_2 =
#{}”)
//定義操作函數(shù),函數(shù)被調(diào)用后,會自動把參數(shù)填充到SQL模板并執(zhí)行SQL語句,然后返回
結(jié)果 , 返回類型User為代碼4.46中定義的數(shù)據(jù)庫映射成的Java類
List (@Param(“”), @Param(“”)
);
}
//下面是調(diào)用上述查詢操作的示例
List= .(“王五”, “0”);
//處理查詢結(jié)果
for (int i = 0; i < list.size(); i++) {
//把每條結(jié)果轉(zhuǎn)換成對應(yīng)的Java對象 , 其中User為代碼4.46中定義的數(shù)據(jù)庫映射成的
Java類
User user = list.get(i);
… //處理每條結(jié)果
}
可以在任意Java程序中使用 。的出現(xiàn) , 保持了ORM框架“以面向?qū)ο缶幊趟枷胧褂脭?shù)據(jù)庫”的同時,也避免了由于全自動生成SQL語句造成的局限 。
6.數(shù)據(jù)庫操作框架的選擇
對于使用Java編寫的后端應(yīng)用程序而言,數(shù)據(jù)庫框架一般是在、JPA(或等ORM框架)和中做出選擇 。而這三類數(shù)據(jù)庫操作框架的主要區(qū)別在于SQL構(gòu)造和返回結(jié)果轉(zhuǎn)換的方式上,而這些方式本身是很難辨出孰優(yōu)孰劣的,因此 , 只需要根據(jù)團隊的使用習(xí)慣或偏好來選擇數(shù)據(jù)庫操作框架就可以了 。
7. Boot中使用數(shù)據(jù)庫框架的具體方法
這里以JDBC 為例,介紹在 Boot中使用數(shù)據(jù)庫框架的具體方法 。在 Boot中使用JDBC 需要三步,即引入JDBC 的依賴包、配置數(shù)據(jù)庫信息和在代碼中使用JDBC 操作數(shù)據(jù)庫 。
(1)引入JDBC 的依賴包 。需要在工程配置文件(build.)中添加JDBC 的依賴包,如代碼4.49所示 。
代碼4.49在build.中添加JDBC 依賴包…
{

//在中添加JDBC 的依賴包
'org..boot:-boot–jdbc'
'com.:druid:1.0.26' //數(shù)據(jù)庫連接池依賴
'mysql:mysql–java' //MySQL驅(qū)動依賴

}

添加完依賴包之后,需要同步工程配置 。JDBC 的依賴包在同步工程配置后才會被下載和引入 。在 IDEA中 , 只需要單擊“同步”按鈕即可同步工程配置,如圖4.74所示 。
圖4.74 在 IDEA中同步build.配置
(2)配置數(shù)據(jù)庫信息 。配置數(shù)據(jù)庫連接信息需要在后端應(yīng)用程序的配置文件(默認(rèn)是.)中設(shè)置,如代碼4.50所示 , 其中,連接池的具體設(shè)置需要根據(jù)實際情況而定 。
說明:頻繁地建立和斷開數(shù)據(jù)庫連接是很耗資源的,連接池的作用是避免頻繁創(chuàng)建和釋放連接引起的大量性能開銷 。
代碼4.50在配置文件中添加數(shù)據(jù)庫連接信息…
#設(shè)置數(shù)據(jù)庫連接地址 , xxx為具體的數(shù)據(jù)庫名
..jdbc-url=jdbc:mysql://ip:port/xxx
#設(shè)置用戶名
..=root
#設(shè)置密碼
..=
#指定MySQL數(shù)據(jù)庫驅(qū)動
..-class-name=com.mysql.cj.jdbc.
#設(shè)置數(shù)據(jù)庫連接池,type為指定連接池的包,max-為最大激活連接數(shù),max-idle為
最大等待連接的數(shù)量,-size為初始狀態(tài)下建立的連接數(shù)
..type=com..druid.pool.
..max-=20
..max-idle=8
..-size=10

(3)使用JDBC 操作數(shù)據(jù)庫的代碼一般在Dao層中 , 具體代碼如代碼4.51所示 。
代碼4.51通過JDBC 操作數(shù)據(jù)庫
com..demo.dao;
//引用的類
org..jdbc.core.;
… //省略其他引用的類
@(“”)
class{
//獲取對象,此對象會被自動注入
@
;
( ,){
try{
//SQL語句 , ?為占位符,后續(xù)通過參數(shù)替換
= ” INTO(?, ?)”;
//執(zhí)行SQL語句
int= .(, , );
if( > 0){
“”;
}else {
“fail”;
}
}catch( e){
“fail”;}
}
List get( key){
List= new List();
try{
//SQL語句,?為占位符,后續(xù)通過參數(shù)替換
=” * FROMWHERE key_1 = ? and key_2
= ?”;
//執(zhí)行SQL語句
= .(, “王五” , “50”);
}catch( e){
//失敗
}
;
}
}
本文給大家講解的內(nèi)容是大型網(wǎng)站架構(gòu)的技術(shù)細(xì)節(jié):后端架構(gòu)數(shù)據(jù)庫–數(shù)據(jù)庫操作框架下篇文章給大家講解的內(nèi)容是大型網(wǎng)站架構(gòu)的技術(shù)細(xì)節(jié):后端架構(gòu)數(shù)據(jù)庫-數(shù)據(jù)庫事務(wù)感謝大家的支持!
【10年開發(fā)經(jīng)驗程序員一文帶你把5種數(shù)據(jù)庫操作框架給直接理解透徹】本文到此結(jié)束,希望對大家有所幫助 。