[Original] Três maneiras de MybatisPlus chamar SQL nativo

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.

Supongo que te gusta

Origin blog.csdn.net/DCTANT/article/details/127110541
Recomendado
Clasificación