[Original] Trois façons pour MybatisPlus d'appeler le SQL natif

avant-propos

Dans certains cas, vous devez utiliser MybatisPlus pour interroger le SQL natif. MybatisPlus a en fait une méthode pour exécuter le SQL natif. En voici trois.

première méthode

C'est aussi la méthode la plus répandue sur Internet, mais je pense personnellement que cette méthode n'est pas élégante, et l'audit de code utilisant la méthode ${} peut échouer, et cela sera considéré comme une vulnérabilité de code

public interface BaseMapper<T> extends com.baomidou.mybatisplus.core.mapper.BaseMapper<T> {

    @Select("${nativeSql}")
    Object nativeSql(@Param("nativeSql") String nativeSql);
}

Utilisez votre propre BaseMapper pour hériter du propre BaseMapper de MybatisPlus, puis tous les Mappers peuvent hériter de votre propre BaseMapper. Ensuite, tous les mappeurs peuvent interroger le SQL natif.

Le problème est que ${nativeSql} peut être utilisé comme une faille de code, et je ne préconise pas cette façon d'écrire.

Deuxième méthode

Utilisez SqlRunner pour exécuter du SQL natif. Je préconise davantage cette méthode, et c'est aussi la méthode la plus utilisée dans la classe de test du code source MybatisPlus.

La figure suivante montre la classe de test du code source MybatisPlus :

 La condition préalable à l'utilisation de SqlRunner est d'ouvrir SqlRunner, de modifier application.yaml et d'ajouter la configuration comme suit :

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

méthode d'écriture application.properties :

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

Si vous ne l'ouvrez pas, il signalera

Cause : java.lang.IllegalArgumentException : la collection d'instructions mappées ne contient pas de valeur pour xxxxxxx

Instructions:

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

Je recommande personnellement d'utiliser cette méthode pour interroger le SQL natif, qui ne polluera pas le Mapper ni ne sera signalé comme une vulnérabilité de code.

méthode trois

Utilisez le pouvoir préhistorique d'origine pour exécuter du SQL natif dans le niveau le plus bas de Mybatis

        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();

Parmi eux, UUID est une méthode dans Hutool pour générer des chaînes aléatoires.

Cette méthode n'a pas besoin d'ouvrir SqlRunner, mais la quantité de code est touchante.Je ne la recommande pas beaucoup, mais vous pouvez jeter un coup d'œil à la logique sous-jacente de MybatisPlus.

Je suppose que tu aimes

Origine blog.csdn.net/DCTANT/article/details/127110541
conseillé
Classement