【十一】Mybatis學(xué)習(xí)筆記

《小吳同學(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ā)快速可以使用注解;
  • 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媳荒;
        • resultType:查出的數(shù)據(jù)的返回值類型
    • 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"/>
              
    • 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"/>
          
    • 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:可以禁用一級緩存炬灭;
  • 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)配置:掃描控制器鼻吮、視圖解析器等
  • 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í)記錄整理椎木,如有錯誤之處违柏,歡迎指正!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末香椎,一起剝皮案震驚了整個濱河市漱竖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畜伐,老刑警劉巖馍惹,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異玛界,居然都是意外死亡讼积,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門脚仔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勤众,“玉大人,你說我怎么就攤上這事鲤脏∶茄眨” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵猎醇,是天一觀的道長窥突。 經(jīng)常有香客問我,道長硫嘶,這世上最難降的妖魔是什么阻问? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮沦疾,結(jié)果婚禮上称近,老公的妹妹穿的比我還像新娘。我一直安慰自己哮塞,他們只是感情好刨秆,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著忆畅,像睡著了一般衡未。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上家凯,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天缓醋,我揣著相機與錄音,去河邊找鬼绊诲。 笑死送粱,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的驯镊。 我是一名探鬼主播葫督,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼竭鞍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了橄镜?” 一聲冷哼從身側(cè)響起偎快,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎洽胶,沒想到半個月后晒夹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡姊氓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年丐怯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翔横。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡读跷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出禾唁,到底是詐尸還是另有隱情效览,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布荡短,位于F島的核電站丐枉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏掘托。R本人自食惡果不足惜瘦锹,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闪盔。 院中可真熱鬧弯院,春花似錦、人聲如沸锭沟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽族淮。三九已至,卻和暖如春凭涂,著一層夾襖步出監(jiān)牢的瞬間祝辣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工切油, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝙斜,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓澎胡,卻偏偏與公主長得像孕荠,于是被迫代替她去往敵國和親娩鹉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. 簡介 1.1 什么是 MyBatis 稚伍? MyBatis 是支持定制化 SQL弯予、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,523評論 0 4
  • 1 Mybatis入門 1.1 單獨使用jdbc編程問題總結(jié) 1.1.1 jdbc程序 上邊使...
    哇哈哈E閱讀 3,307評論 0 38
  • 《獨玉》 詞:梅溪仙子 像花瓣似的山峰痛飲著陽光 然后變成了五顏六色的瑯玕 琢玉人住進自己雕畫的房子 揮起那把隨音...
    梅溪仙子閱讀 216評論 0 0
  • ① 齊魯壹點濟南3月24日報道锈嫩,3月23日上午,有網(wǎng)友在微博爆料垦搬,稱22日下午四點呼寸,在開往彭莊方向的K19路公交車...
    少爺寫春秋閱讀 373評論 0 4
  • 今天上午,我和哥哥騎著電車到26層樓那邊猴贰。 那邊有人住对雪,所以電梯也可以用。我們坐上電梯米绕,按26瑟捣,過了一...
    天佑655閱讀 139評論 0 1