mybatis_day01_standard_第1頁
mybatis_day01_standard_第2頁
mybatis_day01_standard_第3頁
mybatis_day01_standard_第4頁
mybatis_day01_standard_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Day01 mybatis的入門Day01 課程安排(知識(shí)點(diǎn)多、重要)1、 原生jdbc開發(fā)程序的問題總結(jié)2、 Mybatis的介紹以及框架原理3、 Mybatis的入門程序(簡(jiǎn)單的crud)4、 Mybatis兩種dao的開發(fā)方式5、 Mybatis的全局配置文件的講解(SqlMapConfig.xml)1 原生jdbc開發(fā)程序的問題總結(jié)1.1 開發(fā)環(huán)境Eclipse4.2 + jdk1.7 + mysql5.11.2 執(zhí)行sql腳本為了大家的開發(fā)方便,我已經(jīng)相關(guān)的腳本寫好,只要大家執(zhí)行腳本就可獲取測(cè)試數(shù)據(jù)1.3 需要的jar包只需要mysql的驅(qū)動(dòng)包即可1.4 程序代碼1.5 問題總結(jié)1、

2、 每執(zhí)行一次程序都需要去獲取connection,而且使用完之后再釋放在資源,從而導(dǎo)致頻繁的訪問數(shù)據(jù)庫,這樣會(huì)降低數(shù)據(jù)庫的性能2、 不易維護(hù)性(硬編碼,也就是程序中的一些變量都用了固定值來代替)u sql硬編碼,如果客戶的需求更改,我們還需要通過修改原代碼來實(shí)現(xiàn),然后再次編譯并部署上線u 查詢列硬編碼,如果客戶的需求,如商品的展示的列表中可能會(huì)包括其他的商品信息,還是得修改源碼u 參數(shù)的硬編碼,如果查詢條件發(fā)生改變,還是需要修改源碼3、結(jié)果集處理比較麻煩4、解決方案u connection連接我們可以通過連接池來實(shí)現(xiàn)(c3p0)u 我們希望將返回的結(jié)果集封裝成指定的pojo對(duì)象、集合或者其他類

3、型(ORM-mybatis)u 不易維護(hù)性上我們看出都是sql的問題,那么好如果我們不在源碼中硬編碼我們的sql是不是就可以呢?這樣mybatis的這樣的一個(gè)框架就出現(xiàn)了,它可以解決這樣的問題,它是將sql配置到xml文件中,不用再將sql硬編碼到源碼中。2 Mybatis的介紹及原理2.1 Mybatis的介紹Mybatis是一個(gè)持久層框架,它前身由Apache管理的一個(gè)頂級(jí)項(xiàng)目叫ibatis,但是在2010年后該項(xiàng)目交給Google code管理,并在2013年遷移到github上。Mybatis的前身就是ibatis,并在該基礎(chǔ)上做了一些封裝及優(yōu)化。比如通過mapper代理的方式開發(fā)da

4、o就是ibatis不能實(shí)現(xiàn)的;還比如mybatis可使用ognl的方式傳遞參數(shù)等。Mybatis的特點(diǎn)是將程序員更多的關(guān)注sql本身,當(dāng)然也要求對(duì)sql有一定的基礎(chǔ),mybatis的配置文件可以靈活的配置sql以滿足需求,而且在需求多變的情況下我們只要修改配置文件即可。而且mybatis將jdbc中的preparestatement傳遞的參數(shù)作為輸入映射,并將查詢到的結(jié)果作為輸出映射,并且可以映射到指定的Java對(duì)象中。2.2 Hibernate框架回顧2.3 Mybatis的架構(gòu)3 Mybatis的入門程序3.1 需求1、 根據(jù)用戶的id查詢用戶信息2、 根據(jù)用戶的姓名查詢用戶信息3、 添加

5、一條用戶信息4、 修改一條用戶信息5、 刪除一條用戶信息3.2 環(huán)境搭建3.2.1 開發(fā)環(huán)境Eclipse4.2 + jdk1.7 + mysql 工程的目錄結(jié)構(gòu) Mybatis的jar包 Mybatis的全局配置文件SqlMapConfig.xml文件配置,參照mybatis的開發(fā)文檔 Log4j日志文件Mybatis的默認(rèn)使用的日志文件是log4j,因此我們的日志信息的配置亦可參照mybatis的官方開發(fā)文檔通過等方法實(shí)現(xiàn)日志信息記錄 映射文件存放目錄在mybatis的全局配置文件中,可以配置映射文件,

6、也就是編寫多個(gè)sql的文件,正常的開發(fā)環(huán)境下,都是一個(gè)模塊一個(gè)映射文件,因此我們將所有的映射文件放入一個(gè)固定的目錄下,這樣方便管理。 目錄結(jié)構(gòu)3.3 根據(jù)用戶的id查詢用戶信息3.3.1 編寫pojo對(duì)象,User.java我們剛框架講過了,我們將查詢的結(jié)果映射成我們需要的結(jié)果類型,那我們既然要查詢用戶信息,自然而然我們需要將查詢的結(jié)果映射成User類型。3.3.2 編寫映射文件,UserMapper.xml在mapper目錄下編寫UserMapper.xml映射文件3.3.3 引入映射文件Mybatis框架啟動(dòng)時(shí)加載全局配置文件,所需我們需要將該映射文件加入到全局文件中用于啟動(dòng)

7、時(shí)加載。3.3.4 測(cè)試3.4 根據(jù)用戶的姓名查詢用戶信息3.4.1 編寫映射文件3.4.2 測(cè)試3.5 插入用戶信息3.5.1 映射文件編寫3.5.2 測(cè)試3.5.3 主鍵id的返回場(chǎng)景:在企業(yè)開發(fā)中,經(jīng)常會(huì)遇到類似這樣的問題,在保存user表后繼續(xù)保存role表,但是role表中有user_id外鍵是user表的主鍵,也就是說保存user表后需要獲取其id主鍵,那么mybatis怎么實(shí)現(xiàn)呢? 自增主鍵的返回要求:該表的主鍵必須是自增.1 映射文件的編寫.2 測(cè)試 非自增主鍵的返回略,就是通過uuid()這個(gè)函數(shù)獲取值,并在執(zhí)行插入前去

8、執(zhí)行該函數(shù)并將獲取的值設(shè)置到resultType指定對(duì)象的對(duì)應(yīng)的屬性中。Insert語句中必須要插入id這個(gè)值。如果是oracle使用序列生成主鍵,則語法為:select 自定義序列.NEXTVAL from dual3.6 更新用戶信息3.6.1 映射文件編寫3.6.2 測(cè)試3.7 根據(jù)用戶id刪除用戶信息3.7.1 映射文件編寫3.7.2 測(cè)試4 兩種dao的開發(fā)方式4.1 SqlSession的使用范圍4.1.1 SqlSessionFactoryBuilderSqlSessionFactoryBuilder用于創(chuàng)建SqlSessionFactory,SqlSessionFactory一

9、旦創(chuàng)建完成就不需要該對(duì)象了,因?yàn)椴僮鲾?shù)據(jù)的會(huì)話SqlSession是通過SqlSessionFactory生產(chǎn),所以可以將SqlSessionFactoryBuilder當(dāng)做一個(gè)工具類來使用,而且最佳的使用范圍就是在方法體內(nèi)的局部變量。4.1.2 SqlSessionFactorySqlSessionFactory是一個(gè)接口,接口中定義了openSession的不同重載方法,SqlSessionFactory最佳的使用范圍是整個(gè)應(yīng)用運(yùn)行期間,一旦創(chuàng)建后即可以重復(fù)使用,通常以單例的模式管理。4.1.3 SqlSessionSqlSession是一個(gè)面向用戶的接口,SqlSession中定義了數(shù)據(jù)

10、庫操作。默認(rèn)使用DefaultSqlSession實(shí)現(xiàn)。執(zhí)行過程:1、 加載mybatis全局配置文件的配置信息,environment元素中的信息。2、 創(chuàng)建事物對(duì)象3、 創(chuàng)建數(shù)據(jù)源4、 創(chuàng)建執(zhí)行數(shù)據(jù)的executor執(zhí)行器5、 獲取executor執(zhí)行器源碼總結(jié):每個(gè)線程都有自己的SqlSession實(shí)例,SqlSession實(shí)例是不能共享的,因?yàn)镾qlSession中包含了很多數(shù)據(jù)域的屬性,使用完就關(guān)閉該實(shí)例。這里的方法中都屬于數(shù)據(jù)對(duì)象,如果線程1執(zhí)行到query方法時(shí),sleep,那么線程2執(zhí)行完query方法后sleep,如果線程1繼續(xù)執(zhí)行就造成數(shù)據(jù)域共享的問題了。4.2 原始dao

11、的開發(fā)方式思路:在實(shí)現(xiàn)類中注入SqlSessionFactory對(duì)象,并在方法內(nèi)獲取SqlSession并用于操作數(shù)據(jù)庫信息。4.2.1 開發(fā)接口4.2.2 開發(fā)實(shí)現(xiàn)類4.2.3 測(cè)試4.2.4 問題u 存在重復(fù)代碼:在實(shí)現(xiàn)類中,每個(gè)實(shí)現(xiàn)的方法都有通過SqlSessionFactory獲取SqlSession,然后在通過SqlSession調(diào)用數(shù)據(jù)庫的方法。u 在操作數(shù)據(jù)庫的過程中,需要指定statement的id調(diào)用對(duì)應(yīng)的sql,存在statement的id硬編碼的問題,不利于開發(fā)維護(hù)4.3 Mapper代理的方式開發(fā)dao4.3.1 遵循規(guī)范1、 定義的mapper.xml映射文件中,na

12、mespace的值就是該mapper接口的類路徑,mybatis會(huì)根據(jù)該namespace的地址獲取其代理類對(duì)象2、 Mapper接口中的方法名必須與mapper.xml文件中的statement的id一致3、 Mapper接口中的方法的參數(shù)必須和mapper.xml文件的parameterType類型一致4、 Mapper接口中的方法的返回值必須和mapper.xml文件的resultType類型一致4.3.2 Mapper接口開發(fā)4.3.3 編寫映射文件4.3.4 SqlMapConfig.xml文件引入映射文件4.3.5 測(cè)試4.3.6 jdk代理和cglib代理 概念jd

13、k代理:面向接口的,也稱動(dòng)態(tài)代理cglib代理:面向?qū)嶓w類,也稱靜態(tài)代理 代理類型提問:如何判讀我們的程序中是通過jdk代理還是cglib代理?我們可以打印代理類對(duì)象的內(nèi)存地址,如果包含CGLIB為cglib代理,如果包含Proxy的則為Proxy代理;或者我們直接將cglib包去掉看是否能夠生成代理類對(duì)象。4.3.7 說明Mybatis官方推薦使用mapper接口的方式開發(fā)dao,這樣程序員就不用去開發(fā)實(shí)現(xiàn)類了,使用mapper代理的方式,輸入?yún)?shù)可以使用pojo包裝對(duì)象或map對(duì)象,保證dao的通用性。但是目前很多企業(yè)中還是用第一種方式開發(fā)dao,因?yàn)樵诮榻Bmybatis時(shí),

14、我們知道m(xù)ybatis的前身是ibatis,而ibatis是沒有提供這種方式開發(fā)dao的,所有很多公司還沒有習(xí)慣使用第二種方式開發(fā)dao。5 SqlMapConfig.xml全局配置文件5.1 配置內(nèi)容和順序properties(屬性)settings(全局配置參數(shù))typeAliases(類型別名)typeHandlers(類型處理器)objectFactory(對(duì)象工廠)plugins(插件)environments(環(huán)境集合屬性對(duì)象)environment(環(huán)境子屬性對(duì)象)transactionManager(事務(wù)管理)dataSource(數(shù)據(jù)源)mappers(映射器)5.2 Pro

15、pertiesProperties屬性,可以通過加載資源文件獲取信息我們連接數(shù)據(jù)源的信息都是配置在該全局配置文件中,但是實(shí)際開發(fā)中我們不會(huì)這么做,會(huì)把連接數(shù)據(jù)庫的信息配置在資源文件中。好處是:當(dāng)我需要更換數(shù)據(jù)源的時(shí),我們只需要更改資源文件即可,而且如果有其他的文件中可以共享這里面的信息。5.2.1 perties5.2.2 SqlMapConfig.xml5.2.3 注意事項(xiàng)Mybatis加載所有的文件時(shí),如果有相同的屬性名稱時(shí),它們的加載屬性如下:u Properties元素體內(nèi)指定的屬性最先被讀取u 再次讀取類路徑下資源或properties元素內(nèi)引用的資源的屬性,如果屬性名稱

16、一致則會(huì)被覆蓋u 作為方法參數(shù)傳遞的屬性parameterType最后被讀?。ó?dāng)然是先加載這些配置文件最后加載映射文件),指的就是statement中的如果有引用相同的屬性,則會(huì)覆蓋完全名稱一致的屬性perties命名規(guī)則u 命名規(guī)則最好是xxx.xxx.xxx這種方式命名,否則可能會(huì)出現(xiàn)屬性覆蓋的現(xiàn)象。5.3 Settings可以配置mybatis的延遲加載、二級(jí)緩存等配置信息,該配置信息可以改變mybatis的運(yùn)行行為5.4 typeAliases 別名5.4.1 mybatis默認(rèn)支持的別名別名映射的類型_byte byte _long long _short short _

17、int int _integer int _double double _float float _boolean boolean string String byte Byte long Long short Short int Integer integer Integer double Double float Float boolean Boolean date Date decimal BigDecimal bigdecimal BigDecimal 5.4.2 mybatis自定別名 單個(gè)別名的配置 批量別名的配置如果還要掃描其他包,繼續(xù)添加packag

18、e即可。批量定義別名并使用該別名時(shí),無需區(qū)分大小寫。5.5 typeHandlers 類型處理器類型處理器,mybatis不管是預(yù)編譯時(shí)設(shè)置參數(shù)還是從結(jié)果中獲取值時(shí),都會(huì)將該值轉(zhuǎn)出合適的Java類型,mybatis默認(rèn)給我們實(shí)現(xiàn)了需多typeHandlers,基本能滿足開發(fā)。類型處理器Java類型JDBC類型BooleanTypeHandler Boolean,boolean 任何兼容的布爾值ByteTypeHandler Byte,byte 任何兼容的數(shù)字或字節(jié)類型ShortTypeHandler Short,short 任何兼容的數(shù)字或短整型IntegerTypeHandler Integ

19、er,int 任何兼容的數(shù)字和整型LongTypeHandler Long,long 任何兼容的數(shù)字或長(zhǎng)整型FloatTypeHandler Float,float 任何兼容的數(shù)字或單精度浮點(diǎn)型DoubleTypeHandler Double,double 任何兼容的數(shù)字或雙精度浮點(diǎn)型BigDecimalTypeHandler BigDecimal 任何兼容的數(shù)字或十進(jìn)制小數(shù)類型StringTypeHandler String CHAR和VARCHAR類型ClobTypeHandler String CLOB和LONGVARCHAR類型NStringTypeHandler String NVA

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論