MyBatis Plus中執(zhí)行原生SQL語句方法常見方案
在MyBatis Plus中執(zhí)行原生SQL語句,可以根據(jù)項目配置、個人偏好以及SQL的復(fù)雜程度選擇不同的方法。下面的表格對比了幾種常見方案:
| 方法 | 核心思路 | 適用場景與說明 |
|---|---|---|
| SqlRunner | 使用MyBatis Plus提供的工具類,無需Mapper。 | ? 快速簡單,適用于臨時執(zhí)行SQL,無需編寫Mapper接口或XML。需在配置中啟用。 |
| @Select注解 | 將SQL語句直接寫在Mapper接口的方法上。 | ? 推薦用于固定SQL,代碼簡潔。SQL較長時可能影響可讀性。 |
| XML映射文件 | 將SQL語句寫在XML文件中,通過Mapper接口調(diào)用。 | ? 推薦用于復(fù)雜SQL或動態(tài)SQL,利于維護(hù)和管理較長、較復(fù)雜的SQL。 |
| 自定義Mapper方法 | 在Mapper接口中定義方法,使用**${nativeSql}**接收SQL字符串。 | ?? 高度靈活,但存在SQL注入風(fēng)險,除非必要,一般不推薦使用。 |
?? 如何使用這些方法
下面詳細(xì)說明前三種推薦方法的具體使用步驟。
1. 使用 SqlRunner 工具類
如果只是想快速執(zhí)行一個SQL,不希望定義額外的Mapper接口和XML文件,SqlRunner是一個很方便的選擇。
第一步:啟用SqlRunner
在application.yml配置文件中開啟SqlRunner:
mybatis-plus:
global-config:
enable-sql-runner: true如果使用的是application.properties,則添加:
mybatis-plus.global-config.enable-sql-runner=true
第二步:編寫Java代碼
在Service或Controller中直接調(diào)用:
import com.baomidou.mybatisplus.extension.toolkit.SqlRunner;
import java.util.List;
import java.util.Map;
public class YourService {
public void executeSQL() {
String sql = "SELECT section_name AS 標(biāo)段名稱, company_name AS 公司名稱, equipment_quote AS 設(shè)備報價 FROM wind_turbine_project_quote_detail";
// 執(zhí)行查詢,返回一個Map列表,每個Map對應(yīng)一行數(shù)據(jù)
List<Map<String, Object>> resultList = SqlRunner.db().selectList(sql);
// 遍歷結(jié)果
for (Map<String, Object> row : resultList) {
System.out.println("標(biāo)段名稱: " + row.get("標(biāo)段名稱"));
System.out.println("公司名稱: " + row.get("公司名稱"));
System.out.println("設(shè)備報價: " + row.get("設(shè)備報價"));
}
}
}2. 使用 @Select 注解
對于固定的SQL,這是一種非常簡潔的方式。
在Mapper接口中定義方法
在Mapper接口(例如WindTurbineMapper)中,使用@Select注解:
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;
@Mapper
public interface WindTurbineMapper {
@Select("SELECT section_name AS \"標(biāo)段名稱\", company_name AS \"公司名稱\", equipment_quote AS \"設(shè)備報價\" FROM wind_turbine_project_quote_detail")
List<Map<String, Object>> selectQuoteDetail();
}注意:如果別名是中文,建議使用轉(zhuǎn)義的雙引號\"括起來。
在Service中調(diào)用
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
@Service
public class WindTurbineService {
@Autowired
private WindTurbineMapper windTurbineMapper;
public void getQuoteDetail() {
List<Map<String, Object>> resultList = windTurbineMapper.selectQuoteDetail();
// ... 處理結(jié)果
}
}3. 使用 XML 映射文件
這是管理復(fù)雜SQL的傳統(tǒng)且強(qiáng)大的方式。
第一步:創(chuàng)建Mapper接口
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
import java.util.Map;
@Mapper
public interface WindTurbineMapper {
List<Map<String, Object>> selectQuoteDetail();
}第二步:創(chuàng)建XML映射文件
在resources/mapper目錄(如果沒有請手動創(chuàng)建)下,創(chuàng)建一個對應(yīng)的XML文件,例如WindTurbineMapper.xml。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yourpackage.mapper.WindTurbineMapper">
<select id="selectQuoteDetail" resultType="java.util.Map">
SELECT
section_name AS "標(biāo)段名稱",
company_name AS "公司名稱",
equipment_quote AS "設(shè)備報價"
FROM wind_turbine_project_quote_detail
</select>
</mapper>注意:namespace必須填寫Mapper接口的全限定名(包括包名),id是接口中的方法名。
第三步:在Service中調(diào)用
調(diào)用方式與使用@Select注解的例子完全相同。
?? 注意事項
- 結(jié)果處理:以上方法返回的都是
List<Map<String, Object>>,需要通過Map的鍵(即查詢中的別名,如"標(biāo)段名稱")來獲取值。 - SQL注入:使用
SqlRunner或@Select注解時,請確保SQL語句是固定可控的,不要直接拼接用戶輸入,以防SQL注入攻擊。如果SQL條件需要動態(tài)變化,請考慮使用MyBatis Plus的條件構(gòu)造器配合XML,或者使用MyBatis的動態(tài)SQL功能。 - 配置掃描:確保MyBatis Plus配置正確掃描到了Mapper接口和XML文件。如果XML文件不在默認(rèn)位置,可能需要在配置文件中指定
mybatis-plus.mapper-locations。
到此這篇關(guān)于MyBatis Plus中執(zhí)行原生SQL語句方法的文章就介紹到這了,更多相關(guān)MyBatis Plus執(zhí)行原生SQL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot如何整合redis實現(xiàn)過期key監(jiān)聽事件
這篇文章主要介紹了SpringBoot如何整合redis實現(xiàn)過期key監(jiān)聽事件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
Java數(shù)據(jù)結(jié)構(gòu)與算法之樹(動力節(jié)點java學(xué)院整理)
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)與算法之樹的相關(guān)知識,最主要的是二叉樹中的二叉搜索樹,需要的朋友可以參考下2017-04-04
springboot項目跟JavaScript簡單websocket使用方式
WebSocket是一種實現(xiàn)客戶端與服務(wù)器全雙工通信的協(xié)議,它提供了低延遲和雙向數(shù)據(jù)傳輸,適用于實時應(yīng)用,通過Java的Spring框架輕松集成WebSocket,實現(xiàn)服務(wù)器端與客戶端的實時通信2026-01-01
java進(jìn)行遠(yuǎn)程部署與調(diào)試及原理詳解
這篇文章主要介紹了java進(jìn)行遠(yuǎn)程部署與調(diào)試及原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12
Java8 自定義CompletableFuture的原理解析
這篇文章主要介紹了Java8 自定義CompletableFuture的原理解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
Java中ThreadLocalMap解決Hash沖突的實現(xiàn)方式
本文主要介紹了Java中ThreadLocalMap解決Hash沖突的實現(xiàn)方式,主要方式是使用線性探測法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-04-04
Java?中的?synchronized?關(guān)鍵字詳解
本文詳細(xì)介紹了Java中的synchronized關(guān)鍵字,包括其基本概念、工作原理、使用場景、性能優(yōu)化技巧以及常見問題與解決方案,感興趣的朋友跟隨小編一起看看吧2025-11-11

