************20210402_am************?
1、mybatis介紹:?
1)說明:?
a、原名ibatis,是一個基于java的持久層框架;是對jdbc的上層封裝;?
b、核心包括SQL Maps和DAO;?
c、ORM:對象關(guān)系映射;類--表、類的屬性--表的列、類的對象--表的記錄?
d、mybatis是半自動化的框架:程序員寫sql語句(更靈活)、框架自動封裝結(jié)果;?
e、hibernate是全自動化的框架:框架生成sql語句、框架自動封裝結(jié)果;?
f、sql語句可以放置在xml配置文件中(常用),也可以通過注解寫到j(luò)ava的接口類中;?
2)mybatis框架的工作流程:課件第1章第14頁;--請自行整理; --一般沒人問?
2、第一個mybatis項目:?
1)過程:?
a、創(chuàng)建maven的java項目,修改jdk版本配置;?
b、引入數(shù)據(jù)庫驅(qū)動程序依賴、mybatis相關(guān)依賴;?
c、創(chuàng)建實體類與表對應(yīng);?
d、創(chuàng)建全局配置文件mybatis.xml,里面配置數(shù)據(jù)庫連接信息、框架的配置信息;?
e、創(chuàng)建工具類MybatisUtil.java,用于獲取SqlSession對象;?
f、創(chuàng)建映射文件UserMapper.xml,里面配置各個sql語句;?
g、創(chuàng)建測試類進行測試;?
2)示例:mybatis_01_wdr項目的test01包;?
3)mybatis中兩種事務(wù)管理方式:JDBC、MANAGED; --了解?
4)mybatis中三種數(shù)據(jù)源方式:POOLED、UNPOOLED、JNDI; --了解?
************20210402_pm************?
--繼續(xù)完成第一個例子;?
************20210406_am************?
3、補充知識點:?
1)插入數(shù)據(jù)時,自動獲取數(shù)據(jù)庫生成的主鍵值;?
a、我們在插入數(shù)據(jù)時,通常不直接提供主鍵值,而是通過數(shù)據(jù)庫支持的方式來生成;?
b、mysql數(shù)據(jù)庫支持自動生成主鍵值,Oracle數(shù)據(jù)庫通過序列來生成主鍵值;?
c、我們有時候需要使用剛剛插入數(shù)據(jù)的主鍵值,就可以通過mybatis框架來獲??;?
示例:mybatis_01_wdr項目的test02包;?
2)java代碼對表中date類型列的處理:?
a、方式1:在java中使用String來對應(yīng)date類型的列;?
b、方式2:在java中使用java.util.Date來對應(yīng)date類型的列;?
示例:mybatis_01_wdr項目的test03包、test04包;?
3)java代碼對表中下劃線分隔的列名的處理:?
a、方式1:使用標簽,手動對應(yīng)類的屬性和表的列;?
b、方式2:在全局配置文件mybatis.xml中,配置來自動對應(yīng)(要求兩邊名稱要符合標準);?
c、方式3:在查詢語句中給列起別名;?
示例:mybatis_01_wdr項目的test05包;?
@補充:標簽用來映射表的列和類的屬性,主要用在兩種情況:?
a、表的列名與類的屬性名不能自動匹配時,使用本標簽進行映射;?
b、多表關(guān)聯(lián)查詢時,使用本標簽映射結(jié)果;--后面講?
4、mybatis的核心配置文件:?
1)兩種配置文件:?
a、全局配置文件:設(shè)置框架的基本信息、數(shù)據(jù)源信息等;?
b、映射文件:?
2)全局配置文件(mybatis.xml):?
a、根標簽是;?
b、有多個子標簽:?
?
?
?
?
?
?
?
?
3)映射文件(XxxMapper.xml):?
a、根標簽是;?
b、有多個子標簽:?
?
?
?
?
?
?
?
?
5、Mybatis的核心接口和類:?
1)說明:?
a、框架會針對每個數(shù)據(jù)源創(chuàng)建一個SqlSessionFactory對象;?
b、可以通過SqlSessionFactory對象來獲取多個SqlSession對象;?
c、所有針對數(shù)據(jù)庫的操作,都是通過SqlSession對象進行的;?
2)SqlSession的常用方法:?
a、T selectOne(String, Object)?
b、List selectList(String, Object)?
c、int insert(String, Object)?
d、int update(String, Object)?
e、int delete(String, Object)?
f、void commit()?
g、void rollback()?
************20210407_am************?
6、mybatis開發(fā)dao:?
1)說明:?
a、兩種方式:原始dao開發(fā)、mapper代理開發(fā);?
2)原始dao開發(fā):?
a、需要我們寫映射文件、dao接口類、dao實現(xiàn)類;?
b、示例:mybatis_01_wdr項目的test06包;?
3)mapper代理開發(fā):?
a、只需要我們寫映射文件和dao接口類,具體的dao實現(xiàn)類對象由框架動態(tài)生成;?
b、注意:在項目中,代碼實現(xiàn)會更簡單(現(xiàn)在學習過程中,需要手寫多一點代碼);?
c、要求(背下來): --可能的筆面試題?
映射文件名與接口類名必須一致;?
映射文件中的sql語句的id、參數(shù)類型、返回值類型,要與接口類中方法名稱、參數(shù)類型、返回值類型一致;?
映射文件的標簽的namespace屬性值必須是接口類的全類名;?
d、示例:mybatis_01_wdr項目的test07包;?
7、逆向工程:--了解即可?
1)說明:?
a、我們把根據(jù)模型(或者數(shù)據(jù)庫表等)生成java代碼的過程,稱為逆向工程;?
b、根據(jù)java代碼生成模型(或者表)的過程,稱為正向工程;?
c、mybatis框架可以根據(jù)表,生成實體類、映射文件、mapper接口類;--代碼比較亂,wdr說不實用?
2)mybatis的逆向工程的實現(xiàn):?
a、引入相關(guān)依賴;?
b、編寫配置文件;?
c、執(zhí)行逆向工程的那個類;?
示例:mybatis_01_wdr項目的test08包;?
************20210408_am************?
8、動態(tài)sql:?
1)說明:?
a、在針對查詢條件不確定的情況時,可以使用動態(tài)sql根據(jù)值來動態(tài)生成查詢語句;包括插入、修改也可能涉及到動態(tài)sql的使用;?
b、mybatis框架提供了各種標簽,可以實現(xiàn)動態(tài)sql的效果;支持OGNL方式;?
2)+的使用: --掌握?
a、用來生成動態(tài)的查詢語句;判斷傳入的參數(shù)是否為有效值,來決定是否生成該條件;?
3)+的使用: --了解即可?
a、用來生成動態(tài)的插入語句;可以使用標簽實現(xiàn)對代碼前后增加前綴和后綴功能;不太常用;?
4)+的使用; --暫時了解即可,將來可能會使用;?
a、用來生成動態(tài)的修改語句;?
5)標簽的使用:--暫時了解即可,將來可能會使用;?
a、用來生成in的條件;?
b、有collection屬性,取值可以有三種:array、list、map的key值;(前兩個是固定值)?
6)補充:使用mybatis框架,java代碼調(diào)用sql語句時,給sql語句傳參可以有下面兩種情況:?
a、傳入?yún)?shù)是單參數(shù);類型可以是基本類型、包裝類類型、String、數(shù)組或者List集合;?
b、傳入?yún)?shù)是多參數(shù);類型是實體類類型、Map類型;(表現(xiàn)為一個參數(shù),只是把多個值封裝到實體類對象中,或者Map集合中)?
7)標簽的使用: --了解即可?
a、標簽用于多選一的條件,需要配合、來使用;?
8)標簽的使用:--掌握?
a、sql片段,使用把多條sql語句中共同的代碼提取出來,方便維護;?
b、需要配合來引用sql片段;?
示例:mybatis_01_wdr項目的test09包;?
************20210408_pm************?
@補充:mybatis框架會對查詢結(jié)果進行自動的封裝,前提是我們需要在標簽中提供resultType屬性或者resultMap屬性;?
1)resultType屬性對應(yīng)我們的實體類類型;?
2)resultMap屬性對應(yīng)在映射文件中定義的標簽的id值;?
3)這兩個屬性二選一使用,不能同時使用;?
9、mybatis的多表關(guān)聯(lián)查詢實現(xiàn):?
1)說明:?
a、關(guān)系型數(shù)據(jù)庫中的多表之間的聯(lián)系:一對一(人口信息表--護照表)、一對多(班級表--學生表)、多對多(學生表--課程表,需要通過“選課表”實現(xiàn)關(guān)聯(lián));?
b、mybatis框架中多表之間的聯(lián)系;一對一(員工表--部門表,一個員工只屬于一個部門)、一對多(班級表--學生表)、多對多(學生表--課程表);?
2)一對一關(guān)聯(lián):--掌握?
a、概念:在查詢emp表的數(shù)據(jù)時,級聯(lián)查詢出對應(yīng)的dept表的數(shù)據(jù);(查詢一條員工信息,級聯(lián)查詢出一條該員工所在部門的信息)?
b、方式1:只創(chuàng)建一個實體類Emp,里面直接包含Dept表的列作為屬性;使用resultType屬性;?
示例:mybatis_01_wdr項目的test10包;?
c、方式2:創(chuàng)建兩個實體類Emp、Dept,Emp里面包含Dept類型的屬性;使用resultMap屬性,配合映射文件中標簽和子標簽使用;?
示例:mybatis_01_wdr項目的test11包;?
************20210409_am************?
9(續(xù))、mybatis的多表關(guān)聯(lián)查詢實現(xiàn):?
3)一對多關(guān)聯(lián):--了解即可?
a、概念:在查詢dept表的數(shù)據(jù)時,級聯(lián)查詢出對應(yīng)的emp表的數(shù)據(jù);(查詢一條部門信息,級聯(lián)查詢出該部門下多條員工的信息)?
b、實現(xiàn):創(chuàng)建兩個實體類Dept、Emp,Dept中包含Set類型的數(shù)學;使用resultMap屬性,配合映射文件中的標簽和子標簽使用;?
示例:mybatis_01_wdr項目的test12包;?
@補充:自己百度 5W+2H?
10、分頁功能: --建議掌握?
1)說明:?
a、如果查詢結(jié)果有很多條記錄,通常我們會采用分頁功能,只顯示第一頁的數(shù)據(jù);這樣可以減輕服務(wù)器壓力;?
b、mybatis框架有兩種分頁實現(xiàn):?
數(shù)據(jù)庫本身支持的分頁實現(xiàn)(mysql使用limit關(guān)鍵字,oracle數(shù)據(jù)庫使用rownum偽類和子查詢);?
mybatis框架的RowBounds插件;?
2)mysql數(shù)據(jù)庫的limit方式:--建議使用的方式?
a、通常需要兩條sql語句:查詢共有多少條記錄、查詢指定頁數(shù)據(jù);?
b、可以提供一個Pager類,專門存儲分頁相關(guān)信息;(不是必須的)?
示例:mybatis_01_wdr項目的test13包;?
3)mybatis框架的RowBounds插件方式:?
a、RowBounds插件是框架自帶的api,默認查詢出符合條件的最后一條記錄之前的所有記錄,然后截取指定頁的記錄來返回;?
b、缺點:性能沒有l(wèi)imit方式好;?
c、優(yōu)點:跨數(shù)據(jù)庫;?
示例:mybatis_01_wdr項目的test14包;?
11、延遲加載(Lazy Load):--了解即可?
1)說明:?
a、概念:在數(shù)據(jù)真的被使用時,才查詢數(shù)據(jù)庫把數(shù)據(jù)映射到j(luò)ava的對象中,稱為延遲加載(懶加載);?
b、在使用配合和時,才可能產(chǎn)生懶加載的效果;?
c、mybatis默認沒有開啟懶加載,需要我們手動配置(在標簽中配置);?
lazyLoadingEnabled=true?
aggressiveLazyLoading=false?
12、mybatis的緩存:--記住概念,常見的面試題?
1)說明:?
a、概念:是一種以空間換時間的設(shè)計理念;利用內(nèi)存空間資源占用來加快查詢速度;?
b、mybatis框架直接支持緩存機制,支持手動配置;?
c、mybatis中有兩種緩存:?
一級緩存:直接支持,不需要配置;?
二級緩存:需要在全局配置文件和映射文件中配置,才能開啟;需要類實現(xiàn)序列化接口;?
2)mybatis的緩存機制: --大概背一下,可能的面試題?
a、MyBatis提供了一級緩存和二級緩存?
b、一級緩存:也稱為本地緩存,用于保存用戶在一次會話過程中查詢的結(jié)果,用戶一次會話中只能使用一個sqlSession,一級緩存是自動開啟的,不允許關(guān)閉。mybatis和spring整合后進行mapper代理開發(fā),不支持一級緩存。?
c、二級緩存:也稱為全局緩存,是mapper級別的緩存,是針對一個表的查結(jié)果的存儲,可以共享給所有針對這張表的查詢的用戶。也就是說對于mapper級別的緩存不同的sqlsession是可以共享的。?
3)示例:mybatis_01_wdr項目的test15包;?
4)mybatis支持與第三方的緩存框架整合;--了解即可?