最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MybatisPlus調(diào)用原生SQL的三種方法實例詳解

 更新時間:2022年09月30日 08:50:20   作者:DCTANT  
這篇文章主要介紹了MybatisPlus調(diào)用原生SQL的三種方法,在有些情況下需要用到MybatisPlus查詢原生SQL,MybatisPlus其實帶有運行原生SQL的方法,我這里列舉三種,需要的朋友可以參考下

前言

在有些情況下需要用到MybatisPlus查詢原生SQL,MybatisPlus其實帶有運行原生SQL的方法,我這里列舉三種

方法一

這也是網(wǎng)上流傳最廣的方法,但是我個人認為這個方法并不優(yōu)雅,且采用${}的方式代碼審計可能會無法通過,會被作為代碼漏洞

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的方式執(zhí)行原生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最底層的方式執(zhí)行原生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創(chuàng)建一個新的SqlSession,并獲取全局配置
        SqlSession sqlSession = sqlSessionFactory.openSession();
        Configuration configuration = sqlSessionFactory.getConfiguration();
 
        // INFO: DCTANT: 2022/9/29 生成一個uuid,用于將這個SQL創(chuàng)建的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 創(chuàng)建返回映射 
        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 將創(chuàng)建的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執(zhí)行原生SQL

在mapper文件中定義要執(zhí)行的方法

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

到此這篇關于MybatisPlus調(diào)用原生SQL的三種方法的文章就介紹到這了,更多相關MybatisPlus原生SQL內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

团风县| 江陵县| 健康| 岐山县| 葫芦岛市| 枣阳市| 手机| 怀集县| 如皋市| 厦门市| 四会市| 南通市| 邢台市| 浙江省| 文登市| 日喀则市| 准格尔旗| 镇沅| 雷山县| 台北县| 内黄县| 灵丘县| 泽普县| 肃北| 大冶市| 布尔津县| 仙游县| 景东| 汶川县| 德格县| 桃江县| 沙坪坝区| 南投市| 克拉玛依市| 文山县| 维西| 洛南县| 沂源县| 西藏| 庆城县| 射洪县|