MyBatis Plus中执行原生SQL语句方法

在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

    yaml 复制代码
    mybatis-plus:
      global-config:
        enable-sql-runner: true

    如果使用的是application.properties,则添加:

    properties 复制代码
    mybatis-plus.global-config.enable-sql-runner=true
  • 第二步:编写Java代码

    在Service或Controller中直接调用:

    java 复制代码
    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 标段名称, 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注解:

    java 复制代码
    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 \"标段名称\", company_name AS \"公司名称\", equipment_quote AS \"设备报价\" FROM wind_turbine_project_quote_detail")
        List<Map<String, Object>> selectQuoteDetail();
    }

    注意 :如果别名是中文,建议使用转义的双引号\"括起来。

  • 在Service中调用

    java 复制代码
    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();
            // ... 处理结果
        }
    }
3. 使用 XML 映射文件

这是管理复杂SQL的传统且强大的方式。

  • 第一步:创建Mapper接口

    java 复制代码
    import 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
相关推荐
星云数灵1 分钟前
使用Anaconda管理Python环境:安装与验证Pandas、NumPy、Matplotlib
开发语言·python·数据分析·pandas·教程·环境配置·anaconda
计算机毕设匠心工作室24 分钟前
【python大数据毕设实战】青少年抑郁症风险数据分析可视化系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习
后端·python
计算机毕设小月哥26 分钟前
【Hadoop+Spark+python毕设】智能制造生产效能分析与可视化系统、计算机毕业设计、包括数据爬取、Spark、数据分析、数据可视化、Hadoop
后端·python·mysql
计算机毕设小月哥3 小时前
【Hadoop+Spark+python毕设】中风患者数据可视化分析系统、计算机毕业设计、包括数据爬取、Spark、数据分析、数据可视化、Hadoop
后端·python·mysql
Keep_Trying_Go3 小时前
基于Zero-Shot的目标计数算法详解(Open-world Text-specified Object Counting)
人工智能·pytorch·python·算法·多模态·目标统计
计算机毕设匠心工作室3 小时前
【python大数据毕设实战】强迫症特征与影响因素数据分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
p***32354 小时前
一条sql 在MySQL中是如何执行的
数据库·sql·mysql
Trouville014 小时前
Pycharm软件初始化设置,字体和shell路径如何设置到最舒服
ide·python·pycharm
高-老师4 小时前
WRF模式与Python融合技术在多领域中的应用及精美绘图
人工智能·python·wrf模式