Mybatis高級(jí)映射、動(dòng)態(tài)SQL及獲得自增主鍵的解析
MyBatis 本是apache的一個(gè)開(kāi)源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由apache software foundation 遷移到了google code,并且改名為MyBatis 。下文給大家介紹Mybatis高級(jí)映射、動(dòng)態(tài)SQL及獲得自增主鍵的內(nèi)容,具體詳情請(qǐng)參考本文。
一、動(dòng)態(tài)SQL
相信大家在用mybatis操作數(shù)據(jù)庫(kù)時(shí)時(shí)都會(huì)碰到一個(gè)問(wèn)題,假如現(xiàn)在我們有一個(gè)關(guān)于作者的list authorList,需要根據(jù)authorList里已有的作者信息在數(shù)據(jù)庫(kù)中查詢(xún)相應(yīng)作者的博客信息。那么最容易想到的做法就是遍歷authorList,獲取相應(yīng)的信息查詢(xún)數(shù)據(jù)庫(kù)。
for(int i=0;I < authorList.size();i++) { …… //查詢(xún)數(shù)據(jù)庫(kù)代碼 //select * from blog where author=#{author,jdbcType=VARCHAR} }
想一想,如果假設(shè)authorList的長(zhǎng)度為N,那么我們就需要查詢(xún)N次數(shù)據(jù)庫(kù),如果用這種方法,程序的開(kāi)銷(xiāo)不僅僅是查詢(xún),還有從數(shù)據(jù)庫(kù)連接池中取出連接實(shí)例、建立數(shù)據(jù)庫(kù)連接、將數(shù)據(jù)庫(kù)實(shí)例返還給數(shù)據(jù)庫(kù)連接池,假設(shè)這三個(gè)動(dòng)作加起來(lái)總共用時(shí)0.001秒。那么采取遍歷的辦法查詢(xún),將會(huì)多耗時(shí)0.001N秒,如果需要查詢(xún)1000次,那么將多1秒鐘的時(shí)間,對(duì)于程序猿來(lái)說(shuō),這是不可忍受的,因?yàn)檫@只是一個(gè)循環(huán)查詢(xún),還不算其它的業(yè)務(wù)代碼。
那么,有沒(méi)有更好的辦法呢,答案是肯定,其中之一是動(dòng)態(tài)SQL:
先上代碼:
<select id="dynamicForeachTest" resultType="com.blog.Blog" parameterType="java.util.List"> select * from blog where author in <foreach collection="list" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach> </select>
tem表示集合中每一個(gè)元素進(jìn)行迭代時(shí)的別名,
index指定一個(gè)名字,用于表示在迭代過(guò)程中,每次迭代到的位置,
open表示該語(yǔ)句以什么開(kāi)始,
separator表示在每次進(jìn)行迭代之間以什么符號(hào)作為分隔符,
close表示以什么結(jié)束這樣返回值就可以用List<Bolg>接受.
但是動(dòng)態(tài)SQL中的foreach語(yǔ)句用的最多的實(shí)在insert語(yǔ)句中,并且通常在in子句中使用。
二、高級(jí)映射
在使用mybatis的時(shí)候,一般是使用resultType = com.blog.author 實(shí)體類(lèi)來(lái)接受查詢(xún)結(jié)果
或者是使用resultType = java.util.map將數(shù)據(jù)庫(kù)列名作為key,記錄值作為value返回。
但是這次需要使用resultMap,它可以允許自由組合返回值的形式,用以處理更復(fù)雜的查詢(xún)。
還是先上代碼:
SQL:
<select id="getBlogs" resultMap=" blogs " parameterType="map"> Select a.authorID, a.uthorName, b.blogID, b.blogName from author a left join blog b on a. authorID=b. authorID where a. authorID = #{authorID,jdbcType=INTEGER} </select>
mybatis配置:
<resultMap id="blogs" type="com.bloh.Blog"> <id property="authorID" column=" authorID"> <result property="authorName" column=" authorName"> <collection property="postsList" ofType="com.bolg.Post"> <id property="blogID" column=" blogID"/> <result property="blogName" column="blogName"/> </collection> </resultMap>
Blog實(shí)體類(lèi)
Public class Bolg { private Integer authorID; private String authorName; private List<Post> postsList; //setter getter }
Post實(shí)體類(lèi)
Public class Post { private Integer blogID; private String blogName; //setter getter }
這樣就可以用一個(gè)實(shí)體接受一個(gè)復(fù)雜查詢(xún)了。
下面再介紹下各個(gè)屬性的作用:
其它和普通mybatis查詢(xún)的屬性和配置就不細(xì)說(shuō)了,
resultMap用來(lái)代替resultType,表示查詢(xún)結(jié)果返回的格式
resultMap中的id主要有兩個(gè)作用:
類(lèi)似索引,提高查詢(xún)性能
區(qū)分不同結(jié)果
所以id最好不要省略,如果沒(méi)有主鍵,用能唯一區(qū)分記錄的字段代替
result即實(shí)體類(lèi)中定義的變量名,column是數(shù)據(jù)庫(kù)的列名
collection 就是列表、map等集合
postsList就是在Blog實(shí)體類(lèi)中定義的list變量名
ofType就是對(duì)象列表中對(duì)象的實(shí)體類(lèi)。
三、獲得自增ID:
如果有如下情況,在插入數(shù)據(jù)庫(kù)記錄后,想得到插入記錄的主鍵,用以后面的業(yè)務(wù)代碼
那么mybatis針對(duì)這種情況也提供了相應(yīng)的支持(不支持批量插入):
MySQL是原聲自增ID;假設(shè)自增主鍵的字段名就為ID
<insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="User"> insert into <include refid="TABLE_NAME" /> ( NAME, AGE ) values ( #{name}, #{age} ) </insert>
比普通的插入就多了兩個(gè)屬性 useGeneratedKeys="true" 表示開(kāi)啟返回自增ID
keyProperty="id" 表示返回主鍵的名字。
那么在業(yè)務(wù)代碼中就可以用下列語(yǔ)句接收:
假設(shè)實(shí)體類(lèi)為User
User userNew = userMapper.insert(user);
userNew.getID //即為插入后的自增ID
其實(shí),mysql的自增主鍵可以用select LAST_INSERT_ID();來(lái)得到,
所以,還有一種寫(xiě)法:
<insert id="insert" parameterType="User"> <selectKey resultType="int" order="AFTER" keyProperty="id"> SELECT LAST_INSERT_ID() AS id </selectKey> insert into name,age values ( #{name}, #{age} ) </insert>
和mysql的獲取主鍵方式剛好相反,mysql是insert執(zhí)行后由表分配自增長(zhǎng)的值,而oracle是獲取到自增長(zhǎng)的值后再進(jìn)行插入記錄操作,在執(zhí)行insert sql前必須指定一個(gè)主鍵值給要插入的記錄所以要要在"BEFORE"的時(shí)候拿到自增的序列,然后用selectKey的方式注入到入?yún)⒂成渲屑纯?。假設(shè)自增長(zhǎng)還是id
<insert id=" insert " useGeneratedKeys="true" keyProperty="id" parameterType="xxxx" > <selectKey resultType="int" order="BEFORE" keyProperty="id"> SELECT SEQ_TABLE.NEXTVAL FROM dual </selectKey> INSERT INTO id,name,age VALUES (#{id} #{name}, #{age} ) </insert>
這里的id就是selectKey獲得的自增id。
接收方式和mysql一樣,在獲取自增主鍵時(shí),最好使用實(shí)體接收。
以上所述是小編給大家介紹的Mybatis高級(jí)映射、動(dòng)態(tài)SQL及獲得自增主鍵,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- MyBatis高級(jí)映射學(xué)習(xí)教程
- MyBatis高級(jí)映射和查詢(xún)緩存
- mybatis高級(jí)映射一對(duì)多查詢(xún)實(shí)現(xiàn)代碼
- 基于mybatis高級(jí)映射多對(duì)多查詢(xún)的實(shí)現(xiàn)
- javaMybatis映射屬性,高級(jí)映射詳解
- 解析Mybatis延遲加載問(wèn)題
- MyBatis延遲加載與立即加載案例教程
- MyBatis高級(jí)映射ResultMap解決屬性問(wèn)題
- Mybatis中的延遲加載,以及原理分析
- MyBatis實(shí)現(xiàn)高級(jí)映射的示例代碼
- 詳解MyBatis延遲加載是如何實(shí)現(xiàn)的
- MyBatis高級(jí)映射及延遲加載的實(shí)現(xiàn)
相關(guān)文章
jsp、servlet前后端交互對(duì)數(shù)據(jù)處理及展示的簡(jiǎn)單實(shí)現(xiàn)
Servlet和JSP是Java Web開(kāi)發(fā)中的兩個(gè)重要概念,在Servlet和JSP中前后端交互可以通過(guò)一些方式來(lái)實(shí)現(xiàn),這篇文章主要給大家介紹了關(guān)于jsp、servlet前后端交互對(duì)數(shù)據(jù)處理及展示的簡(jiǎn)單實(shí)現(xiàn),需要的朋友可以參考下2023-12-12springboot如何通過(guò)SSH連接遠(yuǎn)程服務(wù)器
這篇文章主要介紹了springboot如何通過(guò)SSH連接遠(yuǎn)程服務(wù)器問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07SpringBoot嵌入式Servlet容器與定制化組件超詳細(xì)講解
這篇文章主要介紹了SpringBoot嵌入式Servlet容器與定制化組件的使用介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-10-10使用spring-cache一行代碼解決緩存擊穿問(wèn)題
本文主要介紹了使用spring-cache一行代碼解決緩存擊穿問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04spring boot里增加表單驗(yàn)證hibernate-validator并在freemarker模板里顯示錯(cuò)誤信息(推
這篇文章主要介紹了spring boot里增加表單驗(yàn)證hibernate-validator并在freemarker模板里顯示錯(cuò)誤信息的相關(guān)資料,需要的朋友可以參考下2018-01-01基于紅黑樹(shù)插入操作原理及java實(shí)現(xiàn)方法(分享)
下面小編就為大家分享一篇基于紅黑樹(shù)插入操作原理及java實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12SpringBoot集成canal實(shí)現(xiàn)示例解析
這篇文章主要為大家介紹了springboot整合canal的示例實(shí)現(xiàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多多進(jìn)步,早日升職加薪2022-02-02Spring注解驅(qū)動(dòng)之BeanDefinitionRegistryPostProcessor原理解析
這篇文章主要介紹了Spring注解驅(qū)動(dòng)之BeanDefinitionRegistryPostProcessor原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09