MyBatis-Plus未集成SQL語(yǔ)句的場(chǎng)景與解決方案
復(fù)雜多表關(guān)聯(lián)查詢
MyBatis-Plus 的 @TableName 和 @TableField 注解主要針對(duì)單表操作,多表關(guān)聯(lián)查詢需自定義 SQL。
<!-- XML 映射文件示例 -->
<select id="selectUserWithRole" resultType="map">
SELECT u.*, r.role_name
FROM user u
LEFT JOIN user_role ur ON u.id = ur.user_id
LEFT JOIN role r ON ur.role_id = r.id
WHERE u.status = 1
</select>對(duì)應(yīng) Mapper 接口需聲明方法:
@Mapper
public interface UserMapper extends BaseMapper<User> {
List<Map<String, Object>> selectUserWithRole();
}存儲(chǔ)過程調(diào)用
MyBatis-Plus 未直接封裝存儲(chǔ)過程調(diào)用,需通過注解或 XML 實(shí)現(xiàn)。
<select id="callCalculateStats" statementType="CALLABLE">
{call calculate_user_stats(#{userId, mode=IN})}
</select>注解方式:
@Select("{call calculate_user_stats(#{userId})}")
void callCalculateStats(@Param("userId") Long userId);動(dòng)態(tài) SQL 片段復(fù)用
雖然 MyBatis-Plus 提供 Wrapper,但復(fù)雜動(dòng)態(tài) SQL 仍需使用 <sql> 和 <include>。
<sql id="baseColumn">
id, name, create_time
</sql>
<select id="selectCustom" resultType="User">
SELECT <include refid="baseColumn"/>
FROM user WHERE ${ew.customSqlSegment}
</select>批量插入優(yōu)化
MyBatis-Plus 的 saveBatch 默認(rèn)逐條插入,需手動(dòng)編寫批量語(yǔ)句提升性能。
<insert id="insertBatch" parameterType="java.util.List">
INSERT INTO user (name, age) VALUES
<foreach collection="list" item="item" separator=",">
(#{item.name}, #{item.age})
</foreach>
</insert>特殊數(shù)據(jù)庫(kù)函數(shù)
如 PostgreSQL 的 JSONB 操作、Oracle 的 CONNECT BY 等方言功能需自定義 SQL。
<select id="selectJsonData" resultType="map">
SELECT id, info->>'$.address' AS address
FROM user WHERE info @> '{"status":1}'
</select>自定義結(jié)果集處理
復(fù)雜結(jié)果集映射需通過 @ResultMap 或 @Results 注解實(shí)現(xiàn)。
@Results({
@Result(property = "id", column = "user_id"),
@Result(property = "details", column = "user_id",
many = @Many(select = "selectUserDetails"))
})
@Select("SELECT id AS user_id FROM user WHERE id = #{id}")
User selectUserWithDetails(Long id);注意事項(xiàng)
- SQL 注入風(fēng)險(xiǎn):動(dòng)態(tài) SQL 避免直接拼接參數(shù),使用
#{param}占位符 - 性能監(jiān)控:復(fù)雜 SQL 需通過 EXPLAIN 分析執(zhí)行計(jì)劃
- 跨數(shù)據(jù)庫(kù)兼容:方言函數(shù)建議抽離為數(shù)據(jù)庫(kù)廠商判斷分支
通過結(jié)合 MyBatis-Plus 的快捷方法和自定義 SQL,能覆蓋絕大多數(shù)業(yè)務(wù)場(chǎng)景的需求。
以上就是MyBatis-Plus未集成SQL語(yǔ)句的場(chǎng)景與解決方案的詳細(xì)內(nèi)容,更多關(guān)于MyBatis-Plus未集成SQL語(yǔ)句的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringSecurity權(quán)限控制實(shí)現(xiàn)原理解析
這篇文章主要介紹了SpringSecurity權(quán)限控制實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
詳解jeefast和Mybatis實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)的問題
這篇文章主要介紹了詳解jeefast和Mybatis實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)的問題,本文通過圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Springboot+Thymeleaf+Jpa實(shí)現(xiàn)登錄功能(附源碼)
最近有學(xué)習(xí)到關(guān)于Springboot+Thymeleaf+Jpa的綜合運(yùn)用知識(shí),因此想寫一個(gè)簡(jiǎn)單的登錄界面來嘗試一下,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
如何解決springboot數(shù)據(jù)庫(kù)查詢時(shí)出現(xiàn)的時(shí)區(qū)差異問題
這篇文章主要介紹了如何解決springboot數(shù)據(jù)庫(kù)查詢時(shí)出現(xiàn)的時(shí)區(qū)差異問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
SpringMVC Controller解析ajax參數(shù)過程詳解
這篇文章主要介紹了SpringMVC Controller解析ajax參數(shù)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
java swing 創(chuàng)建一個(gè)簡(jiǎn)單的QQ界面教程
這篇文章主要介紹了java swing 創(chuàng)建一個(gè)簡(jiǎn)單的QQ界面教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
java 多線程實(shí)現(xiàn)在線咨詢(udp)
這篇文章主要介紹了java 多線程實(shí)現(xiàn)在線咨詢(udp)的示例,幫助大家更好的理解和學(xué)習(xí)Java 網(wǎng)絡(luò)編程的相關(guān)內(nèi)容,感興趣的朋友可以了解下2020-11-11
javax.validation自定義日期范圍校驗(yàn)注解操作
這篇文章主要介紹了javax.validation自定義日期范圍校驗(yàn)注解操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09

