今天是劉小愛自學Java的第115天。web
感謝你的觀看,謝謝你。sql
![](http://static.javashuo.com/static/loading.gif)
mybatis框架的繼續學習,安排以下:數據庫
-
對昨天學習的內容作個小結,其中補充一個昨天忽視的問題。 -
數據庫無外乎就是增刪改查,因此使用mybatis作一個完整的crud操做。 -
最後使用動態代理對代碼優化,具體底層實現原理就不深究了,大體知道怎麼回事就行。
1、mybatis使用步驟回顧
主要是涉及到配置文件的編寫,其中又包含核心配置文件和映射文件。微信
![](http://static.javashuo.com/static/loading.gif)
建立mybatis-config.xml核心配置文件。mybatis
建立映射文件編寫sql語句,能夠建立多個,但每建立一個都要在覈心配置文件中說明。架構
構建SqlSessionFactory,再經過該工廠建立SqlSession對象。app
總之sqlSession對象是關鍵,經過它就能執行sql語句了。框架
而如何找到對應的sql語句並執行?編輯器
就須要在參數中說明sql語句對應的id了。學習
Java實體類和數據表
前面也一直強調過不少次,它們都是一一對應的關係,昨天的代碼有一個問題:
在Java中變量名通常採用的是駝峯命名規則,好比userName。
而在數據庫中如果多個單詞,會用下劃線隔開,好比說user_name。
![](http://static.javashuo.com/static/loading.gif)
這樣的話這兩個就無法對應出來,查詢結果也會顯示userName爲空。
昨天我遇到這個問題後的第一反應就是直接將數據庫中的字段名給改了,改爲username。
但今天看教程的時候也講到這個問題,解決方法是在sql語句中給字段名取一個別名。
既然講到了,那就作一個瞭解吧。
2、mybatis完整的crud
Java經典三層架構中的dao層,也能夠叫mapper層,它們其實都是一回事。
映射文件說的也就是這個mapper。
1UserDao接口
![](http://static.javashuo.com/static/loading.gif)
數據庫四大操做:增刪改查
在dao層中編寫一個接口,包含這四種操做的方法,其中查詢有全表和單條查詢。
既然有接口,那麼也要有一個和其對應的實現類userDaoImpl,固然該實現類後續可使用動態代理省略掉,暫且先不考慮。
在寫實現類以前,咱們要先在mapper配置文件中編寫對應的sql語句。
2UserDaoMapper配置文件
![](http://static.javashuo.com/static/loading.gif)
老實說,這塊就寫的有點難受了,其中這個#{字段名}也就至關於預編譯中的「?」問號。
查詢語句包含查詢全部用戶和根據條件查詢用戶,也只有查詢語句須要返回值類型。
值得注意的是:
在覈心配置文件中要加入該映射文件說明。
3UserDaoImpl實現類
![](http://static.javashuo.com/static/loading.gif)
dao層中的代碼很純粹,只用來增刪改查。獲取sqlSession對象的代碼不在dao層中編寫。
因此建立構造方法,參數爲sqlSession。
也就是說想要使用dao層,就得給傳一個sqlSession對象完成初始化。
其中增刪改操做中咱們須要調用commit方法提交事務,否則數據庫中的數據不會修改。
查詢不須要事務提交,這也好理解,自己並無對數據庫中的數據進行修改。
4建立測試類
![](http://static.javashuo.com/static/loading.gif)
①建立測試類
使用快捷鍵Ctrl+Shift+T在UserDao接口名上能夠快速建立一個對應的測試類。
②設定測試類方法
哪些方法須要測試能夠自行選擇,其中setUp@Before選擇後會建立一個setUp()方法。
這個before是什麼意思呢?
就是上述一共有5個要測試的方法,每一個方法運行時都會先執行before方法裏的內容。
因此將獲取sqlSession對象的操做封裝到setUp方法中,每次增刪改查時會先獲取sqlSession對象。
5最後測試下增長操做
![](http://static.javashuo.com/static/loading.gif)
測試代碼一運行,分析下其流程:
-
set up()方法會優先執行,從而獲取SqlSession對象,並將userDao初始化 -
調用該dao層中的增長方法,執行的也就是其實現類中的insertUser()方法。 -
insertUser()方法中也就是利用sqlSession對象進行增長操做。 -
參數爲sql語句對應的映射文件id,和須要增長的數據user。 -
這樣在數據庫中就增長了一條數據。
3、使用動態代理省略實現類
動態代理能夠將dao層接口和映射文件直接鏈接起來,從而省略了dao層實現類的編寫。
![](http://static.javashuo.com/static/loading.gif)
再次說明這個mapper層也就是dao層,只不過咱們之前一直把它叫作dao層。
如何將接口和映射文件鏈接起來呢?須要知足如下條件:
-
映射文件中的命名空間與Mapper接口的全路徑一致,也就是上圖中最上面的箭頭。 -
映射文件中sql語句的id與Mapper接口的方法名保持一致。
說白了其實就是將接口中的方法和sql語句所在的位置對應起來了。
在知足上面的要求後,就可使用動態代理省略實現類的編寫了,建立測試類:
![](http://static.javashuo.com/static/loading.gif)
使用快捷鍵Ctrl+Shift+T建立測試類。
其實關鍵就是sqlSession.getMapper()這個方法,其本質就至關於userMapper的實現類。
實現原理能夠查看該方法源碼,這裏就不作拓展了,知道它和經過實現類的方式同樣便可。
這樣完成以後就能夠直接在測試代碼中使用userMapper增刪改查。
最後
謝謝你的觀看。
若是能夠的話,麻煩幫忙點個贊,謝謝你。
本文分享自微信公衆號 - 劉小愛(liuxiaoai946)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。