《小吳同學(xué)的Mybatis學(xué)習(xí)之路》點擊此處查看完整項目
- 1.Mybatis_01_HelloWorld
- 接口式編程
-
2.Mybatis_02_config (標(biāo)簽順序很重要)
- 2.1mybatis可以使用properties來引入外部properties配置文件的內(nèi)容
- resource:引入類路徑下的資源
- url:引入網(wǎng)絡(luò)路徑或者磁盤路徑下的資源
如果 在某個包下 則com/wq/dbconfig.properties
- 2.2 settings包含很多重要的設(shè)置項
- setting:用來設(shè)置每一個設(shè)置項
- name:設(shè)置項名
- value:設(shè)置項取值
- 2.3 typeAlias為某個java類型起別名
- type:指定要起別名的類型全類名;默認(rèn)別名就是類名小寫;employee
- alias:指定新的別名
- package:為某個包下的所有類批量起別名 name:指定包名(為當(dāng)前包以及下面所有的后代包的每一個類都起一個默認(rèn)別名(類名小寫))
- 批量起別名的情況下钩述,如果有重復(fù)類寨躁,則使用@Alias注解為某個類型指定新的別名
- 2.4environments:環(huán)境們,mybatis可以配置多種環(huán)境 ,default指定使用某種環(huán)境牙勘≈翱遥可以達到快速切換環(huán)境。
- 2.5databaseIdProvider:支持多數(shù)據(jù)庫廠商方面;
- 2.6sql映射文件注冊到全局配置文件mybatis-config.xml
- 注冊配置文件
- resource:引用類路徑下的sql映射文件 mybatis/mapper/EmployeeMapper.xml
- url:引用網(wǎng)路路徑或者磁盤路徑下的sql映射文件 file:///var/mappers/AuthorMapper.xml
- 注冊接口 (一般將mapper文件和dao放在相同的包名下放钦,比如一個在src的包名com.wq.dao,另一個在conf下的包名com.wq.dao中)
- class
- 1.有sql映射文件,映射文件名必須和接口同名恭金,并且放在與接口同一目錄下操禀;
- 2.沒有sql映射文件,所有的sql都是利用注解寫在接口上;
- 推薦
- 1.比較重要的横腿,復(fù)雜的Dao接口我們來寫sql映射文件
- 2.不重要颓屑,簡單的Dao接口為了開發(fā)快速可以使用注解;
- class
- 注冊配置文件
- 2.1mybatis可以使用properties來引入外部properties配置文件的內(nèi)容
-
3.Mybatis_03_mapper
-
3.1 增刪改操作耿焊,特別是添加時獲取插入的主鍵值
- mysql支持自增主鍵揪惦,自增主鍵值的獲取,mybatis也是利用statement.getGenreatedKeys()罗侯;
useGeneratedKeys="true"器腋;使用自增主鍵獲取主鍵值策略
keyProperty;指定對應(yīng)的主鍵屬性,也就是mybatis獲取到主鍵值以后纫塌,將這個值封裝給javaBean的哪個屬性 - oracle獲取非自增主鍵的值:Oracle不支持自增再愈;Oracle使用序列來模擬自增;每次插入的數(shù)據(jù)的主鍵是從序列中拿到的值;
keyProperty:查出的主鍵值封裝給javaBean的哪個屬性- Order: "BEFORE":當(dāng)前sql在插入sql之前運行
AFTER:當(dāng)前sql在插入sql之后運行- BEFORE運行順序:
先運行selectKey查詢id的sql护戳;查出id值封裝給javaBean的id屬性
在運行插入的sql翎冲;就可以取出id屬性對應(yīng)的值 - AFTER運行順序:
先運行插入的sql(從序列中取出新值作為id);
再運行selectKey查詢id的sql媳荒;
- BEFORE運行順序:
- resultType:查出的數(shù)據(jù)的返回值類型
- Order: "BEFORE":當(dāng)前sql在插入sql之前運行
- mysql支持自增主鍵揪惦,自增主鍵值的獲取,mybatis也是利用statement.getGenreatedKeys()罗侯;
-
3.2 mybatis參數(shù)處理(詳見項目路徑下mybatis參數(shù)處理.txt)
- 1.單個參數(shù) ====》#{id}
- 2.多個參數(shù) ====》#{param1},#{param2}
- 2.pojo Employee ====》#{e.lastName} 【推薦】
- 3.Map ====>直接#{id},#{lastName}
- 4.List====>#{list[0]}
- ...其余略
-
3.3 ‘#’與$的區(qū)別
- ‘#{}’:是以預(yù)編譯的形式抗悍,將參數(shù)設(shè)置到sql語句中;PreparedStatement钳枕;防止sql注入
- ‘${}’:取出的值直接拼裝在sql語句中缴渊;會有安全問題;
大多情況下鱼炒,我們?nèi)?shù)的值都應(yīng)該去使用#{}衔沼;
-
3.4 jdbcType=NULL Oracle的相關(guān)配置
- 在我們數(shù)據(jù)為null的時候,有些數(shù)據(jù)庫可能不能識別mybatis對null的默認(rèn)處理昔瞧。比如Oracle(報錯)指蚁;
- JdbcType OTHER:無效的類型;因為mybatis對所有的null都映射的是原生Jdbc的OTHER類型自晰,oracle不能正確處理;
- 由于全局配置中:jdbcTypeForNull=OTHER凝化;oracle不支持;兩種辦法
- 1酬荞、#{email,jdbcType=OTHER};
- 2搓劫、jdbcTypeForNull=NULL
<setting name="jdbcTypeForNull" value="NULL"/>
- 由于全局配置中:jdbcTypeForNull=OTHER凝化;oracle不支持;兩種辦法
- JdbcType OTHER:無效的類型;因為mybatis對所有的null都映射的是原生Jdbc的OTHER類型自晰,oracle不能正確處理;
- 在我們數(shù)據(jù)為null的時候,有些數(shù)據(jù)庫可能不能識別mybatis對null的默認(rèn)處理昔瞧。比如Oracle(報錯)指蚁;
-
3.5 resultType練習(xí)
- 返回list時,resultType設(shè)為定義集合中返回元素的類型;
- 返回Map(key是數(shù)據(jù)庫的字段混巧,value是對應(yīng)的值)時枪向,resultType設(shè)為java.util.Map【別名map】,map是mybatis能識別的別名;
- 返回Map(指定key,key為JavaBean中的屬性名)時,resultType設(shè)為JavaBean名稱(如:employee);
- 返回Map集合時咧党,resultType設(shè)為定義集合中Map元素的類型;
-
3.6 resultMap練習(xí)【詳見EmployeeMapperPlus】
- 它與resultType只能二選一;
- 級聯(lián)屬性封裝結(jié)果集;
- 使用association定義關(guān)聯(lián)的單個對象的封裝規(guī)則秘蛔;
- property="dept":指定哪個屬性是聯(lián)合的對象
- javaType:指定這個屬性對象的類型【不能省略】
- 使用association進行分步查詢:
- select:表明當(dāng)前屬性是調(diào)用select指定的方法查出的結(jié)果
- column:指定將哪一列的值傳給這個方法
- 流程:使用select指定的方法(傳入column指定的這列參數(shù)的值)查出對象,并封裝給property指定的屬性
- 使用延遲加載(懶加載)(按需加載),在mybatis-config.xml中開啟懶加載
- mybatis-config中配置如下:
<!--懶加載--> <setting name="lazyLoadingEnabled" value="true"/> <!--默認(rèn)是true 會加載全部屬性 如果設(shè)為False凿傅,只加載想要的屬性--> <setting name="aggressiveLazyLoading" value="false"/>
- mybatis-config中配置如下:
-
3.7 關(guān)聯(lián)集合collection
- 不分步:
- property:集合名字(如:員工列表屬性名稱emps缠犀,必須和部門Javabean中的員工列表屬性名一致)
- ofType:集合中元素的類型(如:com.wq.bean.Employee)
- 分步:
- property:集合名字(如:員工列表屬性名稱emps,必須和部門Javabean中的員工列表屬性名一致)
- select:關(guān)聯(lián)的sql查詢聪舒,(如:com.wq.dao.EmployeeMapperPlus.getEmpsByDeptId)
- column:關(guān)聯(lián)的sql里面需要的入?yún)⒈嬉海热缡遣块T的id("id")
- 如果多個參數(shù)時,column="{key1=column1,key2=column2}"
- fetchType (即使全局已經(jīng)配置了懶加載箱残,也可以單獨設(shè)為eager)
- lazy:延遲
- eager:立即
- 不分步:
-
-
4.Mybatis_04_DynamicSql動態(tài)Sql
- if
- choose(when,otherwise)
- trim(where,set)
- foreach
- bind
- include 引入一個通用的sql
<include refid="selectSql">
-
5.Mybatis_05_cache
- 5.1 一級緩存(SqlSession級別的一個Map)
- sqlSession級別的緩存滔迈。一級緩存是一直開啟的止吁;
- 與數(shù)據(jù)庫同一次會話期間查詢到的數(shù)據(jù)會放在本地緩存中。
- 失效情況:
- (1)sqlSession不同
- (2)sqlSession相同燎悍,查詢條件不同.(當(dāng)前一級緩存中還沒有這個數(shù)據(jù))
- (3)sqlSession相同敬惦,兩次查詢之間執(zhí)行了增刪改操作(這次增刪改可能對當(dāng)前數(shù)據(jù)有影響)
- (4)sqlSession相同,手動清除了一級緩存(緩存清空)
- 5.2 二級緩存(全局緩存谈山,基于namespace級別)
- 工作機制:
- (1)一個會話俄删,查詢一條數(shù)據(jù),這個數(shù)據(jù)就會被放在當(dāng)前會話的一級緩存中奏路;
- (2)如果會話關(guān)閉畴椰;一級緩存中的數(shù)據(jù)會被保存到二級緩存中挂绰;新的會話查詢信息牍疏,就可以參照二級緩存中的內(nèi)容;
- 使用:
- (1)開啟全局二級緩存配置:<setting name="cacheEnabled" value="true"/>
- (2)去mapper.xml中配置使用二級緩存:
<cache></cache>
- (3)我們的POJO需要實現(xiàn)序列化接口
- 工作機制:
- 5.3 和緩存有關(guān)的設(shè)置/屬性
- 1)苗踪、cacheEnabled=true:false:關(guān)閉緩存(二級緩存關(guān)閉)(一級緩存一直可用的)
- 2)触机、這個始終在前面配置使用二級緩存三大條件不可缺一的情況下測試帚戳,每個select標(biāo)簽都有useCache="true";false:不使用緩存(一級緩存依然使用,二級緩存不使用)
- 3)儡首、【每個增刪改標(biāo)簽的:flushCache="true":(一級二級都會清除)】
- 增刪改執(zhí)行完成后就會清除緩存片任;
- 測試:flushCache="true":一級緩存就清空了;二級也會被清除椒舵;
- 查詢標(biāo)簽:flushCache="false"蚂踊;如果flushCache=true;每次查詢之后都會清空緩存;緩存是沒有被使用的笔宿;
- 4)、sqlSession.clearCache();只是清楚當(dāng)前session的一級緩存棱诱;
- 5)泼橘、localCacheScope:本地緩存作用域:(一級緩存SESSION);當(dāng)前會話的所有數(shù)據(jù)保存在會話緩存中迈勋;STATEMENT:可以禁用一級緩存炬灭;
- 5.1 一級緩存(SqlSession級別的一個Map)
-
6.Mybatis_06_ssm(Spring+SpringMVC+Mybatis整合測試)
- 6.1 相關(guān)配置
- 6.1.1 web.xml
- 監(jiān)聽Spring、SpringMVC配置 - 6.1.2 applicationContext.xml
- Spring相關(guān)配置:引入數(shù)據(jù)庫配置文件靡菇、事務(wù)管理重归、開啟基于注解的事務(wù)、掃描所有的mapper接口的實現(xiàn)等厦凤。 - 6.1.3 spring-servlet.xml
- SpringMVC相關(guān)配置:掃描控制器鼻吮、視圖解析器等
- 6.1.1 web.xml
- 6.1 相關(guān)配置
7.Mybatis_07_mbg(Mybati逆向工程)
-
8.Mybatis_08_source(源碼解讀,了解Mybatis工作原理)
-
工作原理
圖8.1Mybatis工作原理.png -
四大對象
- Executor
- StatementHandler
- ParameterHandler
- ResultSetHandler
-
圖8.2 mybatis-sqlSessionFactory-init時序圖.png
圖8.3 mybatis-openSession時序圖.png
圖8.4 Mybatis-getMapper時序圖.png
圖8.5 Mybatis-invoke(上).png
圖8.6 Mybatis-invoke(下).png
其他
Jar.png
ssm項目jar.png
??注: 本文長期更新较鼓。此筆記純個人學(xué)習(xí)記錄整理椎木,如有錯誤之處违柏,歡迎指正!