摘要:場(chǎng)合常見(jiàn)一些明細(xì)記錄的展示,將關(guān)聯(lián)查詢(xún)信息全部展示在頁(yè)面時(shí),此時(shí)可直接使用將每一條記錄映射到中,在前端頁(yè)面遍歷中是即可。如果查詢(xún)單表就可以滿足需求,一開(kāi)始先查詢(xún)單表,當(dāng)需要關(guān)聯(lián)信息時(shí),再關(guān)聯(lián)查詢(xún),當(dāng)需要關(guān)聯(lián)信息再查詢(xún)這個(gè)叫延遲加載。
配置文件和映射文件還有挺多的屬性我還沒(méi)有講的,現(xiàn)在就把它們一一補(bǔ)全
映射文件在mapper.xml文件中配置很多的sql語(yǔ)句,執(zhí)行每個(gè)sql語(yǔ)句時(shí),封裝為MappedStatement對(duì)象,mapper.xml以statement為單位管理sql語(yǔ)句
Statement的實(shí)際位置就等于namespace+StatementId
占位符在Mybatis中,有兩種占位符
#{}解析傳遞進(jìn)來(lái)的參數(shù)數(shù)據(jù)
${}對(duì)傳遞進(jìn)來(lái)的參數(shù)原樣拼接在SQL中
主鍵生成策略如果我們?cè)贖ibernate中,當(dāng)我們插入數(shù)據(jù)的時(shí)候,我們是可以選擇是UUID策略的...
那么在Mybatis是怎么做的呢??
UUID主鍵返回select uuid() INSERT INTO USER(id,username,birthday,sex,address) VALUES(#{id},#{username},#{birthday},#{sex},#{address})
如果我們一般插入數(shù)據(jù)的話,如果我們想要知道剛剛插入的數(shù)據(jù)的主鍵是多少,我們可以通過(guò)以下的方式來(lái)獲取
需求:
user對(duì)象插入到數(shù)據(jù)庫(kù)后,新記錄的主鍵要通過(guò)user對(duì)象返回,通過(guò)user獲取主鍵值。
解決思路:
通過(guò)LAST_INSERT_ID()獲取剛插入記錄的自增主鍵值,在insert語(yǔ)句執(zhí)行后,執(zhí)行select LAST_INSERT_ID()就可以獲取自增主鍵。
mysql:
select LAST_INSERT_ID() INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address})
oracle:
實(shí)現(xiàn)思路:
先查詢(xún)序列得到主鍵,將主鍵設(shè)置到user對(duì)象中,將user對(duì)象插入數(shù)據(jù)庫(kù)。
resultMapselect 序列.nextval() from dual INSERT INTO USER(id,username,birthday,sex,address) VALUES( 序列.nextval(),#{username},#{birthday},#{sex},#{address})
有的時(shí)候,我們看別的映射文件,可能看不到以下這么一段代碼:
因?yàn)椋?strong>如果我們的數(shù)據(jù)表的字段和JavaBean的屬性名稱(chēng)是相同時(shí),我們就不用上面那段代碼了。Mybatis會(huì)自動(dòng)幫我們把返回的結(jié)果進(jìn)行封裝成JavaBean
那當(dāng)我們數(shù)據(jù)表的字段和JavaBean的屬性名稱(chēng)不是相同時(shí),我們就需要使用resultMap,也就是上面那段代碼
當(dāng)然了,在正常情況下列名和JavaBean的屬性名一般都是不同的,因此還是需要resultMap的。
resultMap和resultType區(qū)別resultType :指定輸出結(jié)果的類(lèi)型(pojo、簡(jiǎn)單類(lèi)型、hashmap..),將sql查詢(xún)結(jié)果映射為java對(duì)象 。
使用resultType注意:sql查詢(xún)的列名要和resultType指定pojo的屬性名相同,指定相同 屬性方可映射成功,如果sql查詢(xún)的列名要和resultType指定pojo的屬性名全部不相同,list中無(wú)法創(chuàng)建pojo對(duì)象的。
resultMap:將sql查詢(xún)結(jié)果映射為java對(duì)象。
如果sql查詢(xún)列名和最終要映射的pojo的屬性名不一致,使用resultMap將列名和pojo的屬性名做一個(gè)對(duì)應(yīng)關(guān)系 (列名和屬性名映射配置)
使用resultMapresultType和resultMap用法總結(jié)
resultType:
作用:
將查詢(xún)結(jié)果按照sql列名pojo屬性名一致性映射到pojo中。
場(chǎng)合:
常見(jiàn)一些明細(xì)記錄的展示,將關(guān)聯(lián)查詢(xún)信息全部展示在頁(yè)面時(shí),此時(shí)可直接使用resultType將每一條記錄映射到pojo中,在前端頁(yè)面遍歷list(list中是pojo)即可。
resultMap:
使用association和collection完成一對(duì)一和一對(duì)多高級(jí)映射。
association:
作用:
將關(guān)聯(lián)查詢(xún)信息映射到一個(gè)pojo類(lèi)中。
場(chǎng)合:
為了方便獲取關(guān)聯(lián)信息可以使用association將關(guān)聯(lián)訂單映射為pojo,比如:查詢(xún)訂單及關(guān)聯(lián)用戶信息。
collection:
作用:
將關(guān)聯(lián)查詢(xún)信息映射到一個(gè)list集合中。
場(chǎng)合:
為了方便獲取關(guān)聯(lián)信息可以使用collection將關(guān)聯(lián)信息映射到list集合中,比如:查詢(xún)用戶權(quán)限范圍模塊和功能,可使用collection將模塊和功能列表映射到list中。
Collection在前面好像并沒(méi)有用過(guò),下面就看一下它的用法:
Order與OrderDetails關(guān)系
package cn.itcast.mybatis.po; import java.io.Serializable; import java.util.Date; import java.util.List; public class Orders implements Serializable { private Integer id; private Integer userId; private String number; private Date createtime; private String note; //關(guān)聯(lián)用戶信息 private User user; //訂單明細(xì) private Listorderdetails; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number == null ? null : number.trim(); } public Date getCreatetime() { return createtime; } public void setCreatetime(Date createtime) { this.createtime = createtime; } public String getNote() { return note; } public void setNote(String note) { this.note = note == null ? null : note.trim(); } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public List getOrderdetails() { return orderdetails; } public void setOrderdetails(List orderdetails) { this.orderdetails = orderdetails; } }
SQL語(yǔ)句
resultMap
一般地使用resultMap會(huì)多一點(diǎn)。
Mybatis映射文件處理特殊字符第一種方法:
用了轉(zhuǎn)義字符把>和<替換掉,然后就沒(méi)有問(wèn)題了。
SELECT * FROM test WHERE 1 = 1 AND start_date <= CURRENT_DATE AND end_date >= CURRENT_DATE
第二種方法:
配置文件 別名typeAliases別名:
自定義別名:
Mapper加載
延遲加載
在進(jìn)行數(shù)據(jù)查詢(xún)時(shí),為了提高數(shù)據(jù)庫(kù)查詢(xún)性能,盡量使用單表查詢(xún),因?yàn)閱伪聿樵?xún)比多表關(guān)聯(lián)查詢(xún)速度要快。
如果查詢(xún)單表就可以滿足需求,一開(kāi)始先查詢(xún)單表,當(dāng)需要關(guān)聯(lián)信息時(shí),再關(guān)聯(lián)查詢(xún),當(dāng)需要關(guān)聯(lián)信息再查詢(xún)這個(gè)叫延遲加載。
在Mybatis中延遲加載就是在resultMap中配置具體的延遲加載..
在Mybatis的文件中配置全局延遲加載
延遲加載測(cè)試
當(dāng)需要用戶時(shí)調(diào)用 Orders類(lèi)中的getUser()方法執(zhí)行延遲加載 ,向數(shù)據(jù)庫(kù)發(fā)出sql。
由于是對(duì)User進(jìn)行延遲加載,那么我們只要查詢(xún)Orders相關(guān)的信息即可了
使用resultMap來(lái)配置延遲加載
總結(jié)
在程序中調(diào)用的SQL語(yǔ)句是由映射文件的命令空間+sql片段的id所組成的。它內(nèi)部會(huì)生成一個(gè)Statement對(duì)象的。
在使用別名的時(shí)候,可以指定包名,在使用總配置文件加載映射文件時(shí),也可以指定包名。
主鍵如果需要返回的話,使用selectKey 標(biāo)簽即可。UUID也可以返回。在Oracle的話,是使用序列來(lái)返回自動(dòng)增長(zhǎng)的主鍵的。
占位符有兩種,一種是解析傳遞進(jìn)來(lái)的參數(shù)數(shù)據(jù)、一種是原樣輸出傳遞進(jìn)來(lái)的數(shù)據(jù)。
如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號(hào):Java3y
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/68757.html
摘要:前言由于寫(xiě)的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 前言 由于寫(xiě)的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 由于更新比較頻繁,因此隔一段時(shí)間才會(huì)更新目錄導(dǎo)航哦~想要獲取最新原創(chuàng)的技術(shù)文章歡迎關(guān)注我的公眾號(hào):Java3y Java3y文章目錄導(dǎo)航 Java基礎(chǔ) 泛型就這么簡(jiǎn)單 注解就這么簡(jiǎn)單 Druid數(shù)據(jù)庫(kù)連接池...
摘要:有必要建一個(gè)資源服務(wù)器存放靜態(tài)資源。一些用戶級(jí)別的數(shù)據(jù)輕量可以考慮存儲(chǔ)在中。存儲(chǔ)的是值,可以通過(guò)來(lái)對(duì)和對(duì)象之間的轉(zhuǎn)換如果我們的數(shù)據(jù)是在后臺(tái)傳過(guò)去或者轉(zhuǎn)換而成的,在前臺(tái)上并沒(méi)有做什么改變的話。 移動(dòng)商城項(xiàng)目總結(jié) 移動(dòng)商城項(xiàng)目是我第二個(gè)做得比較大的項(xiàng)目,該項(xiàng)目系統(tǒng)來(lái)源于傳智Java168期,十天的視頻課程(想要視頻的同學(xué)關(guān)注我的公眾號(hào)就可以直接獲取了) 通過(guò)這次的項(xiàng)目又再次開(kāi)闊了我的視野,...
摘要:前言嗨,小伙伴們,這篇博文將帶大家手寫(xiě),讓大家對(duì)的核心原理以及工作流程有更加深刻的理解。模塊顧名思義,就是框架配置類(lèi),用于解析配置文件加載相關(guān)環(huán)境。配置模塊這里的對(duì)框架的配置使用了簡(jiǎn)單的,主要原因還是簡(jiǎn)單易懂然后節(jié)省時(shí)間。 前言 (????)??嗨,小伙伴們,這篇博文將帶大家手寫(xiě)mybatis,讓大家對(duì)mybaits的核心原理以及工作流程有更加深刻的理解。在上篇Spring-Mybat...
摘要:學(xué)習(xí)筆記有官方的中文開(kāi)發(fā)文檔并且針對(duì)使用者比較友好是一款優(yōu)秀的持久層框架,它支持定制化存儲(chǔ)過(guò)程以及高級(jí)映射。它只和配置有關(guān),存在的意義僅在于用來(lái)減少類(lèi)完全限定名的冗余,為了簡(jiǎn)化中的書(shū)寫(xiě)。 Mybatis學(xué)習(xí)筆記 mybatis有官方的中文開(kāi)發(fā)文檔并且針對(duì)使用者比較友好:http://www.mybatis.org/mybatis-3/zh/ MyBatis 是一款優(yōu)秀的持久層框架,它支...
摘要:主要有兩種解決方案,一種是使用注解解決一切問(wèn)題,一種是簡(jiǎn)化后的老傳統(tǒng)。新建項(xiàng)目默認(rèn)為,直接改為,另外新增一個(gè)用戶不同環(huán)境使用不同的配置文件用。配置指定配置文件為配置開(kāi)啟駝峰命名轉(zhuǎn)換,如。 倉(cāng)庫(kù)地址:spring-boot-learning歡迎star、fork,給作者一些鼓勵(lì) 前言 Mybatis 初期使用比較麻煩,需要各種配置文件、實(shí)體類(lèi)、Dao 層映射關(guān)聯(lián)、還有一大推其它配置。my...
閱讀 2453·2023-04-25 20:07
閱讀 3375·2021-11-25 09:43
閱讀 3761·2021-11-16 11:44
閱讀 2585·2021-11-08 13:14
閱讀 3235·2021-10-19 11:46
閱讀 952·2021-09-28 09:36
閱讀 3152·2021-09-22 10:56
閱讀 2444·2021-09-10 10:51