尚-mybatis視頻教程國內(nèi)首套源碼級講授視頻-課件代碼_第1頁
尚-mybatis視頻教程國內(nèi)首套源碼級講授視頻-課件代碼_第2頁
尚-mybatis視頻教程國內(nèi)首套源碼級講授視頻-課件代碼_第3頁
尚-mybatis視頻教程國內(nèi)首套源碼級講授視頻-課件代碼_第4頁
尚-mybatis視頻教程國內(nèi)首套源碼級講授視頻-課件代碼_第5頁
已閱讀5頁,還剩91頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

內(nèi)容概要一、MyBatis簡介二、MyBatis-

oWorld三、MyBatis-全局配置文件四、MyBatis-

文件五、MyBatis-動態(tài)SQL六、MyBatis-緩存機(jī)制七、MyBatis-Spring整合八、MyBatis-逆向工程九、MyBatis-工作原理十、MyBatis-

件開發(fā)MyBatis

是支持定制化

SQL、

過程以及高級的優(yōu)秀的持久層框架。MyBatis避免了幾乎所有的JDBC代碼和手動設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis可以使用簡單的XML或注解用于配置和原始

,將接口和J

ava的POJO(Plain

Old

JavaObjects,普通的Java

對象)

成數(shù)據(jù)庫中的記錄.一、MyBatis簡介MyBatis歷史原是Apache的一個開源項(xiàng)目iBatis,2010年6月這個項(xiàng)目由Apache

Software

Foundation遷移到了Code,隨著開發(fā)團(tuán)隊(duì)轉(zhuǎn)投

Code旗下,iBatis3.x正式更名為MyBatis,代碼于2013年11月遷移到

地址見后)。iBatis一詞來源于“internet”和“abatis”的組合,是一個基于J

ava的持久層框架。

iBatis提供的持久層框架包括SQL

Maps和Data

Access

Objects(DAO)為什么要使用MyBatis?MyBatis是一個半自動化的持久化層框架。JDBC–

SQL夾在J

ava代碼塊里,耦合度高導(dǎo)致硬編碼內(nèi)傷?–

不易且實(shí)際開發(fā)需求中sql是有變化,頻繁修改的情況多見Hibernate和JPA長難復(fù)雜SQL,對于Hibernate而言處理也不容易自動生產(chǎn)的SQL,不容易做特殊優(yōu)化?;谌?/p>

的全自動框架,大量字段的POJO進(jìn)行部分

時比較導(dǎo)致數(shù)據(jù)庫性能下降。對開發(fā)

而言,

sql還是需要自己優(yōu)化sql和java編碼分開,功能邊界清晰,一個專注業(yè)務(wù)、一個專注數(shù)據(jù)。去哪里找MyBatis??/mybatis/mybatis-3/MyBatis操作數(shù)據(jù)庫1、創(chuàng)建MyBatis全局配置文件MyBatis的全局配置文件包含了影響MyBatis行為甚深的設(shè)置(settings)和屬性(properties)信息、如數(shù)據(jù)庫連接池信息等。指導(dǎo)著MyBatis進(jìn)行工作。

可以參照

文件的配置示例。2、創(chuàng)建SQL

文件文件的作用就相當(dāng)于是定義Dao接口的實(shí)現(xiàn)類如何工作。這也是 使用MyBatis時編寫的最多的文件。測試1、根據(jù)全局配置文件,利用

SqlSessionFactoryBuilder創(chuàng)建SqlSessionFactory2、使用SqlSessionFactory獲取sqlSession對象。一個SqlSession對象代表和數(shù)據(jù)庫的一次會話。使用SqlSession根據(jù)方法id進(jìn)行操作oWorld-接口式編程創(chuàng)建一個Dao接口修改Mapper文件測試使用SqlSession獲取器進(jìn)行操作SqlSessionSql

Session

的實(shí)例不是線程安全的,因此是不能被共享的。Sql

Session每次使用完成后需要正確關(guān)閉,這個關(guān)閉操作是必須的Sql

Session可以直接調(diào)用方法的id進(jìn)行數(shù)據(jù)庫操作,但是到Dao接口的一般還是類,執(zhí)行使用Sql

Session獲取對象的方法,可以更安全的進(jìn)行類型檢查操作MyBatis的配置文件包含了影響MyBatis行為甚深的設(shè)置(settings)和屬性(properties)信息。文檔的頂層結(jié)構(gòu)如下:configuration配置properties屬性settings設(shè)置typeAliases類型命名typeHandlers類型處理器objectFactory對象工廠plugins插件environments環(huán)境environment環(huán)境變量transactionManager事務(wù)管理器data

Source數(shù)據(jù)源databaseIdProvider數(shù)據(jù)庫廠商標(biāo)識mappers

器三、MyBatis-全局配置文件在Eclipse中引入XML的dtd約束文件,方便編寫XML的時候有提示如果屬性在不只一個地方進(jìn)行了配置,那么MyBatis將按照下面的順序來加載:在

properties

元素體內(nèi)指定的屬性首先被

。然后根據(jù)properties元素中的resource屬性據(jù)

url屬性指定的路徑 屬性文件,并覆蓋已最后 作為方法參數(shù)傳遞的屬性,并覆蓋已類路徑下屬性文件或根的同名屬性。的同名屬性。properties屬性這是MyBatis中極為重要的調(diào)整設(shè)置,它們會改變MyBatis的運(yùn)行時行為。settings設(shè)置類型別名是為Java類型設(shè)置一個短的名字,可以方便某個類。typeAliases別名處理器類很多的情況下,可以批量設(shè)置別名這個包下的每一個類創(chuàng)建一個默認(rèn)的別名,就是簡單類名小寫。也可以使用@Alias注解為其指定一個別名值得注意的是,MyBatis已經(jīng)為許多常見的Java類型內(nèi)建了相應(yīng)的類型別名。它們都是大小寫不敏感的,

在起別名的時候千萬不要占用已有的別名。別名的類型別名的類型別名的類型_bytebytestringStringdateDate_longlongbyteBytedecimalBigDecimal_shortshortlongLongbigdecimalBigDecimal_intintshortShortobjectObject_integerintintIntegermapMap_doubledoubleintegerIntegerhashmapHashMap_floatfloatdoubleDoublelistList_booleanbooleanfloatbooleanFloatBooleanarraylistcollectionArrayListCollectioniteratorIterator無論是MyBatis在預(yù)處理語句(PreparedStatement)中設(shè)置一個參數(shù)時,還是從結(jié)果集中取出一個值時,都會用類型處理器將獲取的值以合適的方式轉(zhuǎn)換成Java類型。類型處理器Java

類型JDBC

類型BooleanTypeHandlerjava.lang.Boolean,

boolean數(shù)據(jù)庫兼容的BOOLEANByteTypeHandlerjava.lang.Byte,

byte數(shù)據(jù)庫兼容的NUMERIC

或BYTEShortTypeHandlerjava.lang.Short,

short數(shù)據(jù)庫兼容的NUMERIC

或SHORT

INTEGERIntegerTypeHandlerjava.lang.Integer,

int數(shù)據(jù)庫兼容的NUMERIC

或INTEGERLongTypeHandlerjava.lang.Long,

long數(shù)據(jù)庫兼容的NUMERIC

或LONG

INTEGERFloatTypeHandlerjava.lang.Float,

float數(shù)據(jù)庫兼容的NUMERIC

或FLOATDoubleTypeHandlerjava.lang.Double,

double數(shù)據(jù)庫兼容的NUMERIC

或DOUBLEBigDecimalTypeHandlerjava.math.BigDecimal數(shù)據(jù)庫兼容的NUMERIC

或DECIMALStringTypeHandlerjava.lang.StringCHAR,

VARCHARtypeHandlers類型處理器日期類型的處理日期和時間的處理,JDK1.8以前一直是個頭疼的問題。通常使用JSR

310規(guī)范者StephenColebourne創(chuàng)建的Joda-Time來操作。1.8已經(jīng)實(shí)現(xiàn)全部的J

SR

310規(guī)范了。日期時間處理上,可以使用MyBatis基于JSR310(

Date

andTimeAPI)編寫的各種日期時間類型處理器。MyBatis3.4以前的版本需要理器,以后的版本都是自動手動

這些處的自定義類型處理器

可以重寫類型處理器或創(chuàng)建自己的類型處理器來處理不支持的或非標(biāo)準(zhǔn)的類型。步驟:1)、實(shí)現(xiàn).apache.ibatis.type.TypeHandler接口或者繼承

.apache.ibatis.type.BaseTypeHandler2)、指定其

某個JDBC類型(可選操作)3)、在mybatis全局配置文件中插件是MyBatis提供的一個非常強(qiáng)大的機(jī)制,可以通過插件來修改MyBatis的一些

行為。插件通過動態(tài)

機(jī)制,可以介入四大對象的任何來介一個方法的執(zhí)行。后面會有專門的章節(jié)紹mybatis運(yùn)行原理以及插件Executor

(update,

query,

flushStatements,

commit,

rollback,getTransaction,

close,

isClosed)ParameterHandler

(getParameterObject,

set

Parameters)ResultSetHandler

(handleResult

Sets,

handleOutputParameters)StatementHandler

(prepare,

parameterize,

batch,

update,

query)plugins插件MyBatis可以配置多種環(huán)境,比如開發(fā)、測試和生產(chǎn)環(huán)境需要有不同的配置。每種環(huán)境使用一個environment

進(jìn)行配置并指定唯一標(biāo)識符可以通過environments

中的default屬性指定一個環(huán)境的標(biāo)識符來快速的切換環(huán)境environments環(huán)境environment-指定具體環(huán)境id:指定當(dāng)前環(huán)境的唯一標(biāo)識transactionManager、和data

Source

都必須有transactionManagertype:

JDBC

|

MANAGED

|自定義JDBC:使用了JDBC的提交和回滾設(shè)置,依賴于從數(shù)據(jù)源得到的連接來管理事務(wù)范圍。JdbcTransactionFactoryMANAGED:不提交或回滾

接、讓容器來管理事務(wù)的整個生命周期(比如JEE應(yīng)用服務(wù)器的上下文)。

ManagedTransactionFactory自定義:實(shí)現(xiàn)TransactionFactory接口,type=全類名/別名data

Sourcetype:

UNPOOLED

|

POOLED

|

JNDI

|自定義UNPOOLED:不使用連接池,UnpooledDataSourceFactoryPOOLED:使用連接池,PooledDataSourceFactoryJNDI:在EJB或應(yīng)用服務(wù)器這類容器中查找指定的數(shù)據(jù)源自定義:實(shí)現(xiàn)DataSourceFactory接口,定義數(shù)據(jù)源的獲取方式。實(shí)際開發(fā)中

使用Spring管理數(shù)據(jù)源,并進(jìn)行事務(wù)控制的配置來覆蓋上述配置MyBatis可以根據(jù)不同的數(shù)據(jù)庫廠商執(zhí)行不同的語句。Type:

DB_VENDOR–使用MyBatis提供的VendorDatabaseIdProvider解析數(shù)據(jù)庫廠商標(biāo)識。也可以實(shí)現(xiàn)DatabaseIdProvider接口來自定義。Property-name:數(shù)據(jù)庫廠商標(biāo)識Property-value:為標(biāo)識起一個別名,方便SQL語句使用

database

Id屬性databaseIdProvider環(huán)境DB_VENDOR會通過

DatabaseMetaData#getDatabaseProductName()

返回的字符串進(jìn)行設(shè)置。由于通常情況下這個字符串都非常長而且相同產(chǎn)品的不同版本會返回不同的值,所以最好通過設(shè)置屬

名來使其變短MyBatis匹配規(guī)則如下:1、如果沒有配置databaseIdProvider,那么databaseId=null2、如果配置了databaseIdProvider

,使用配置的n

ame去匹配數(shù)據(jù)庫信息,匹配上設(shè)置dat

abase

Id=配置指定的值,否則依舊為

null3、如果dat

abase

Id不為null,他只會找到配置dat

abase

Id的sql語句4、MyBatis會加載不帶database

Id

屬性和帶有匹配當(dāng)前數(shù)據(jù)庫database

Id屬性的所有語句。如果同時找到帶有database

Id和不帶database

Id的相同語句,則后者會被舍棄。mapper逐個SQL文件或者使用批量這種方式要求SQL:文件名必須和接口名相同并且在同一下mapper

文件指導(dǎo)著MyBatis如何進(jìn)行數(shù)據(jù)庫增刪改查,有著非常重要的意義;cache

–命名空間的二級緩存配置cache-

ref

名空間緩存配置的

。resultMap

–自定義結(jié)果集parameterMap–已廢棄!老式風(fēng)格的參數(shù)sql

–抽取可重用語句塊。insert

–update

–delete

–select

–語句更新語句刪除語句查詢語句四、MyBatis-

文件insert、update、delete元素主鍵生成方式若數(shù)據(jù)庫支持自動生成主鍵的字段(比如MySQL和SQL

Server),則可以設(shè)置

useGeneratedKeys=”true”,然后再把

keyProperty

設(shè)置到目標(biāo)屬性上。主鍵生成方式而對于不支持自增型主鍵的數(shù)據(jù)庫(例如Oracle),則可以使用selectKey

子元素:selectKey元素將會首先運(yùn)行,id

會被設(shè)置,然后

語句會被調(diào)用selectKey參數(shù)(Parameters)傳遞單個參數(shù)可以接受基本類型,對象類型,集合類型的值。這種情況MyBatis可直接使用這個參數(shù),不需要經(jīng)過任何處理。多個參數(shù)任意多個參數(shù),都會被MyBatis重新包裝成一個Map傳入。Map的key是param1,param2,0,1…,值就是參數(shù)的值。命名參數(shù)為參數(shù)使用@

Param起一個名字,MyBatis就會將這些參數(shù)封裝進(jìn)m

ap中,key就是

自己指定的名字POJO當(dāng)這些參數(shù)屬于

業(yè)務(wù)POJO時,

直接傳遞POJOMap也可以封裝多個參數(shù)為map,直接傳遞參數(shù)處理參數(shù)也可以指定一個特殊的數(shù)據(jù)類型:–javaType通??梢詮膮?shù)對象中來去確定如果null被當(dāng)作值來傳遞,對于所有可能為空的列,

jdbcType需要被設(shè)置對于數(shù)值類型,還可以設(shè)置小數(shù)點(diǎn)后保留的位數(shù):mode屬性允許指定IN,OUT或INOUT參數(shù)。如果參數(shù)為OUT或INOUT,參數(shù)對象屬性的真實(shí)值將會被改變,就像在獲取輸出參數(shù)時所期望的那樣。參數(shù)位置支持的屬性–javaType、jdbcType、mode、numericScale、resultMap、typeHandler、jdbcTypeName、expression實(shí)際上通常被設(shè)置的是:可能為空的列名指定jdbcType#{key}:獲取參數(shù)的值,預(yù)編譯到SQL中。安全。${key}:獲取參數(shù)的值,拼接到SQL中。有SQL注入問題。ORDER

BY

${name}參數(shù)處理Select元素來定義查詢操作。Id:唯一標(biāo)識符。用來

這條語句,需要和接口的方法名一致parameterType:參數(shù)類型。可以不傳,MyBatis會根據(jù)TypeHandler自動推斷resultType:返回值類型。別名或者全類名,如果返回的是集合,定義集合中元素的類型。不能和resultMap同時使用select元素自動1、全局setting設(shè)置autoMap

Behavior默認(rèn)是PARTIAL,開啟自動的功能。唯一的要求是列名和javaBean屬性名一致如果autoMap

Behavior設(shè)置為null則會取消自動數(shù)據(jù)庫字段命名規(guī)范,POJO屬性符合駝峰命名法,如A_COLUMN→aColumn, 可以開啟自動駝峰命名規(guī)則 功能,mapUnderscoreToCamelCase=true。2、自定義resultMap,實(shí)現(xiàn)高級結(jié)果集

。resultMapconstructor-類在實(shí)例化時,用來注入結(jié)果到構(gòu)造方法中idArg-ID參數(shù);標(biāo)記結(jié)果作為

ID可以幫助提高整體效能arg-注入到構(gòu)造方法的一個普通結(jié)果id

–一個ID結(jié)果;標(biāo)記結(jié)果作為ID可以幫助提高整體效能result

–注入到字段或J

ava

Bean屬性的普通結(jié)果association

–一個復(fù)雜的類型關(guān)聯(lián);許多結(jié)果將包成這種類型嵌入結(jié)果

結(jié)果

自身的關(guān)聯(lián),或者參考一個collection

–復(fù)雜類型的集嵌入結(jié)果

結(jié)果

自身的集,或者參考一個discriminator–使用結(jié)果值來決定使用哪個結(jié)果c

a

se–基于某些值的結(jié)果嵌入結(jié)果 –

這種情形結(jié)果也素,或者它可以參照一個外部的結(jié)果它本身,因此可以包含很多相同的元?id

&resultid

result 一個單獨(dú)列的值到簡單數(shù)據(jù)類型(字符串,整型,雙精度浮點(diǎn)數(shù),日期等)的屬性或字段。association復(fù)雜對象POJO中的屬性可能會是一個對象

可以使用聯(lián)合查詢,并以級聯(lián)屬性的方式封裝對象。使用association定義對象的封裝規(guī)則association-嵌套結(jié)果集association-分段查詢select:調(diào)用目標(biāo)的方法查詢當(dāng)前屬性的值column:將指定列的值傳入目標(biāo)方法association-分段查詢&延遲加載開啟延遲加載和屬性按需加載舊版本的MyBatis需要額外的支持包–

asm-3.3.1.jar–

cglib-2.2.2.jarCollection-集合類型&嵌套結(jié)果集Collection-分步查詢&延遲加載擴(kuò)展-多列值封裝map傳遞分步查詢的時候通過column指定,將對應(yīng)的列的數(shù)據(jù)傳遞過去,

有時需要傳遞多列數(shù)據(jù)。使用{key1=column1,key2=column2…}的形式association或者collection

的fetchType=eager/lazy可以覆蓋全局的延遲加載策略,指定立即加載(eager)或者延遲加載(lazy)動態(tài)

SQL是MyBatis強(qiáng)大特性之一。極大的簡化

拼裝SQL的操作。動態(tài)SQL元素和使用JSTL或其他類似基于XML的文本處理器相似。MyBatis采用功能強(qiáng)大的基于OGNL的表達(dá)式來簡化操作。ifchoose

(when,

otherwise)trim

(where,

set)foreach五、MyBatis-動態(tài)SQLifchoose

(when,

otherwise)trim

(where,

set)wheresettrimforeach動態(tài)SQL的另外一個常用的必要操作是需要對一個集合進(jìn)行遍歷,通常是在構(gòu)建IN條件語句的時候。當(dāng)?shù)斜怼⒓系瓤傻鷮ο蠡蛘邤?shù)組時index是當(dāng)前迭代的次數(shù),item的值是本次迭代獲取的元素當(dāng)使用字典(或者M(jìn)

ntry對象的集合)時index是鍵,item是值bindbind元素可以從OGNL表達(dá)式中創(chuàng)建一個變量并將其綁定到上下文。比如:Multi-db

vendor

support若在mybatis配置文件中配置了databaseIdProvider,則可以使用“_databaseId”變量,這樣就可以根據(jù)不同的數(shù)據(jù)庫廠商構(gòu)建特定的語句OGNL(

Object

Graph

Navigation

Language

)對象圖導(dǎo)航語言,這是一種強(qiáng)大的表達(dá)式語言,通過它可以非常方便的來操作對象屬性。

類似于 的EL,SpEL等對象屬性:調(diào)用方法:調(diào)用靜態(tài)屬性/方法:.name.getName()@java.lang.Math@PI@java.util.UUID@randomUUID()(‘a(chǎn)dmin’).name調(diào)用構(gòu)造方法:運(yùn)算符:邏輯運(yùn)算符:new

com.atguigu.bean.+,-*,/,%in,not

in,>,>=,<,<=,==,!=類型偽屬性偽屬性對應(yīng)的Java

方法List、Set、Mapsize、isEmptyList/Set/Map.size(),List/Set/Map.isEmpty()List、SetiteratorList.iterator()、Set.iterator()Mapkeys、valuesMap.keySet()、Map.values()Iteratornext、hasNextIterator.next()、Iterator.hasNext()注意:xml中特殊符號如”,>,<等這些都需要使用轉(zhuǎn)義字符集合偽屬性:MyBatis包含一個非常強(qiáng)大的查詢緩存特性,它可以非常方便地配置和定制。緩存可以極大的提升查詢效率。MyBatis系統(tǒng)中默認(rèn)定義了兩級緩存。一級緩存和二級緩存。1、默認(rèn)情況下,只有一級緩存(SqlSession級別的緩存,也稱為本地緩存)開啟。2、二級緩存需要手動開啟和配置,他是基于namespace級別的緩存。3、為了提高擴(kuò)展性。MyBatis定義了緩存接口C

ache??梢酝ㄟ^實(shí)現(xiàn)C

ache接口來自定義二級緩存六、MyBatis-緩存機(jī)制一級緩存一級緩存(localcache),即本地緩存,作用域默認(rèn)為sql

Session。當(dāng)Session

flush或close后,該

Session中的所有Cache將被清空。本地緩存不能被關(guān)閉,但可以調(diào)用clearCache()來清空本地緩存,或者改變緩存的作用域.在mybatis3.1之后,可以配置本地緩存的作用域.在mybatis.xml中配置一級緩存演示&失效情況同一次會話期間只要查詢過的數(shù)據(jù)都會保存在當(dāng)前Sql

Session的一個Map中key:hashCode+查詢的SqlId+編寫的sql查詢語句+參數(shù)一級緩存失效的四種情況1、不同的SqlSession對應(yīng)不同的一級緩存2、同一個SqlSession但是查詢條件不同3、同一個SqlSession兩次查詢期間執(zhí)行了任何一次增刪改操作4、同一個SqlSession兩次查詢期間手動清空了緩存二級緩存二級緩存(second

level

cache),全局作用域緩存二級緩存默認(rèn)不開啟,需要手動配置MyBatis提供二級緩存的接口以及實(shí)現(xiàn),緩存實(shí)現(xiàn)要求

POJO實(shí)現(xiàn)Serializable接口二級緩存在

SqlSession

關(guān)閉或提交之后才會生效使用步驟1、全局配置文件中開啟二級緩存<setting

name="cacheEnabled"

value="true"/>文件處使用c

ache配置緩存2、需要使用二級緩存的<cache

/>3、注意:POJO需要實(shí)現(xiàn)Serializable接口緩存相關(guān)屬性eviction=“FIFO”:緩存回收策略:回收器狀態(tài)和軟

規(guī)則的對象。LRU–最近最少使用的:移除最長時間不被使用的對象。FIFO–先進(jìn)先出:按對象進(jìn)入緩存的順序來移除它們。SOFT

:移除基于WEAK–弱:更積極地移除基于收集器狀態(tài)和弱

規(guī)則的對象。默認(rèn)的是LRU。flushInterval:刷新間隔,單位毫秒默認(rèn)情況是不設(shè)置,也就是沒有刷新間隔,緩存僅僅調(diào)用語句時刷新size:

數(shù)目,正整數(shù)代表緩存最多可以

多少個對象,太大容易導(dǎo)致內(nèi)存溢出readOnly:只讀,true/falsetrue:只讀緩存;會給所有調(diào)用者返回緩存對象的相同實(shí)例。因此這些對象不能被修改。這提供了很重要的性能優(yōu)勢。false:讀寫緩存;會返回緩存對象的拷貝(通過序列化)。這會慢一些,但是安全,因此默認(rèn)是false。緩存有關(guān)設(shè)置1、全局setting的cacheEnable:配置二級緩存的開關(guān)。一級緩存一直是打開的。2、select 的use

Cache

屬性:配置這個select是否使用二級緩存。一級緩存一直是使用的3、sql

的flushCache屬性:增刪改默認(rèn)flushCache=true。sql執(zhí)行以后,會同時清空一級和二級緩存。查詢默認(rèn)flushCache=false。4、sqlSession.clearCache():只是用來清除一級緩存。5、當(dāng)在某一個作用域(一級緩存Session/二級緩存Namespaces)進(jìn)行了C/U/D操作后,默認(rèn)該作用域下所有select中的緩存將被clear。第

緩存整合Eh

Cache是一個純Java的進(jìn)程內(nèi)緩存框架,具有快速、精干等特點(diǎn),是Hibernate中默認(rèn)的CacheProvider。MyBatis定義了Cache

接口方便

進(jìn)行自定義擴(kuò)展。步驟:1、導(dǎo)入e

hcache包,以及整合包,日志包ehcache-core-2.6.8.jar、mybatis-ehcache-1.0.3.jarslf4j-api-1.6.1.jar、slf4j-log4j12-1.6.2.jar2、編寫ehcache.xml配置文件3、配置c

ache–

<cache

type="

.mybatis.caches.ehcache.EhcacheCache"></cache>參照緩存:若想在命名空間可以使用

cache-ref元素來享相同的緩存配置和實(shí)例。另外一個緩存。當(dāng)執(zhí)行一條查詢SQL時,流程為從二級緩存中進(jìn)行查詢進(jìn)入一級緩存中查詢

執(zhí)行JDBC查詢。1、查看不同MyBatis版本整合Spring時使用的適配包;2、

整合適配包

/mybatis/spring/releases3、

整合示例,jpetstore

/mybatis/jpetstore-6七、MyBatis-Spring整合MyBatis-SpringMyBatisSpring1.0.0

and

.1

to

.0

or

higher.63.0.0

or

higher1.1.0

or

higher3.1.0

orhigher3.0.0

or

higher1.3.0

or

higher3.4.0

orhigher3.0.0

or

higher整合關(guān)鍵配置<bean

id="sqlSessionFactory"

class="

.mybatis.spring.SqlSessionFactoryBean"><!--指定mybatis全局配置文件位置--><property

name="configLocation"

value="classpath:mybatis/mybatis-config.xml"></property><!--指定數(shù)據(jù)源--><property

name="dataSource"

ref="dataSource"></property><!--mapperLocations:所有sql

文件所在的位置--><property

name="mapperLocations"

value="classpath:mybatis/mapper/*.xml"></property><!--typeAliasesPackage:批量別名處理--><property

name="typeAliasesPackage"

value="com.atguigu.bean"></property></bean><!--自動的掃描所有的mapper的實(shí)現(xiàn)并加入到ioc容器中

--><bean

id="configure"

class="

.mybatis.spring.mapper.MapperScannerConfigurer"><!–basePackage:指定包下所有的mapper接口實(shí)現(xiàn)自動掃描并加入到ioc容器中--><property

name="basePackage"

value="com.atguigu.dao"></property></bean>MyBatis

Generator:簡稱MBG,是一個專門為MyBatis框架使用者定制的代碼

,可以快速的根據(jù)表生成對應(yīng)的文件,接口,以及b

ean類。支持基本的增刪改查,以及QBC風(fēng)格的條件查詢。但是表連接、過程等這些復(fù)雜sql的定義需要

手工編寫文檔地址工程地址

/mybatis/generator/releases八、MyBatis-逆向工程MBG使用使用步驟:–

1)編寫MBG的配置文件(重要幾處配置)1)jdbcConnection配置數(shù)據(jù)庫連接信息2)javaModelGenerator配置java

Bean的生成策略

3)sqlMapGenerator

配置sql 文件生成策略4)javaClientGenerator配置Mapper接口的生成策略

5)table

配置要逆向解析的數(shù)據(jù)表tableName:表名ObjectName:對應(yīng)的javaBean名生成代碼–

2)運(yùn)行代碼注意:ContextRuntime=“MyBatis3“可以生成帶條件的增刪改查Runtime=“MyBatis3Simple“可以生成基本的增刪改查如果再次生成,建議將之前生成的數(shù)據(jù)刪除,避免xml向后追加內(nèi)容出現(xiàn)的問題。<generatorConfiguration><context

id="DB2Tables"http://數(shù)據(jù)庫連接信息配置Runtime="MyBatis3"><jdbcConnection

driverClass="com.mysql.jdbc.Driver"

connectionURL="jdbc:mysql://localhost:3306/bookstore0629"

userId="root"

password="123456"></jdbcConnection>//javaBean的生成策略<javaModelGenerator

Package="com.atguigu.bean"Project=".\src"><property

name="enableSubPackages"

value="true"

/><property

name="trimStrings"

value="true"

/></javaModelGenerator>//

文件的生成策略<sqlMapGenerator

Package="mybatis.mapper"Project=".\conf"><property

name="enableSubPackages"

value="true"

/></sqlMapGenerator>//dao接口java文件的生成策略<javaClientGenerator

type="XMLMAPPER"

Package="com.atguigu.dao"Project=".\src"><property

name="enableSubPackages"

value="true"

/></javaClientGenerator>//數(shù)據(jù)表與javaBean的<tabletableName="books"

ObjectName="Book"></table></context></generatorConfiguration>MBG配置文件代碼public

static

void

main(String[]

args)

throws

Exception

{List<String>warnings

=

new

ArrayList<String>();boolean

overwrite

=

true;File

configFile

=

new

File("mbg.xml");ConfigurationParser

cp

=

new

ConfigurationParser(warnings);Configuration

config

=

cp.parseConfiguration(configFile);DefaultS

Callback

callback

=

new

DefaultS

Callback(overwrite);MyBatisGenerator

myBatisGenerator

=

new

MyBatisGenerator(config,callback,

warnings);myBatisGenerat

enerate(null);}測試查詢:QBC風(fēng)格的帶條件查詢@Testpublic

void

test01(){SqlSession

open

Session

=

build.openSession();DeptMapper

mapper

=

openSession.getMapper(DeptMapper.

class);DeptExample

example

=

new

DeptExample();//所有的條件都在example中封裝Criteria

criteria

=

example.createCriteria();//select

id,

dept

Name,

locAdd

from

tbl_dept

WHERE//(dept

Name

like?and

id>?)

criteria.andDeptnameLike("%部%");criteria.andIdGreaterThan(2);List<Dept>

list

=

mapper.selectByExample(example);for

(Dept

dept

:

list)

{System.out.println(dept);}}九、MyBatis-工作原理MyBatis在四大對象的創(chuàng)建過程中,都會有插件進(jìn)行介入。插件可以利用動態(tài)

機(jī)制一層層的包裝目標(biāo)對象,而實(shí)現(xiàn)在目標(biāo)對象執(zhí)行目標(biāo)方法之前進(jìn)行的效果。MyBatis

允許在已

語句執(zhí)行過程中的某一點(diǎn)進(jìn)行調(diào)用。默認(rèn)情況下,MyBatis

允許使用插件來

的方法調(diào)用包括:Executor

(update,

query,

flushStatements,

commit,

rollback,getTransaction,

close,

isClosed)ParameterHandler

(getParameterObject,

set

Parameters)ResultSetHandler

(handleResultSets,

handleOutputParameters)StatementHandler

(prepare,

parameterize,

batch,

update,

query)十、MyBatis-插件開發(fā)插件開發(fā)插件開發(fā)步驟–1)、編寫插件實(shí)現(xiàn)Interceptor接口,并使用@Intercepts注解完成插件簽名–2)、在全局配置文件中插件插件原理1)、按照插件注解,按照插件配置順序調(diào)用插件plugin方法,生成被

對象的動態(tài)2)、多個插件依次生成目標(biāo)對象的

對象,層層,先聲明的先

;形成

鏈3)、目標(biāo)方法執(zhí)行時依次從外到內(nèi)執(zhí)行插件的intercept方法。4)、多個插件情況下,

往往需要在某個插件中分離出目標(biāo)對象??梢越柚鶰yBatis提供的SystemMetaObject

類來進(jìn)行獲取最后一層的h以及

屬性的值Interceptor接口目標(biāo)方法執(zhí)行Intercept:plugin:生成動態(tài)

對象,可以使用MyBatis提供的Plugin類的wrap方法setProperties:注入插件配置時設(shè)置的屬性//1、分離

對象。由于會形成多次

,所以需要通過一個while

循環(huán)分離出最終被

對象,從而方便提取信息);MetaObject

metaObject

=

SystemMetaObject.forObject(while

(metaObject.hasGetter("h")){Object

h

=

metaObject.getValue("h");metaObject

=

SystemMetaObject.forObject(h);}//2、獲取到

對象中包含的被Object

obj

=

metaObject.getValue("的真實(shí)對象");//3、獲取被

對象的MetaObject方便進(jìn)行信息提取MetaObject

forObject

=

SystemMetaObject.forObject(obj);常用代碼:從鏈中分離真實(shí)被對象1)、Page

Helper插件進(jìn)行分頁2)、批量操作3)、

過程4)、typeHandler處理枚舉擴(kuò)展:MyBatis實(shí)用場景Page

Helper插件進(jìn)行分頁分頁P(yáng)age

Helper是MyBatis中非常方便的第插件。文檔:

/pagehelper/Mybatis-PageHelper/blob/master/README

zh.md可以對照

文檔的說明,快速的使用插件使用步驟1、導(dǎo)入相關(guān)包pagehelper-

.jar

jsqlparser-

0.9.5.jar。2、在MyBatis全局配置文件中配置分頁插件。3、使用PageHel

per提供的方法進(jìn)行分頁4、可以使用更強(qiáng)大的PageInfo封裝返回結(jié)果批量操作默認(rèn)的

openSession()方法沒有參數(shù),它會創(chuàng)建有如下特性的會開啟一個事務(wù)(也就是不自動提交)連接對象會從由活動環(huán)境配置的數(shù)據(jù)源實(shí)例得到。事務(wù)

級別將會使用驅(qū)動或數(shù)據(jù)源的默認(rèn)設(shè)置。預(yù)處理語句不會被復(fù)用,也不會批量處理更新。open

Session方法的ExecutorType

類型的參數(shù),枚舉類型:ExecutorType.SIMPLE:這個執(zhí)行器類型不做特殊的事情(這是默認(rèn)裝配的)。它為每個語句的執(zhí)行創(chuàng)建一個新的預(yù)處理語句。ExecutorType.REUSE:這個執(zhí)行器類型會復(fù)用預(yù)處理語句。ExecutorType.BATCH:這個執(zhí)行器會批量執(zhí)行所有更新語句批量操作是使用MyBatis提供的BatchExecutor進(jìn)行的,他的底層就是通過jdbc攢sql的方式進(jìn)行的。 可以讓他攢夠一定數(shù)量后發(fā)給數(shù)據(jù)庫一次。public

void

test01()

{Sql

Session

open

Session

=

build.openSession(ExecutorType.BATCH);UserDao

mapper

=

openSession.getMapper(UserDao.

class);long

start

=

System.currentTimeMillis();for

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論