prefácio
Em alguns casos, você precisa usar o MybatisPlus para consultar o SQL nativo. O MybatisPlus na verdade tem um método para executar o SQL nativo. Aqui estão três deles.
método um
Este também é o método mais difundido na Internet, mas pessoalmente acho que esse método não é elegante e a auditoria de código usando o método ${} pode falhar e será considerada uma vulnerabilidade de código
public interface BaseMapper<T> extends com.baomidou.mybatisplus.core.mapper.BaseMapper<T> {
@Select("${nativeSql}")
Object nativeSql(@Param("nativeSql") String nativeSql);
}
Use seu próprio BaseMapper para herdar o próprio BaseMapper do MybatisPlus, e então todos os Mappers podem herdar seu próprio BaseMapper. Assim, todos os mapeadores podem consultar o SQL nativo.
O problema é que ${nativeSql} pode ser usado como uma brecha no código e não defendo essa forma de escrever.
Método dois
Use SqlRunner para executar SQL nativo. Eu defendo mais esse método, e também é o método mais usado na classe de teste do código-fonte MybatisPlus.
A figura a seguir mostra a classe de teste do código-fonte MybatisPlus:
O pré-requisito para usar o SqlRunner é abrir o SqlRunner, editar application.yaml e adicionar a configuração da seguinte forma:
mybatis-plus:
global-config:
enable-sql-runner: true
método de escrita application.properties:
mybatis-plus.global-config.enable-sql-runner=true
Se você não abrir, ele irá relatar
Causa: java.lang.IllegalArgumentException: a coleção de instruções mapeadas não contém valor para xxxxxxx
Instruções:
List<Map<String, Object>> mapList = SqlRunner.db().selectList("select * from test_example limit 1,10");
Pessoalmente, recomendo usar esse método para consultar o SQL nativo, que não poluirá o mapeador nem será relatado como uma vulnerabilidade de código.
método três
Use o poder pré-histórico original para executar SQL nativo no nível mais baixo 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();
Entre eles, o UUID é um método no Hutool para gerar strings aleatórias.
Este método não precisa abrir o SqlRunner, mas a quantidade de código é tocante.Eu não recomendo muito, mas você pode dar uma olhada na lógica subjacente do MybatisPlus.