MyBatis之快速入门
MyBatis之快速入門
2017/9/30首先我要明確告訴大家的是MyBatis是一個java持久層框架,以前我們都是用jdbc來將我們的java程序與數(shù)據(jù)庫相連接,而MyBatis是對jdbc的一個封裝。
1.MyBatis框架的引入
我們來看看傳統(tǒng)的編程方式中使用jdbc的問題:
- 1.數(shù)據(jù)庫連接頻繁的創(chuàng)建和關(guān)閉,缺點:浪費數(shù)據(jù)庫的資源,影響操作效率。解決方法:使用數(shù)據(jù)庫連接池如c3p0.
- 2.sql語句是硬編碼(不利用系統(tǒng)維護(hù)),如果需求變更需要修改sql,這時候就需要修改java代碼,然后需要重新編譯,系統(tǒng)不易維護(hù)。解決方法:將sql語句統(tǒng)一配置在文件中。這樣以后修改sql時就不需要修改java代碼了。
- 3.我們通過preparedStatement對象向占位符設(shè)置參數(shù),存在硬編碼(參數(shù)位置、參數(shù))問題,系統(tǒng)不易維護(hù)。解決方法:將sql中的占位符及對應(yīng)的參數(shù)類型配置在配置文件中,能夠自動輸入的映射。
- 4.遍歷查詢結(jié)果集存在硬編碼(列名)。解決方法:自動進(jìn)行sql查詢結(jié)果向java對象的映射(輸出映射)。
為了解決這些問題,所以出現(xiàn)了MyBatis框架。
2.MyBatis介紹
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,并且改名為MyBatis,實質(zhì)上Mybatis對ibatis進(jìn)行一些改進(jìn)。 目前mybatis在github上托管。
MyBatis是一個優(yōu)秀的持久層框架,它對jdbc的操作數(shù)據(jù)庫的過程進(jìn)行封裝,使開發(fā)者只需要關(guān)注 SQL 本身,而不需要花費精力去處理例如注冊驅(qū)動、創(chuàng)建connection、創(chuàng)建statement、手動設(shè)置參數(shù)、結(jié)果集檢索等jdbc繁雜的過程代碼。
MyBatis通過xml或注解的方式將要執(zhí)行的各種statement(statement、preparedStatemnt、CallableStatement)配置起來,并通過java對象和statement中的sql進(jìn)行映射生成最終執(zhí)行的sql語句,最后由mybatis框架執(zhí)行sql并將結(jié)果映射成java對象并返回。
3.MyBatis架構(gòu)
如下圖:
接下來我將通過對一張用戶表進(jìn)行增、刪、改、查帶你快速入門MyBatis。
4.MyBatis快速入門
4.1準(zhǔn)備開發(fā)環(huán)境
1.創(chuàng)建測試項目,普通java項目或是web項目都可。
2.導(dǎo)入jar包:mybatis-3.1.1.jar(低于這個版本的jar包需要導(dǎo)入很多依賴包)和mysql-connection-java
3.創(chuàng)建數(shù)據(jù)庫和相應(yīng)的表,SQL腳本如下:
到此,環(huán)境配置就告一段落。
4.2使用MyBatis查詢表中數(shù)據(jù)(通過id查詢)
1.添加Mybatis的配置文件SqlMapConfig.xml
在src目錄下創(chuàng)建一個SqlMapConfig.xml文件(文件名稱隨便起),內(nèi)容如下:
2.定義表所需要的實體類User.java
代碼如下:
3.定義操作user表的sql映射文件User.xml
這里我們沒將文件命名為userMapper.xml,后面我們會改。
User.xml文件內(nèi)容如下:
在User.xml中寫SQL語句,在參數(shù)處使用占位符#{},應(yīng)該注意的是大括號{}中傳入的數(shù)據(jù)應(yīng)該與User.java中的屬性對應(yīng),文件中各個屬性的解釋見圖中注釋處。
4.在SqlMapConfig文件中注冊User.xml文件
在SqlMapConfig.xml中添加一個<mappers></mappers>字段,并在里面?zhèn)魅險ser.xml文件路徑。
整體結(jié)構(gòu)如下:
5.接下來我們便可以借助上面MyBatis架構(gòu)圖來編寫測試類了
注意,我是借助junit.jar包來編寫的測試類。輸出結(jié)果如下:
上面我們是通過id來對表進(jìn)行查詢,接下來我要講講如何通過姓名來模糊查詢表。
4.3使用MyBatis根據(jù)用戶名模糊查詢用戶信息
1.需要在User.xml文件中添加如下字段:
此時,我們在傳入?yún)?shù)的地方不再使用占位符#{}而是使用${},二者區(qū)別如下:
- #{}:1.表示一個占位符,向占位符輸入?yún)?shù),mybatis自動進(jìn)行java類型和jdbc類型的轉(zhuǎn)換。2.程序員不需要考慮參數(shù)的類型,比如:傳入字符串,mybatis最終拼接好的sql就是參數(shù)兩邊加單引號。3.#{}接收pojo(Plain Old Java Object Java數(shù)據(jù)對象)數(shù)據(jù),可以使用OGNL(就是el表達(dá)式)解析出pojo的屬性值。
- ${}:1.表示sql的拼接,通過${}接收參數(shù),將參數(shù)的內(nèi)容不加任何修飾拼接在sql中。2.${}也可以接收pojo數(shù)據(jù),可以使用OGNL解析出pojo的屬性值。3.缺點:不能防止sql注入。
2.測試類代碼如下:
注意,此時我們通過name查詢出來的語句為多條,故此時我們應(yīng)該選擇調(diào)用sqlSession對象的selectList()方法返回多條記錄,輸出我們查詢到的第一條記錄即可。若使用selectOne()方法,當(dāng)返回的記錄為多條時就會發(fā)生異常。
這樣我們便完成了查詢時將sql結(jié)果輸出映射到Java對象中。那如何將Java對象輸入映射到sql語句中,接下來我們就來講通過MyBatis實現(xiàn)增、刪、改數(shù)據(jù)庫。
4.4使用MyBatis向表中插入一條記錄
1.在User.xml中添加如下字段:
貌似關(guān)鍵字為value和values都可以…
2.編寫測試類:
此時查看數(shù)據(jù)庫:
發(fā)現(xiàn)數(shù)據(jù)已被插入。
擴(kuò)展:主鍵返回:
在測試類中,我們沒有給User對象的id屬性設(shè)置值,所以我們在測試類中嘗試輸出User對象的id時會輸出id=0,但是該對象通過輸入映射在數(shù)據(jù)庫中是有對應(yīng)的id值的(因為我們?yōu)樵撟侄卧O(shè)置了自增長屬性)。那么我們想輸出該對象在記錄中的id時,又該怎么做呢?只需在User.xml文件中的<insert></insert>標(biāo)簽中添加<selectKey>標(biāo)簽即可,屬性解釋見圖:
此時我們在測試類中便可輸出該User對象插入在表中的記錄id值了。
這里我們由于在建表時設(shè)置了id字段為自增長,采用自增長的形式生成主鍵,所以我們在傳入User對象的id屬性時可以將該屬性設(shè)置為null。那么當(dāng)我們使用uuid生成主鍵時又該怎么做呢?
只需在User.xml中添加如下字段:
屬性值”before”的意思表示在執(zhí)行插入操作時,會先調(diào)用uuid()函數(shù)生成uuid得到主鍵,然后將主鍵設(shè)置到User對象中,再將User對象插入到數(shù)據(jù)庫。所以此時我們在測試類中也可以不對User的id屬性進(jìn)行設(shè)置值。
4.5使用MyBatis實現(xiàn)刪除表中數(shù)據(jù)
接下來的操作就很輕松了,因為跟上述操作差不多。
1.在User.xml文件中添加如下字段:
2.編寫測試類:
運行程序后便可發(fā)現(xiàn)數(shù)據(jù)庫中的該數(shù)據(jù)已被刪除。
4.6使用MyBatis實現(xiàn)更新表中數(shù)據(jù)
1.在User.xml文件中添加如下字段:
2.編寫測試類:
運行程序后便可發(fā)現(xiàn)數(shù)據(jù)庫中的該數(shù)據(jù)已被更新。
5.MyBatis開發(fā)流程小結(jié)
寫過上述代碼,我們便可以對MyBatis的開發(fā)流程進(jìn)行一下總結(jié)了,流程如下:
- 1.編寫SqlMapConfig.xml
- 2.編寫mapper.xml(每個字段定義一個statement)
- 3.編程通過配置文件創(chuàng)建SqlSessionFactory
- 4.通過SqlSessionFactory獲取SqlSession對象。
- 5.通過SqlSession操作數(shù)據(jù)庫。(如果執(zhí)行添加、更新、刪除需要調(diào)用SqlSession.commit())
- 6.SqlSesion使用完成要關(guān)閉。
關(guān)于MyBatis配置的一些優(yōu)化及高級知識請見我后面的文章。
總結(jié)
以上是生活随笔為你收集整理的MyBatis之快速入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: refresh的停车场
- 下一篇: java中ArrayList类的操作