在MyBatis Plus中执行原生SQL语句,可以根据项目配置、个人偏好以及SQL的复杂程度选择不同的方法。下面的表格对比了几种常见方案:
| 方法 | 核心思路 | 适用场景与说明 |
|---|---|---|
| SqlRunner | 使用MyBatis Plus提供的工具类,无需Mapper。 | ✨ 快速简单,适用于临时执行SQL,无需编写Mapper接口或XML。需在配置中启用。 |
| @Select注解 | 将SQL语句直接写在Mapper接口的方法上。 | ✨ 推荐用于固定SQL,代码简洁。SQL较长时可能影响可读性。 |
| XML映射文件 | 将SQL语句写在XML文件中,通过Mapper接口调用。 | ✨ 推荐用于复杂SQL或动态SQL,利于维护和管理较长、较复杂的SQL。 |
| 自定义Mapper方法 | 在Mapper接口中定义方法,使用**${nativeSql}**接收SQL字符串。 |
💡 高度灵活,但存在SQL注入风险,除非必要,一般不推荐使用。 |
💡 如何使用这些方法
下面详细说明前三种推荐方法的具体使用步骤。
1. 使用 SqlRunner 工具类
如果只是想快速执行一个SQL,不希望定义额外的Mapper接口和XML文件,SqlRunner是一个很方便的选择。
-
第一步:启用SqlRunner
在
application.yml配置文件中开启SqlRunner:yamlmybatis-plus: global-config: enable-sql-runner: true如果使用的是
application.properties,则添加:propertiesmybatis-plus.global-config.enable-sql-runner=true -
第二步:编写Java代码
在Service或Controller中直接调用:
javaimport 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 标段名称, company_name AS 公司名称, equipment_quote AS 设备报价 FROM wind_turbine_project_quote_detail"; // 执行查询,返回一个Map列表,每个Map对应一行数据 List<Map<String, Object>> resultList = SqlRunner.db().selectList(sql); // 遍历结果 for (Map<String, Object> row : resultList) { System.out.println("标段名称: " + row.get("标段名称")); System.out.println("公司名称: " + row.get("公司名称")); System.out.println("设备报价: " + row.get("设备报价")); } } }
2. 使用 @Select 注解
对于固定的SQL,这是一种非常简洁的方式。
-
在Mapper接口中定义方法
在Mapper接口(例如
WindTurbineMapper)中,使用@Select注解:javaimport 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 \"标段名称\", company_name AS \"公司名称\", equipment_quote AS \"设备报价\" FROM wind_turbine_project_quote_detail") List<Map<String, Object>> selectQuoteDetail(); }注意 :如果别名是中文,建议使用转义的双引号
\"括起来。 -
在Service中调用
javaimport 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(); // ... 处理结果 } }
3. 使用 XML 映射文件
这是管理复杂SQL的传统且强大的方式。
-
第一步:创建Mapper接口
javaimport org.apache.ibatis.annotations.Mapper; import java.util.List; import java.util.Map; @Mapper public interface WindTurbineMapper { List<Map<String, Object>> selectQuoteDetail(); } -
第二步:创建XML映射文件
在
resources/mapper目录(如果没有请手动创建)下,创建一个对应的XML文件,例如WindTurbineMapper.xml。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 "标段名称", company_name AS "公司名称", equipment_quote AS "设备报价" FROM wind_turbine_project_quote_detail </select> </mapper>注意 :
namespace必须填写Mapper接口的全限定名 (包括包名),id是接口中的方法名。 -
第三步:在Service中调用
调用方式与使用
@Select注解的例子完全相同。
⚠️ 注意事项
- 结果处理 :以上方法返回的都是
List<Map<String, Object>>,需要通过Map的键(即查询中的别名,如"标段名称")来获取值。 - SQL注入 :使用
SqlRunner或@Select注解时,请确保SQL语句是固定可控的,不要直接拼接用户输入,以防SQL注入攻击。如果SQL条件需要动态变化,请考虑使用MyBatis Plus的条件构造器配合XML,或者使用MyBatis的动态SQL功能。 - 配置扫描 :确保MyBatis Plus配置正确扫描到了Mapper接口和XML文件。如果XML文件不在默认位置,可能需要在配置文件中指定
mybatis-plus.mapper-locations。