Spring和MyBatis整合


            *************top 1   Spring和MyBatis整合所需的包和核心類
    
    **SqlSessionFactory不需要在Spring中配置

    **如果是Spring框架和MyBatis框架整合,則必須要導入mybatis的jar包和mybatis-spring的jar包。
xwork-core.jar是在使用struts框架時使用的jar包。spring-web是在做springMVC時使用的jar包

    **在整合Spring框架和MyBatis框架時,可以利用SqlSessionFactoryBean創建SqlSessionFactory,使用MapperFactoryBean將映射接口變成可以注入的SpringBean,SqlSessionTemplate則是負責管理SqlSession的,而ContextLoaderListener是用來在web.xml里面配置Struts或SpringMVC集成Spring的


    ****Spring與Mybatis集成兩種方式:映射接口和SqlSessionTemplate

        **MyBatis-Spring的jar包由MyBatis提供。
Spring3.x發布的時候,Mybatis3.x還沒有發布,因此,mybatis想要整合Spring框架,只能由它(Mybatis)自己來提供jar包來整合

 
**Spring和MyBatis的整合可以采用MapperFactoryBean也可以采用SqlSessionTemplate等,整合時需要在applicationContext.xml里面配置數據源datasource和SqlSessionFactoryBean,其中SqlSessionFactoryBean類是由MyBatis提供

**關於數據源   
dataSource除了有BasicDataSource類型外,還有其他類型的數據源,SqlSessionFactoryBean和DataSourceTransactionManager都需要注入dataSource

**namespace屬性應該是對應接口的完整名稱,id屬性應該是對應的方法名稱

可以不用給出Dao的實現類,而由映射接口實現
MyBatis的配置文件可以寫在mybatis本身的配置文件中,也可以在Spring中指定
集成之后同樣可以使用xml配置聲明式事務
首先應該導入相應的jar包mybatis.jar  mybatis-spring.jar等
可以在Spring配置文件中配置數據源
Spring與Mybatis整合可以有多種實現方式
而且為了保證方法自動帶事務,必須指定為同一個dataSource
resultMap表示返回類型,應單獨配置,resultMap和resultType不能同時存在


            *************top 2     使用mapperLocations掃描SQL映射文件
如果在MyBatis-CongigLocation.xml逐個列出所有的sql映射文件,比較繁瑣,可以利用SqlSessionFactoryBean的mapperLocations屬性掃描式加載SQL映射文件,可以才用*作為通配符的形式,一次加載多個SQL映射文件,但是在集成時還是需要配置MyBatis-CongigLocation.xml

通過SqlSessionFactoryBean中的mapperLocations查看屬性
mapperLocations路徑不能以/打頭
必須指定configLocation,該屬性指向MyBatis配置文件

            *************top 3    使用SqlSessionTemplate實現數據庫操作

    getMapper方法實現獲取映射接口
    
    selectOne()要求查詢最多返回一行結果,如果查詢結果不只一條記錄,則會出現異常
        如果參數存在錯誤,在編譯期間無法識別,只能等到運行的時候才能發現
        如果命名空間發生改變,會導致很多地方需要修改,不易維護
        即可只傳1個參數,也可2個參數
        statement為映射項全限定名    命名空間+映射項id

    SqlSessionTemplate沒有save()方法,只有insert()


            *************top 4    使用映射接口實現數據庫操作
須遵循的原則:接口的名稱和映射命名空間必須相同,接口的方法和映射元素必須相同
    **使用SqlSessionTemplate的getMapper方法可以完成映射接口的實現
    **可以沒有DAO實現的類,這種方式不容易產生錯誤,並且在編譯期就能識別錯誤。而且命名空間發生變化,也不會導致很多地方需要修改,易於維護。

    **在使用Spring 集成MyBatis時,使用SqlSessionTemplate的getMapper()方法獲取映射接口時UserMapper接口的名稱、方法名稱、方法的參數類型都應該和映射文件里面的相關配置一致
    **在配置namespace時需要指定帶包名的完整類名,否則在啟動時會報錯


            *************top 4    通過不同方式獲得映射接口的實例
    **采用數據映射器     單個    
    (MapperFactoryBean)的方式完成對數據庫操作
根據Mapper接口獲取Mapper對象,它封裝了原有的SqlSession.getMapper()功能的實現

    ** 多個         MapperScannerConfigurer
自動掃描指定包下的Mapper接口,並將它們直接注冊為MapperFactoryBean


            *************top 5   理解事務屬性
    **REQUIRED   required表示必須運行在事務環境中,REQUIRES_NEW  requires_new表示必須運行在自己獨立的事務環境內,SUPPORTS  supports表示如果沒有事務環境,則按照非事務方式執行。默認值是REQUIRED required。
    **在自定包和類的指定方法拋出運行時異常時才會執行回滾操作,並非默認情況。
    **Spring提供了聲明式事務處理機制,它基於AOP實現,無須編寫所有的工作全在配置文件中完成

propagation:事務傳播機制
isolation:事務隔離級別
read_only:事務是否只讀
on-rollback-for:設定運行時異常時回滾

    **因為Spring事務管理方式包括編程方式、聲明式兩種,聲明式比編程式更靈活,編程式采用的方式來控制事物的邊界。聲明式采用配置xml方式,將事務管理與實際業務代碼解耦。
    **實現聲明式事務配置tx和AOP命名空間都是必須導入的。

    **安全性屬於Java的一個基本特性,並不屬於事務屬性
     事務屬性:
    一致性
    隔離性
    持久性

    ****不便於維護是    編程式事務的特點
    **業務代碼和事務分離是聲明式事務的特點
    **聲明式事務不需要修改代碼本身
    **推薦使用聲明式事務的原因是它對代碼的影響最小,更符合一個無侵入的輕量級容器的特點,而靈活性是編程式事務的特點

*******事務隔離級別5個
ISOLATION_DEFAULT是使用數據庫默認的隔離級別,而不是Spring提供的。ISOLATION_SERIALIZABLE是花費最高代價但是最可靠的事務隔離級別。事務被處理為順序執行。
ISOLATION_READ_COMMITTED可以防止臟讀取
ISOLATION_READ_UNCOMMITTED允許讀取其它並行事務還沒提交的數據
ISOLATION_REPEATABLE_READ可重復讀

************************************************************************
未提交讀取(Read Uncommitted)
Spring標識:ISOLATION_READ_UNCOMMITTED。允許臟讀取,但不允許更新丟失。如果一個事務已經開始寫數據,則另外一個事務則不允許同時進行寫操作,但允許其他事務讀此行數據。該隔離級別可以通過“排他寫鎖”實現。

已提交讀取(Read Committed)
Spring標識:ISOLATION_READ_COMMITTED。允許不可重復讀取,但不允許臟讀取。這可以通過“瞬間共享讀鎖”和“排他寫鎖”實現。讀取數據的事務允許其他事務繼續訪問該行數據,但是未提交的寫事務將會禁止其他事務訪問該行。

可重復讀取(Repeatable Read)
Spring標識:ISOLATION_REPEATABLE_READ。禁止不可重復讀取和臟讀取,但是有時可能出現幻讀數據。這可以通過“共享讀鎖”和“排他寫鎖”實現。讀取數據的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。

序列化(Serializable)
Spring標識:ISOLATION_SERIALIZABLE。提供嚴格的事務隔離。它要求事務序列化執行,事務只能一個接着一個地執行,不能並發執行。僅僅通過“行級鎖”是無法實現事務序列化的,必須通過其他機制保證新插入的數據不會被剛執行查詢操作的事務訪問到。

******************************************************************




    **事務屬性通常由事務的傳播行為、事務的隔離級別、事物的超時值、事務只讀標志組成
    **

*******************在數據庫操作過程中很可能出現以下幾種不確定情況****************************************************
更新丟失(Lost update)
兩個事務都同時更新一行數據,一個事務對數據的更新把另一個事務對數據的更新覆蓋了。比如CMS系統中,兩個同時打開一篇文章進行修改,一個人先保存,另一個人后保存,后保存的就覆蓋了先保存的那個人的內容,這就造成更新丟失。
這是因為系統沒有執行任何的鎖操作,因此並發事務並沒有被隔離開來。在並發事務處理帶來的問題中,“更新丟失”通常應該是完全避免的。但防止更新丟失,並不能單靠數據庫事務控制器來解決,需要應用程序對要更新的數據加必要的鎖來解決,因此,防止更新丟失應該是應用的責任。

臟讀(Dirty reads)
一個事務讀取到了另一個事務未提交的數據操作結果。這是相當危險的,因為很可能所有的操作都被回滾。

不可重復讀(Non-repeatable Reads)
一個事務對同一行數據重復讀取兩次,但是卻得到了不同的結果。比如事務T1讀取某一數據后,事務T2對其做了修改,當事務T1再次讀該數據時得到與前一次不同的值。又叫虛讀。

幻讀(Phantom Reads)
事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的數據或者缺少了第一次查詢中出現的數據(這里並不要求兩次查詢的SQL語句相同)。這是因為在兩次查詢過程中有另外一個事務插入數據造成的。

不可重復讀的重點是修改某個記錄字段,幻讀的重點在於新增或者刪除記錄。
對於前者, 只需要鎖住滿足條件的記錄。對於后者, 要鎖住滿足條件及其相近的記錄。

“臟讀”、“不可重復讀”和“幻讀”,其實都是數據庫讀一致性問題,必須由數據庫提供一定的事務隔離機制來解決。

*******************************************************************************
隔離級別越高,越能保證數據的完整性和一致性,但是對並發性能的影響也越大。對於多數應用程序,可以優先考慮把數據庫系統的隔離級別設為Read Committed。它能夠避免臟讀取,而且具有較好的並發性能。盡管它會導致不可重復讀、幻讀和第二類丟失更新這些並發問題,在可能出現這類問題的個別場合,可以由應用程序采用悲觀鎖或樂觀鎖來控制。

Spring中同時提供一個標識:ISOLATION_DEFAULT。表示使用后端數據庫默認的隔離級別。大多數數據庫默認的事務隔離級別是Read committed,比如Sql Server , Oracle。MySQL的默認隔離級別是Repeatable read。


***********************事務傳播機制*****************************
需配置事務管理器,如HibernateTransactionManager
需要定義事務通知,並指定一個事務管理器
需要導入tx 和aop的命名空間

<tx:advice>標簽的作用時創建事務處理通知


事務管理器對象由spring負責提供,事務傳播機制(propagation)屬性默認值是REQUIRED,表示必須存在一個事務,如果當前運行時不存在事務,則會開啟一個事務,如果當前運行時存在事務,則支持當前事務。SUPPORTS表示如果存在一個事務,則支持當前事務,如果沒有事務,則按非事務方式執行。按照題意分析,默認只有service包中的指定方法在發生運行時異常時才會進行事務回滾






            *************top 6   掌握Schema方式的事務配置
----------默認的事務管理器名稱是transactionManager
    **txMananger是事務管理器對象,但不是由Hibernate框架提供,而是spring框架提供的事務管理bean。REQUIRED是事務管理策略的默認值,表示如果存在一個事務,則支持當前事務,如果當前沒有事務,則創建一個新的事務環境來執行,而不是按照非事務方式執行。

    **Spring中<tx:advice>標簽是用來指定不同的事務性設置而不是創建一個事務

-------------聲明式事務:
基於Aop的實現
需要用到tx和aop的兩個命名空間
通過<aop:advice>將事務增強與切入點組合

    注入事務管理器transactionManager的時候就已經注入了sessionFactory,所以不用再注入sessionFactory屬性
execution(* cn.jbit.service.*.*(..)) 表示cn.jbit.service包下所有類的所有方法都應用事務規則

-------------事務通知的配置包含了<tx:advice>和<tx:attribute>以及<tx:method>三組元素,其中<tx:advice>元素中包含事務通知的ID和事務管理器的引用配置;<tx:method>元素包含目標方法名稱、事務傳播機制以及事務隔離級別等配置

------Spring提供的完整、優秀的事務處理機制
由Spring單獨實現,不依賴其他框架,也不與底層API耦合,具有低耦合的特點
提供了聲明式事務處理,它基於AOP實現,與代碼完全分離,配置即可用,減少了代碼的工作量

*dao層:數據訪問層,一般只涉及與數據相關的操作,像事務配置等,都會放在業務邏輯層中。

事務配置總是由三個組成部分,分別是DataSource,TransactionManager和代理機制這三部分           
    **Advisor是Pointcut和Advice的配置器,它包括Pointcut和Advice,是將Advice注入程序中Pointcut位置的代碼               


        ******top 7  使用注解實現聲明式事務
    
    **execution(public * com.pb.service.impl..*(..))說明要添加事務的方法必須是public的
    **timeout是設置事務執行時間,單位是秒
    **Spring支持的事務管理類型有:聲明式事務管理和編程式事務管理
    **@Transactional聲明式務的注解,可以指定事務的傳播行為和隔離級別
        **propagation屬性,可以指定事務的傳播行為
        **isolation屬性,可以指定事務的隔離級別



Spring框架的事務管理的優點
    為不同的事務API(如JTA、JDBC、hibernate、JPA、JDO)
    提供了一個不變的編程模式
    為編程事務管理提供一套簡單的API
    和Spring各種數據訪問抽象層都很好的集成
    支持聲明式事務管理和編程式事務管理

<tx:annotation-driven />用於啟動事務控制的注解支持
@Transaction(rollbackFor=Exception.class) 該注解指定,遇到異常Exception時事務回滾
@Transaction注解可以被應用於接口定義和接口方法,類定義和類的public方法上




反轉控制--依賴注入
    IoC的定義Bean的注解:
        @Component
        @Service(“userBiz”)表示定義一個id為UserBiz業務Bean
        @Repository  用於標DAO類
使用context命名空間下component-scan標簽掃描包含注解的類,完成初始化



    ******top 8  配置DBCP數據源
    **DBCP數據源依賴 Jakarta commons-pool對象池機制,支持連接池功能

    DBCP是一個依賴Apache commons-pool對象池機制的數據庫連接池
使用是需要把Apache的DBCP數據源的實現類包作為第三方依賴包引入
    org.springframework.jdbc.datasource.DrivermanagerDataSource數據源,沒有連接池的作用

DBCP 1.x數據源的配置屬性:
    maxActive:最大活動連接數,設置為負數時,沒有 限制
    maxIdle:最大空閑連接數,設置為負數時,表示沒有限制
    maxWait:最大等待時間,單位為毫秒,超過時間會拋出異常
    defaultReadOnly:設置數據源是否僅能執行只讀操作,默認值取決於JDBC驅動的缺省值


使用Spring配置數據源時,initialSize屬性是配置DBCP可選的
(必需)driverClassName是數據庫服務名username 用戶名password 密碼initialSize 初始化連接大小url 數據庫連接語句

兩個必要的jar包:
    commons-dbcp.jar
    commons-pool.jar




 


免責聲明!

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



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