当前位置: 代码网 > it编程>编程语言>Java > MyBatis Plus中执行原生SQL语句方法常见方案

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

2025年11月13日 Java 我要评论
在mybatis plus中执行原生sql语句,可以根据项目配置、个人偏好以及sql的复杂程度选择不同的方法。下面的表格对比了几种常见方案:方法核心思路适用场景与说明sqlrunner使用mybati

在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

mybatis-plus:
  global-config:
    enable-sql-runner: true

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

mybatis-plus.global-config.enable-sql-runner=true

第二步:编写java代码
在service或controller中直接调用:

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注解:

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中调用

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接口

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 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

到此这篇关于mybatis plus中执行原生sql语句方法的文章就介绍到这了,更多相关mybatis plus执行原生sql内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com