新聞中心
依賴注入與數(shù)據(jù)庫(kù):相互依存的關(guān)系

創(chuàng)新互聯(lián)公司是一家專注于網(wǎng)站制作、做網(wǎng)站與策劃設(shè)計(jì),宜春網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:宜春等地區(qū)。宜春做網(wǎng)站價(jià)格咨詢:18982081108
依賴注入(Dependency Injection,DI)和數(shù)據(jù)庫(kù)是現(xiàn)代軟件開發(fā)的兩個(gè)核心概念。它們相互依存,DI可以使用數(shù)據(jù)庫(kù)的數(shù)據(jù),而數(shù)據(jù)庫(kù)也可以通過(guò)DI來(lái)完成許多任務(wù)。本文將探討依賴注入和數(shù)據(jù)庫(kù)之間的關(guān)系,并介紹一個(gè)基于DI的數(shù)據(jù)庫(kù)訪問(wèn)框架的實(shí)現(xiàn)。
什么是依賴注入?
在軟件開發(fā)中,依賴是指一個(gè)對(duì)象與另一個(gè)對(duì)象之間的聯(lián)系。假設(shè)我們有一個(gè)擁有幾個(gè)方法的類A,這些方法需要使用類B和類C的實(shí)例。我們可以把類A稱作B和C的依賴。但問(wèn)題是,我們必須在類A中創(chuàng)建B和C的實(shí)例,這使得A的代碼變得混亂,難以維護(hù)。依賴注入(DI)解決了這個(gè)問(wèn)題。在DI中,我們把類A依賴的接露給外部,讓外部創(chuàng)建一個(gè)實(shí)現(xiàn)這個(gè)接口的類的實(shí)例,然后把它注入到A的構(gòu)造函數(shù)或?qū)傩灾?。這使得A的代碼變得簡(jiǎn)潔易讀,并且可以更好地維護(hù)。
如何使用依賴注入與數(shù)據(jù)庫(kù)交互?
數(shù)據(jù)庫(kù)是現(xiàn)代應(yīng)用程序中最核心的組成部分之一。我們必須從應(yīng)用程序中讀取數(shù)據(jù),把數(shù)據(jù)寫回?cái)?shù)據(jù)庫(kù)。面向?qū)ο缶幊陶Z(yǔ)言例如Java、C#和Python提供了一些API來(lái)訪問(wèn)數(shù)據(jù)庫(kù),但在實(shí)際使用過(guò)程中,我們需要將通用的CRUD操作封裝到類中,使得我們可以輕松地使用它們。
為了與數(shù)據(jù)庫(kù)交互,我們需要一個(gè)框架提供數(shù)據(jù)訪問(wèn)對(duì)象(Data Access Object,DAO)和ORM對(duì)象關(guān)系映射(Object-Relational Mapping,ORM)的實(shí)現(xiàn)。這個(gè)框架應(yīng)該是基于依賴注入的,這樣我們就可以注入我們的數(shù)據(jù)訪問(wèn)對(duì)象或ORM對(duì)象來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。
例如,我們假設(shè)我們有一個(gè)類UserDAO,它使用一個(gè)數(shù)據(jù)庫(kù)連接(Connection對(duì)象)并封裝了許多用于執(zhí)行SQL查詢和修改的方法。我們可以通過(guò)依賴注入為UserDAO注入這個(gè)Connection對(duì)象。例如,我們可以使用Spring Framework來(lái)注入連接對(duì)象:
“`java
@Repository
public class UserDAO {
private final Connection connection;
@Autowired
public UserDAO(Connection connection) {
this.connection = connection;
}
public List getUsers() {
// execute SQL query and return list of User objects
}
// other methods…
}
“`
其中,@Autowired注解告訴Spring Framework自動(dòng)注入Connection對(duì)象。我們還可以使用Spring的JdbcTemplate來(lái)執(zhí)行SQL操作。
ORM對(duì)象關(guān)系映射
ORM對(duì)象關(guān)系映射是一個(gè)針對(duì)關(guān)系型數(shù)據(jù)庫(kù)的中間層,它充當(dāng)對(duì)象與數(shù)據(jù)庫(kù)之間的映射工具。ORM負(fù)責(zé)將數(shù)據(jù)庫(kù)中的數(shù)據(jù)轉(zhuǎn)化為Java或C#對(duì)象,以及將這些對(duì)象轉(zhuǎn)化為SQL查詢語(yǔ)句。很多ORM框架,例如Hibernate和Entity Framework,基于依賴注入,這意味著我們可以注入ORM來(lái)使用它們。
ORM框架可以訪問(wèn)數(shù)據(jù)庫(kù)中的數(shù)據(jù),并將數(shù)據(jù)轉(zhuǎn)化為對(duì)象,這些操作通常通過(guò)使用注解或XML文件進(jìn)行配置。例如,我們可以使用Hibernate來(lái)映射一個(gè)User類到一個(gè)數(shù)據(jù)庫(kù)表:
“`java
@Entity
@Table(name = “users”)
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = “name”)
private String name;
@Column(name = “age”)
private int age;
// getters and setters
}
“`
其中,@Entity和@Table注解指定User類對(duì)應(yīng)的數(shù)據(jù)庫(kù)表名。@Id注解指定了對(duì)象的ID屬性,它將在數(shù)據(jù)庫(kù)中自動(dòng)生成并映射到主鍵列。@Column注解指定了name屬性對(duì)應(yīng)的列名。
接下來(lái),我們可以為User類創(chuàng)建一個(gè)DAO對(duì)象,使用ORM框架與數(shù)據(jù)庫(kù)進(jìn)行交互:
“`java
@Repository
public class UserDAO {
@Autowired
private SessionFactory sessionFactory;
public List getUsers() {
Session session = sessionFactory.getCurrentSession();
CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder();
CriteriaQuery query = criteriaBuilder.createQuery(User.class);
Root root = query.from(User.class);
query.select(root);
Query q = session.createQuery(query);
return q.getResultList();
}
// other methods…
}
“`
其中,我們使用了Hibernate的SessionFactory對(duì)象來(lái)創(chuàng)建Session對(duì)象,并使用它執(zhí)行SQL查詢。
結(jié)論
相關(guān)問(wèn)題拓展閱讀:
- spring事物管理是怎么實(shí)現(xiàn)的
spring事物管理是怎么實(shí)現(xiàn)的
Spring框架簡(jiǎn)介
Spring框架是一個(gè)2023年2月才出現(xiàn)的開源項(xiàng)目,該開源項(xiàng)目起源自Rod Johnson在2023年末出版的《Expert One-on-One J2EE Design and Development》一書中的基礎(chǔ)性代碼。在該書中,Rod Johnson倡導(dǎo)J2EE實(shí)用主義的設(shè)計(jì)思想,而Spring框架正是這一思想的更全面和具體的實(shí)現(xiàn)。Spring框架由一個(gè)容器,一個(gè)配置和組織組件 的框架,和一組內(nèi)置的為事務(wù)、持久化和Web用戶接口提供的服務(wù)組成。作為一種輕量級(jí)的J2EE框架,Spring提供了一種有效的方式來(lái)建立和組織 J2EE應(yīng)用程序。
Spring特性
IoC(Inversion of Control;控制反轉(zhuǎn));又稱DI(Dependency Injection;依賴注入);是面向?qū)ο箢I(lǐng)域新興的編程思想;也是Spring的精髓所在。簡(jiǎn)單地說(shuō);IoC就是指程序之間的關(guān)系由容器來(lái)控制;而不 是傳統(tǒng)實(shí)現(xiàn)中由程序代碼直接操控。這也就是所謂“控制反轉(zhuǎn)”的概念所在:控制權(quán)由應(yīng)用代碼轉(zhuǎn)到外部容器,控制權(quán)的轉(zhuǎn)移,也就是所謂的反轉(zhuǎn)。IoC將控制創(chuàng) 建的職責(zé)搬進(jìn)了框架中;并把它從應(yīng)用代碼脫離開來(lái)。當(dāng)使用Spring的IoC容器時(shí)只需指出組件需要的對(duì)象,在運(yùn)行時(shí)Spring的IoC容器會(huì)根據(jù) XML配置數(shù)據(jù)提供給它。
Spring IoC,借助于依賴注入設(shè)計(jì)模式,使得開發(fā)者不用理會(huì)對(duì)象自身的生命周期及其關(guān)系,而且能夠改善開發(fā)者對(duì)模式的使用。對(duì)于一個(gè)顫猜森對(duì)象的管理不是什么困難,難 就難在對(duì)整個(gè)對(duì)象群的管理。依賴注入可以讓容器管理對(duì)象,即“Don’t call me, I will call you”。這樣對(duì)象本身的生命周期以及對(duì)象之間的關(guān)系就不再讓開發(fā)者費(fèi)神了。
Spring AOP,借助于Spring實(shí)現(xiàn)攔截器,開發(fā)者能夠?qū)崿F(xiàn)以聲名方式使用企業(yè)級(jí)服務(wù),比如安全、事務(wù)服務(wù)。AOP 合理的補(bǔ)充了OOP,借助于Spring AOP,開發(fā)者能夠高效的使用J2EE服務(wù)。
Spring服務(wù)抽象,借助于各種J2EE API抽象,使得開發(fā)者能夠一致地使用J2EE 技術(shù),而不管具體是使用什么J2EE API,借助于Spring服務(wù)抽象,使代碼大大減少,滿足“更少代碼,更少BUG”的軟件設(shè)計(jì)原則。
Spring IoC+Spring AOP+Spring服務(wù)抽象,一起形成Spring,這樣茄畝一個(gè)有機(jī)體,使構(gòu)建輕量級(jí)J2EE成為可能。
Spring事務(wù)管理
Spring事務(wù)管理可以分為兩類:編程式的和聲明式的。編程式的,比較靈活,但是代碼量大,存在重復(fù)的兆碧代碼比較多;聲明式的比編程式的更靈活方便。
1.傳統(tǒng)使用JDBC的事務(wù)管理
以往使用JDBC進(jìn)行數(shù)據(jù)操作,使用DataSource,從數(shù)據(jù)源中得到Connection,我們知道數(shù)據(jù)源是線程安全的,而連接不是線程安全 的,所以對(duì)每個(gè)請(qǐng)求都是從數(shù)據(jù)源中重新取出一個(gè)連接。一般的數(shù)據(jù)源由容器進(jìn)行管理,包括連接池。例如TOMCAT,WEBSPHERE,WEBLOGIC 等這些J2EE商業(yè)容器都提供了這個(gè)功能。
以往的我們使用JDBC在寫代碼時(shí),事務(wù)管理可能會(huì)是這樣:
Connection conn = null;
try{
conn = DBConnectionFactory.getConnection;
conn.setAutoCommit(false);
//do something
conn.commit(); //commit transcation
}catch(Exception e)
finally catch(SQLException se){ //do sth.}
//close ResultSet,PreparedStatement,Connection
//notice:Maybe ocurr Exception when u close rs,pstmt,conn
}
按照以往的思路來(lái)寫代碼,代碼量比較長(zhǎng),而且容易疏忽,忘掉一些try/catch,引發(fā)一些異常無(wú)法catch,雖然有時(shí)候我們會(huì)寫Dool類,來(lái)關(guān)閉這些資源,并且保證在關(guān)閉這些資源時(shí),不向外拋異常,但是這樣做會(huì)導(dǎo)致額外的麻煩。
2.Spring事務(wù)管理提供的編程式
Spring提供了幾個(gè)關(guān)于事務(wù)處理的類:
TransactionDefinition //事務(wù)屬性定義
TranscationStatus //代表了當(dāng)前的事務(wù),可以提交
Spring+Hibernate的實(shí)質(zhì):
就是把Hibernate用到的數(shù)據(jù)源Datasource,Hibernate的SessionFactory實(shí)例,事務(wù)管理器HibernateTransactionManager,都交給Spring管理。
那么再?zèng)]整合之前Hibernate是如何實(shí)現(xiàn)事務(wù)管理的呢?
通過(guò)ServletFilter實(shí)現(xiàn)數(shù)據(jù)庫(kù)事務(wù)的管理,這樣就避免了在數(shù)據(jù)庫(kù)操作中每次都要進(jìn)行數(shù)據(jù)庫(kù)事務(wù)處理。
一.事務(wù)的4個(gè)特性:
原子性:一個(gè)事務(wù)中所有對(duì)數(shù)據(jù)庫(kù)的操作是一個(gè)不可分割的操作序列,要么全做,要么全部做。
一致性:數(shù)據(jù)不會(huì)因?yàn)槭聞?wù)的執(zhí)行而遭到破壞。
隔離性:一個(gè)事務(wù)的執(zhí)行,不受其他事務(wù)(進(jìn)程)的干擾。既并發(fā)執(zhí)行的個(gè)事務(wù)之間互不干擾。
持久性:一個(gè)事務(wù)一旦提交,它對(duì)數(shù)據(jù)庫(kù)的改變將是永久的。
二.事務(wù)的實(shí)現(xiàn)方式:
實(shí)現(xiàn)方式共有兩種:編碼方式;聲明式事務(wù)管理方式。
基于AOP技術(shù)實(shí)現(xiàn)的聲明式事務(wù)管理,實(shí)質(zhì)就是:在方法執(zhí)行前后進(jìn)行攔截,然后在目標(biāo)方法開始之前創(chuàng)建并加入事務(wù),執(zhí)行完目標(biāo)方法后根據(jù)執(zhí)行情況提交或回滾事務(wù)。
聲明式事務(wù)管理又有兩種方式:基于XML配置文件的方式;另一個(gè)是在業(yè)務(wù)方法上進(jìn)行@Transactional注解,將事務(wù)規(guī)則應(yīng)用到業(yè)務(wù)邏輯中。
三.創(chuàng)建事務(wù)的時(shí)機(jī):
是否需要?jiǎng)?chuàng)建事務(wù),是由事務(wù)傳播行為控制的。讀數(shù)據(jù)不需要或只為其指定只讀事務(wù),而數(shù)據(jù)的插入,修改,刪除就需要事務(wù)管理了。
一種常見(jiàn)的事務(wù)管理配置:事務(wù)攔截器TransactionInterceptor和事務(wù)自動(dòng)代理BeanNameAutoProxyCreator相結(jié)合的方式
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED
adminService
columnsService
newsService
crawlService
memberLevelService
memberService
categoryService
merService
cartService
ordersService
trafficService
true
transactionInterceptor
關(guān)于依賴注入 數(shù)據(jù)庫(kù)的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都網(wǎng)站營(yíng)銷推廣找創(chuàng)新互聯(lián),全國(guó)分站站群網(wǎng)站搭建更好做SEO營(yíng)銷。
創(chuàng)新互聯(lián)(www.cdcxhl.com)四川成都IDC基礎(chǔ)服務(wù)商,價(jià)格厚道。提供成都服務(wù)器托管租用、綿陽(yáng)服務(wù)器租用托管、重慶服務(wù)器托管租用、貴陽(yáng)服務(wù)器機(jī)房服務(wù)器托管租用。
本文標(biāo)題:探討依賴注入與數(shù)據(jù)庫(kù)的關(guān)系 (依賴注入 數(shù)據(jù)庫(kù))
本文URL:http://www.5511xx.com/article/dhjijdh.html


咨詢
建站咨詢
