您好,登錄后才能下訂單哦!
本系列是「深入淺出MyBatis:技術(shù)原理與實(shí)踐」書(shū)籍的總結(jié)筆記。
本篇是「深入淺出MyBatis」系列的最后一篇,主要介紹與Spring的集成,以及工作中的一些實(shí)用場(chǎng)景。
介紹之前,先整體總結(jié)下該系列的內(nèi)容和寫(xiě)作思路。
MyBatis是一個(gè)框架,封裝了數(shù)據(jù)庫(kù)相關(guān)的操作,給我們開(kāi)發(fā)人員帶來(lái)了極大地便利,相對(duì)于Hibernate,有很大的靈活性和擴(kuò)展性,在高并發(fā)高性能應(yīng)用中,這點(diǎn)很重要。
首先介紹了JDBC的規(guī)范,了解我們最原始最熟悉的操作數(shù)據(jù)庫(kù)的方式,MyBatis就是在此基礎(chǔ)上進(jìn)行封裝和抽象。
然后,介紹了MyBatis的特性和核心組件,對(duì)其有個(gè)整體了解。
之后,詳解介紹了MyBatis的配置、映射器,它們是平時(shí)使用、接觸最多的,可以很好的使用MyBatis進(jìn)行開(kāi)發(fā)了。
最后,回顧了反射和動(dòng)態(tài)代理基礎(chǔ),深入分析了MyBatis的解析和運(yùn)行原理,插件及開(kāi)發(fā)過(guò)程,一方面對(duì)MyBatis的核心組件有更深入的了解,一方面可以更好進(jìn)行插件的開(kāi)發(fā),對(duì)sql進(jìn)行統(tǒng)一處理。
實(shí)際使用中,往往會(huì)和Spring集成一起使用,可以減少我們的工作量,通過(guò)本篇的介紹,你會(huì)了解到:
了解Spring的基礎(chǔ),有助于理解集成配置,Spring技術(shù)主要由IOC和AOP兩個(gè)基礎(chǔ)功能構(gòu)成。
IOC稱(chēng)為控制反轉(zhuǎn),可以這樣理解:以前我們獲取一個(gè)類(lèi)的對(duì)象,都是去new一個(gè),必須確定實(shí)現(xiàn)類(lèi)是哪個(gè),有了IOC,所有配置為Spring管理的對(duì)象都由Spring管理,包括對(duì)象的創(chuàng)建和生命周期,這樣,去獲取類(lèi)的對(duì)象時(shí),不需要顯示指定,由Spring去決定返回哪個(gè)對(duì)象。
這樣,對(duì)象的創(chuàng)建,控制權(quán)由業(yè)務(wù)代碼轉(zhuǎn)向給了Spring,稱(chēng)為控制反轉(zhuǎn)。
AOP稱(chēng)為面向切面編程,所謂切面,是說(shuō)在正常邏輯中插入一些邏輯處理代碼,比如插入日志記錄、事務(wù)管理等代碼,其中,日志記錄和事務(wù)管理就是切面。Spring AOP可以在不修改原有方法邏輯的情況下,通過(guò)簡(jiǎn)單配置,對(duì)受影響的類(lèi)方法統(tǒng)一插入切面處理代碼。
Spring AOP是通過(guò)動(dòng)態(tài)代理實(shí)現(xiàn)的,當(dāng)Spring的服務(wù)包含接口描述時(shí),采用JDK動(dòng)態(tài)代理,否則采用CGLIB代理。
最后,簡(jiǎn)單說(shuō)明下AOP相關(guān)的概念,便于理解它的配置:
在編寫(xiě)業(yè)務(wù)代碼時(shí),一個(gè)業(yè)務(wù)方法可能涉及多張表或多條sql語(yǔ)句,同一條表數(shù)據(jù)可能會(huì)被同時(shí)訪問(wèn),數(shù)據(jù)庫(kù)的事務(wù)控制很重要,通過(guò)Spring AOP和Spring 事務(wù)管理,可以大量減少我們的代碼,對(duì)各種場(chǎng)景的事務(wù)管理也很方便。
MySql默認(rèn)隔離級(jí)別為可重復(fù)讀。
傳播行為,是指方法之間的調(diào)用,事務(wù)如何傳遞,在Spring中定義了7種傳播行為,可根據(jù)不同場(chǎng)景進(jìn)行配置,不一一介紹了,舉幾個(gè)說(shuō)明下:
Spring默認(rèn)的傳播行為為PROPAGATION_REQUIRED。
了解了Spring的IOC,進(jìn)行集成配置就比較簡(jiǎn)單了,另外,除了業(yè)務(wù)SQL的編寫(xiě),事務(wù)是很重要的一部分,Spring AOP和事務(wù)管理幫我們解決了。
MyBatis提供了和Spring無(wú)縫對(duì)接的功能,主要通過(guò)mybatis-spring-x.x.x.jar實(shí)現(xiàn),下面說(shuō)下集成配置的過(guò)程:
使用c3p0的實(shí)現(xiàn),只要實(shí)現(xiàn)javax.sql.DataSource接口都可以。
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${c3p0.driverClass}"></property>
<property name="jdbcUrl" value="${c3p0.jdbcUrl}"></property>
<property name="user" value="${c3p0.user}"></property>
<property name="password" value="${c3p0.password}"></property>
<property name="acquireIncrement" value="${c3p0.acquireIncrement}"></property>
<property name="initialPoolSize" value="${c3p0.initialPoolSize}"></property>
<property name="maxIdleTime" value="${c3p0.maxIdleTime}"></property>
<property name="maxPoolSize" value="${c3p0.maxPoolSize}"></property>
<property name="minPoolSize" value="${c3p0.minPoolSize}"></property>
</bean>
它是生成SqlSession的,組件提供了org.mybatis.spring.SqlSessionFactoryBean類(lèi)給我們?nèi)ヅ渲谩?/p>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自動(dòng)掃描entity目錄以匹配別名 -->
<property name="typeAliasesPackage" value="com.xiaomi.kfs.mcc.persistence, com.xiaomi.kfs.authority.core" />
<!-- 顯式指定Mapper文件位置 -->
<property name="mapperLocations" value="classpath*:context/mybatis/*Mapper.xml" />
<!-- 指定mybatis配置文件 -->
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
</bean>
配置文件mybatis-config.xml前面文章介紹了,就不再次寫(xiě)了。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.xiaomi.kfs.mcc.persistence,com.xiaomi.kfs.mcc.workorder, com.xiaomi.kfs.authority.core" />
<property name="annotationClass" value="com.xiaomi.common.annotation.MyBatisRepository" />
</bean>
使用Spring AOP管理事務(wù)。
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 使用annotation定義事務(wù) @Transactional -->
<tx:annotation-driven transaction-manager="transactionManager" />
實(shí)際工作中,可能有很多使用場(chǎng)景,下面會(huì)簡(jiǎn)單介紹些這些場(chǎng)景,說(shuō)明實(shí)現(xiàn)思路。
對(duì)于文件,在數(shù)據(jù)庫(kù)中,一般通過(guò)BLOB字段存儲(chǔ),MyBatis提供了BlobTypeHandler進(jìn)行類(lèi)型映射,可以把byte[]類(lèi)型和BLOB類(lèi)型自動(dòng)轉(zhuǎn)換。
但更多的時(shí)候,我們會(huì)把文件專(zhuān)門(mén)存放在一個(gè)文件服務(wù)器中,數(shù)據(jù)庫(kù)存儲(chǔ)文件路徑即可。
批量更新有助于提高數(shù)據(jù)庫(kù)性能,可以修改defaultExecutorType,設(shè)置為BATCH,這樣一個(gè)事務(wù)如果有多條sql,只有在commit后才會(huì)發(fā)送SQL到數(shù)據(jù)庫(kù)。
但要注意,如果程序上下文中,依賴插入的數(shù)據(jù)主鍵,可以通過(guò)調(diào)用sqlSession的flushStatements方法主動(dòng)將當(dāng)前緩存的sql發(fā)送給數(shù)據(jù)庫(kù)執(zhí)行。
MyBatis支持存儲(chǔ)過(guò)程,對(duì)其進(jìn)行了封裝,具體配置過(guò)程在此不做詳細(xì)介紹了。
如果系統(tǒng)數(shù)據(jù)庫(kù)比較大,可通過(guò)分表減少單表的壓力,MyBatis允許把表名作為參數(shù)傳遞到SQL中,很容易實(shí)現(xiàn)。
MyBatis具有分頁(yè)功能,通過(guò)RowBounds實(shí)現(xiàn),但它有個(gè)問(wèn)題,會(huì)在一條SQL中查詢所有的結(jié)果,再根據(jù)從第幾條到第幾條取數(shù)據(jù)返回??梢酝ㄟ^(guò)編寫(xiě)一個(gè)插件,重寫(xiě)SQL進(jìn)行分頁(yè),進(jìn)行統(tǒng)一處理。
之前文章介紹過(guò),通過(guò)自定義typeHandler可以很容易的實(shí)現(xiàn)。
后續(xù)開(kāi)始閱讀「RabbitMQ實(shí)戰(zhàn):高效部署分布式消息隊(duì)列」,并進(jìn)行總結(jié)和分享。
歡迎掃描下方二維碼,關(guān)注我的個(gè)人微信公眾號(hào) ~
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。