Mybatis模糊查詢及自動(dòng)映射實(shí)現(xiàn)詳解
這篇文章主要介紹了Mybatis模糊查詢及自動(dòng)映射實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
Mybatis的模糊查詢
1. 參數(shù)中直接加入%%
1
2
3
4
5
6
7
8
9
param.setUsername("%CD%");
param.setPassword("%11%");
<select id="selectPersons" resultType="person" parameterType="person">
select id,sex,age,username,password from person where true
<if test="username!=null"> AND username LIKE #{username}</if>
<if test="password!=null">AND password LIKE #{password}</if>
</select>
2. bind標(biāo)簽
1
2
3
4
5
6
<select id="selectPersons" resultType="person" parameterType="person">
<bind name="pattern" value="'%' + _parameter.username + '%'" />
select id,sex,age,username,password
from person
where username LIKE #{pattern}
</select>
3. CONCAT
1
where username LIKE concat(concat('%',#{username}),'%')
Mybatis的自動(dòng)映射
0x00:引子
在 MyBatis 的映射配置文件中,select 標(biāo)簽查詢配置結(jié)果集時(shí)使用過(guò) resultType 屬性,當(dāng)在 resultType 中定義一個(gè) Java 包裝類時(shí),如果 sql 語(yǔ)句查詢的結(jié)果中有列名與該 Java 包裝類中的屬性名一致,則該字段就會(huì)被映射到該屬性上。這里用到的就是 MyBatis 的自動(dòng)映射功能,
當(dāng) sql 語(yǔ)句查詢出結(jié)果時(shí),如果對(duì)應(yīng)輸出配置的 Java 包裝類中有相同名稱的屬性,且擁有 set 方法,則該結(jié)果就會(huì)被自動(dòng)映射。
0x01:原理
MyBatis 的自動(dòng)映射功能是建立在 resultMap 基礎(chǔ)之上的。resultType 屬性自動(dòng)映射的原理是,當(dāng) sql 映射輸出配置為 resultType 時(shí),MyBatis 會(huì)生成一個(gè)空的 resultMap,然后指定這個(gè) resultMap 的 type 為指定的 resultType 的類型,接著 MyBatis 檢測(cè)查詢結(jié)果集中字段與指定 type 類型中屬性的映射關(guān)系,對(duì)結(jié)果進(jìn)行自動(dòng)映射。
在 MyBatis 全局配置文件中,在 setting 標(biāo)簽內(nèi)設(shè)置自動(dòng)映射模式:
<setting name="autoMappingBehavior" value="PARTIAL"/>
0x02:配置
在 MyBatis 中,自動(dòng)映射有三種模式,分別是 NONE、PARTIAL、FULL。其中 NONE 表示不啟用自動(dòng)映射,PARTIAL 表示只對(duì)非嵌套的 resultMap 進(jìn)行自動(dòng)映射,F(xiàn)ULL 表示對(duì)所有的 resultMap 都進(jìn)行自動(dòng)映射。默認(rèn)的自動(dòng)映射模式為 PARTIAL。
0x03:拓展
在 sql 查詢結(jié)果中,如果只有部分字段與輸入配置類型中的屬性名稱不一樣,則可以僅在 resultMap 中指定不一樣的字段對(duì)應(yīng)的輸出類型的屬性,其他的則會(huì)直接進(jìn)行自動(dòng)映射。
例如以下示例,Java 包裝類中用戶名屬性為 username,而在 t_user 表中用戶名的字段名為 name,這里需要手動(dòng)映射 name 字段,其他的屬性可以通過(guò)默認(rèn)的自動(dòng)映射機(jī)制來(lái)映射:
<resultMap type="cn.com.mybatis.pojo.User" id="UserResult"> <result property="username" column="name"/> </resultMap> <select id="findUserById" parameterType="java.lang.Long" resultMap="UserResult"> select id,name,email from t_user where id=#{id} </select>
在 User 類中,包含了手動(dòng)映射的 username 屬性和自動(dòng)映射的 id、email 屬性。
如果在某些 resultMap 中不想使用自動(dòng)映射,則可以單獨(dú)在該 resultMap 中設(shè)置 autoMapping 的屬性為 false,此時(shí)該 resultMap 僅映射指定的映射字段:
<select id="findUserById" parameterType="java.lang.Long" resultMap="UserResult" autoMapping="false"> select id,name,email from t_user where id=#{id} </select>
當(dāng)配置了 autoMapping 屬性后,就會(huì)忽略全局配置文件中的 autoMappingBehavior 映射模式。
0x04:關(guān)于 FULL
關(guān)于 FULL 模式,應(yīng)該謹(jǐn)慎使用,該模式不管 resultMap 是嵌套的還是非嵌套的,都會(huì)進(jìn)行自動(dòng)映射,這可能會(huì)造成某些嵌套屬性與查詢結(jié)果的字段名一致而誤被自動(dòng)映射,例如以下示例:
<resultMap id="replyResult" type="cn.com.mybatis.pojo.Reply"> <association property="user" resultMap="userResult"/> </resultMap> <resultMap id="userResult" type="cn.com.mybatis.pojo.User"> <result property="username" column="name"/> </resultMap> <select id="queryReplyInfo" parameterType="java.lang.Long" resultMap="replyResult"> select R.id,R.title,R.info,U.name form reply R left join t_user U on R.user_id = U.id where R.id=#{id} </select>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- MyBatis注解開發(fā)之實(shí)現(xiàn)自定義映射關(guān)系和關(guān)聯(lián)查詢
- MyBatis自定義映射關(guān)系和關(guān)聯(lián)查詢實(shí)現(xiàn)方法詳解
- 基于mybatis查詢結(jié)果映射不到對(duì)象的處理
- mybatis框架的xml映射文件常用查詢指南
- 基于mybatis高級(jí)映射多對(duì)多查詢的實(shí)現(xiàn)
- mybatis高級(jí)映射一對(duì)多查詢實(shí)現(xiàn)代碼
- MyBatis中多對(duì)多關(guān)系的映射和查詢
- MyBatis高級(jí)映射和查詢緩存
- Mybatis實(shí)現(xiàn)一對(duì)一查詢映射處理
相關(guān)文章
Java 如何從list中刪除符合條件的數(shù)據(jù)
這篇文章主要介紹了Java 如何從list中刪除符合條件的數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11redis實(shí)現(xiàn)分布式鎖實(shí)例詳解
這篇文章主要為大家詳細(xì)介紹了redis實(shí)現(xiàn)分布式鎖實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03Eclipse/MyEclipse轉(zhuǎn)IntelliJ IDEA完全攻略(圖文)
這篇文章主要介紹了Eclipse/MyEclipse轉(zhuǎn)IntelliJ IDEA完全攻略(圖文),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之排序算法
排序算法是《數(shù)據(jù)結(jié)構(gòu)與算法》中最基本的算法之一。排序算法可以分為內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的排序記錄,在排序過(guò)程中需要訪問(wèn)外存2022-02-02SpringBoot集成PDFBox實(shí)現(xiàn)電子簽章的代碼詳解
Apache PDFBox 是一個(gè)開源的 Java 庫(kù),用于處理 PDF 文檔,它提供了一系列強(qiáng)大的功能,包括創(chuàng)建、渲染、拆分、合并、加密、解密 PDF 文件,以及從 PDF 中提取文本和元數(shù)據(jù)等,本文給大家介紹了SpringBoot集成PDFBox實(shí)現(xiàn)電子簽章,需要的朋友可以參考下2024-09-09java搭建一個(gè)Socket服務(wù)器響應(yīng)多用戶訪問(wèn)
本篇文章主要介紹了java搭建一個(gè)Socket服務(wù)器響應(yīng)多用戶訪問(wèn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02