




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 教師健康與職業(yè)心理保障計劃
- 如何提升主管工作總結(jié)的執(zhí)行能力計劃
- 2024年5月份《陳情表》在文化遺產(chǎn)數(shù)字化保護(hù)中的技術(shù)實(shí)現(xiàn)路徑
- 2024年人力資源管理師備考經(jīng)驗(yàn)分享試題及答案
- 部編版道德與法治七年級下冊8.1憧憬美好集體 教學(xué)設(shè)計
- 2025年份一月復(fù)式住宅鋼架樓梯防滑條安裝責(zé)任條款
- 2024監(jiān)理工程師橫向比較試題及答案
- 投資咨詢的有效溝通試題與答案
- 黑龍江民族職業(yè)學(xué)院《藥物合成反應(yīng)B》2023-2024學(xué)年第一學(xué)期期末試卷
- 黑龍江省伊春市湯旺河區(qū)2025年三年級數(shù)學(xué)第二學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測試題含解析
- 大學(xué)生網(wǎng)絡(luò)安全與道德規(guī)范管理指南
- 2025屆泉州市高三語文三檢作文題目解析及相關(guān)范文:光靠理性還不足以解決我們社會生活的問題
- 第16課《大家排好隊(duì)》名師課件
- 湖北咸寧咸安區(qū)招引碩士、博士研究生人才41人高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 2024江西撫州市市屬國有企業(yè)招聘員工入闈人員筆試參考題庫附帶答案詳解
- T-CWEC 37-2023 著生藻類監(jiān)測技術(shù)規(guī)范
- 1、工貿(mào)行業(yè)重大事故隱患重點(diǎn)排查事項(xiàng)清單
- 2025年紀(jì)檢工作要點(diǎn)
- 醫(yī)院工程材料采購合同范本
- DB11-T 1526-2018 地下連續(xù)墻施工技術(shù)規(guī)程
- 金屬冶煉中的鈹冶煉與鈹合金生產(chǎn)
評論
0/150
提交評論