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