MybatisPlus调用原生SQL的三种方法实例详解

 更新时间:2022年09月30日 08:50:20   作者:DCTANT  
这篇文章主要介绍了MybatisPlus调用原生SQL的三种方法,在有些情况下需要用到MybatisPlus查询原生SQL,MybatisPlus其实带有运行原生SQL的方法,我这里列举三种,需要的朋友可以参考下

前言

在有些情况下需要用到MybatisPlus查询原生SQL,MybatisPlus其实带有运行原生SQL的方法,我这里列举三种

方法一

这也是网上流传最广的方法,但是我个人认为这个方法并不优雅,且采用${}的方式代码审计可能会无法通过,会被作为代码漏洞

public interface BaseMapper<T> extends com.baomidou.mybatisplus.core.mapper.BaseMapper<T> {
 
    @Select("${nativeSql}")
    Object nativeSql(@Param("nativeSql") String nativeSql);
}

使用一个自己的BaseMapper去继承MybatisPlus自己的BaseMapper,然后所有的Mapper去继承自己写的BaseMapper即可。那么所有的Mapper都能查询原生SQL了。

问题在于${nativeSql}可能会被作为代码漏洞,我并不提倡这种写法。

方法二

使用SqlRunner的方式执行原生SQL。这个方法我较为提倡,也是MybatisPlus源码的测试类中用的最多的方法。

下图为MybatisPlus源码的测试类:

 要使用SqlRunner的前提是打开SqlRunner,编辑application.yaml增加配置如下:

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

application.properties写法:

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

如果不打开会报

Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for xxxxxxx

使用方法:

List<Map<String, Object>> mapList = SqlRunner.db().selectList("select * from test_example limit 1,10");

我个人比较推荐使用这种方式来查询原生SQL,既不会污染Mapper,也不会被报出代码漏洞。

方法三

采用原始的洪荒之力,用Mybatis最底层的方式执行原生SQL

        String sql = "select * from test_example limit 1,10";
 
        Class<ExampleEntity> entityClass = ExampleEntity.class;
        // INFO: DCTANT: 2022/9/29 使用MybatisPlus自己的SqlHelper获取SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = SqlHelper.sqlSessionFactory(ExampleEntity.class);
        // INFO: DCTANT: 2022/9/29 通过SqlSessionFactory创建一个新的SqlSession,并获取全局配置
        SqlSession sqlSession = sqlSessionFactory.openSession();
        Configuration configuration = sqlSessionFactory.getConfiguration();
 
        // INFO: DCTANT: 2022/9/29 生成一个uuid,用于将这个SQL创建的MappedStatement注册到MybatisPlus中
        String sqlUuid = UUID.fastUUID().toString(true);
        RawSqlSource rawSqlSource = new RawSqlSource(configuration, sql, Object.class);
        MappedStatement.Builder builder = new MappedStatement.Builder(configuration, sqlUuid, rawSqlSource, SqlCommandType.SELECT);
        ArrayList<ResultMap> resultMaps = new ArrayList<>();
        // INFO: DCTANT: 2022/9/29 创建返回映射 
        ResultMap.Builder resultMapBuilder = new ResultMap.Builder(configuration, UUID.fastUUID().toString(true), entityClass, new ArrayList<>());
        ResultMap resultMap = resultMapBuilder.build();
        resultMaps.add(resultMap);
        builder.resultMaps(resultMaps);
 
        MappedStatement mappedStatement = builder.build();
        // INFO: DCTANT: 2022/9/29 将创建的MappedStatement注册到配置中
        configuration.addMappedStatement(mappedStatement);
        // INFO: DCTANT: 2022/9/29 使用SqlSession查询原生SQL 
        List<ExampleEntity> list = sqlSession.selectList(sqlUuid);
        // INFO: DCTANT: 2022/9/29 关闭session 
        sqlSession.close();

其中的UUID是Hutool中的方法,用于生成随机字符串。

这个方法就不需要打开SqlRunner了,就是代码量感人,我不是很推荐,但是能够窥探一下MybatisPlus的底层逻辑。

MyBatis-Plus执行原生SQL

在mapper文件中定义要执行的方法

@Repository
public interface ZbArticleCEIResultPerformanceMapper extends BaseMapper<ZbArticleCEIResultPerformance> {
    @Select({"${sql}"})
    @ResultType(ArrayList.class)
    List<ZbArticleCEIResultPerformance> executeQuery(@Param("sql") String sql);
}

到此这篇关于MybatisPlus调用原生SQL的三种方法的文章就介绍到这了,更多相关MybatisPlus原生SQL内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javaweb实现注册登录页面

    javaweb实现注册登录页面

    这篇文章主要为大家详细介绍了javaweb实现注册登录页面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Spring Security 在 Spring Boot 中的使用详解【集中式】

    Spring Security 在 Spring Boot 中的使用详解【集中式】

    这篇文章主要介绍了Spring Security 在 Spring Boot 中的使用【集中式】,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • MyBatis-Plus 分页不生效的解决方法

    MyBatis-Plus 分页不生效的解决方法

    本文主要介绍了MyBatis-Plus 分页不生效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Spring Aware接口示例代码详解

    Spring Aware接口示例代码详解

    Spring的依赖注入的最大亮点是所有的Bean对Spring容器的存在是没有意识的,我们可以将Spring容器换成其他的容器,Spring容器中的Bean的耦合度因此也是极低的,本文给大家介绍Spring Aware接口示例代码详解,感兴趣的朋友一起看看吧
    2022-02-02
  • Java设计模式之策略模式示例详解

    Java设计模式之策略模式示例详解

    策略模式属于Java 23种设计模式中行为模式之一,该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。本文将通过示例详细讲解这一模式,需要的可以参考一下
    2022-08-08
  • Spring Security实现接口放通的方法详解

    Spring Security实现接口放通的方法详解

    在用Spring Security项目开发中,有时候需要放通某一个接口时,我们需要在配置中把接口地址配置上,这样做有时候显得麻烦。本文将通过一个注解的方式快速实现接口放通,感兴趣的可以了解一下
    2022-05-05
  • Java如何手动创建线程池

    Java如何手动创建线程池

    这篇文章主要介绍了Java如何手动创建线程池,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Spring Cloud 请求重试机制核心代码分析

    Spring Cloud 请求重试机制核心代码分析

    这篇文章主要介绍了Spring Cloud 请求重试机制核心代码分析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Java10新特性解读

    Java10新特性解读

    这篇文章主要介绍了Java10新特性的相关资料,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-02-02
  • 详解Java设计模式之桥接模式

    详解Java设计模式之桥接模式

    桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯。桥接模式将系统的抽象部分与实现部分分离解耦,使他们可以独立的变化。本文通过示例详细介绍了桥接模式的原理与使用,需要的可以参考一下
    2022-06-06

最新评论