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.