Todo mundo sabe basicamente como usar o Mybatis para executar o SQL arbitrário. O método de uso é muito simples, por exemplo, em um xxmapper.xml:
<select id = "Executesql" resultType = "map"> $ {_ parâmetro} </leclect>Você pode chamá -lo do seguinte:
sqlSession.SelectList ("ExecutesQL", "Selecione * do sysuser wHERE HABLEFICE = 1");Ou você pode definir o seguinte método na interface xxmapper.java:
List <Pap> ExecutesQL (String SQL);
Em seguida, use a interface para chamar o método:
xxmapper.executesql ("Selecione * do sysuser wHERE ativado = 1");Todo o conteúdo acima pode ser, e o seguinte é um pouco mais complicado com base nisso.
Se você deseja passar o valor usando o método do parâmetro no SQL acima, ou seja, escreva -o como ativado = #{habilitado}, se você não encontrou tais necessidades, pode não entender por que deve escrevê -lo assim. Por exemplo, para implementar uma consulta dinâmica, você pode configurar o SQL em primeiro plano e fornecer algumas condições de consulta para realizar a função de uma consulta (para segurança, essas configurações devem ser desenvolvidas ou implementadas e é impossível para os usuários operar diretamente o banco de dados).
Para esse recurso, é muito fácil de implementar com o Mybatis. Configurando o SQL deve ser executado. O SQL pode ser executado no método mencionado acima. Como fornecer parâmetros? O parâmetro é a parte #{ativada} em ativação = #{habilitado}. Se houver mais condições, um SQL configurado é o seguinte:
Selecione * FROM SYSUSER WHERE HABELED = #{Enabled} e nome de usuário como concat ('%', #{nome de usuário}, '%')Nesse caso, como posso usar o mybatis para implementá -lo?
Primeiro, o XML é modificado da seguinte forma:
<select id = "Executesql" resultType = "Map"> $ {SQL} </select>Os métodos na interface são modificados para:
Lista <Pap> ExecutesQL (mapa do mapa);
Em seguida, ligue para o método:
Mapa mapa = new hashmap (); // o sql aqui corresponde a $ {sql} map.put ("sql", "selecione * do sysuser"+ "onde ativado =#{ativado}"+ "e nome de usuário como concat ('%',#{{username}, '') e"); 1); //#{nome de usuário} map.put ("nome de usuário", "admin"); // insira a lista de chamadas <pap> list = xxmapper.executesql (map); // o método sqlSession chama sqlsession.selectList ("Executesql", map);Com este SQL, você pode fornecer o nome de usuário ativado e de usuário como condições ao usuário. Essas duas condições são obviamente necessárias. Se for opcional, como devo escrevê -lo?
Talvez alguém tenha pensado se é possível usar o SQL dinâmico em mybatis, usar tags <if> etc.?
Antes de responder a essa pergunta, vejamos o código no DynamicSqlSource que lida com o SQL dinâmico:
@Override public boundsql getBoundSql (objeto parameterObject) {dynamicContext context = new DynamicContext (Configuration, ParameterObject); RootsqlNode.Apply (context); SqlSourceBuilder sqlsourceParser = sqlSourceBiler (Configuration); Object.class: parameterObject.getClass (); sqlsource sqlsource = sqlsourceParser.parse (context.getSql (), parameterType, context.getBindings (); Boundsql Boundsql = sqlsource.getBoundSql (ParameterOngject); para (map.entry <string, object> Entrada: context.getBindings (). EntrySet ()) {Boundsql.setAdditionalParameter (ENTRADE.GETKEY (), ENTRADE.GETVALUE ();} Return Boundsql;}Quando o Mybatis lida com o SQL dinâmico, todas as tags SQL dinâmicas serão processadas como objetos SQLNode (RootsqlNode aqui), e aqueles que contêm $ {} também serão processados como objetos textSqlnode. Nas duas primeiras linhas do método acima, é onde o Mybatis lida com SQL dinâmico.
Portanto, se nosso conteúdo em $ {sql} contiver tags aninhadas como $ {} e <if>, <where> e outras tags, quando o mybatis analisar os objetos XML para sqlnode, o elemento XML <leclect> contém apenas $ {sql} e apenas $ {sql} será parsed. No tempo de execução, essa sequência de parâmetros pode conter tags como $ {} e <se>, <where>, etc., mas isso acontece após a análise do mybatis. Portanto, quando esses conteúdos aparecerem como parte da string, eles não serão especialmente processados. Eles são apenas parte do SQL e são apenas a saída como é (porque o banco de dados não o reconhece, ele relatará um erro) e não pode ser processado. Portanto, ele não pode escrever SQL dinâmico através do método que vem com Mybatis.
dica
No código acima:
sqlsourceParser.parse (context.getSql (), parameterType, context.getBindings ());
Esta parte do código lida com parâmetros dinâmicos (#{}) após o processamento dinâmico do SQL, para que esse tipo de parâmetros possa ser usado no SQL.
Como você não pode usar o método SQL dinâmico mybatis, como implementar o SQL dinâmico?
Aqui está uma ideia simples. Use a linguagem de marcação de modelo no SQL para implementar o SQL dinâmico (como o Freemarker). Antes de o SQL ser entregue à Mybatis para execução, use modelos para processar o SQL para gerar o SQL executado final (precisa evitar o processamento #{} parâmetros) e entregar este SQL a Mybatis para execução.
Dê um exemplo de um modelo Freemarker, e ainda assim o SQL acima é baseado em:
Selecione * no sysuser onde 1 = 1 <#if ativado? && nome de usuário! = ''> e nome de usuário como concat ('%',#{nome de usuário}, '%') </#se>Observe que o <#if> aqui está o elemento do Freemarker. Sem considerar a injeção de SQL, o SQL acima também pode ser escrito como:
Selecione * no sysuser onde 1 = 1 <#if ativado? && nome de usuário! = ''> e nome de usuário como '%$ {nome de usuário}%' </#se>A diferença é '%$ {nome de usuário}%', porque o Freemarker também processará $ {nome de usuário} e também substituirá os parâmetros aqui pelo valor real.
No código chamado anteriormente, a modificação é a seguinte:
//# {enabled }Map.put("enabled ", 1); //#{nome de usuário} map.put (" nome de usuário "," admin "); // o sql aqui corresponde a $ {sql} string em xml sql =" um dos dois complexos acima " mapa); // Coloque o SQL processado no mapa mapa.put ("sql", "selecione * do sysuser"+ "where Habiled = #{Enabled}"+ "e nome de usuário como concat ('%', #{userrame}, '%)"); // Execute Method List <pist>NOTA: O método ProcessSqlByFreemarker é processar seqüências de strings SQL com base nos dados no mapa, e o método de implementação pode ser pesquisado por você mesmo.
Neste ponto, uma função SQL dinâmica que não é muito complicada é implementada.
Gostaria de saber se existem pessoas mais gananciosas. Você acha que os valores retornados acima são todos da lista <Pap>. Você pode devolver uma classe de entidade que eu especifiquei?
Por exemplo no mapa:
map.put ("classe", "tk.mybatis.model.sysuser");Posso fazer o valor de retorno se tornar o tipo de sysuser dessa maneira? Desde que este artigo demorou muito, fornecerei uma solução aqui, não em profundidade.
Você pode usar um interceptador para implementá -lo. Após obter o MappEdStatement, copie uma cópia e modifique o atributo Tipo do ResultMap no ResultMaps para especificar o tipo de classe para você. É fácil dizer, mas na operação real, você pode ter cerca de 1/10 do plug -in PageHelper Paging.
Como este artigo foi escrito a pedido de minha esposa, se minha esposa tiver essa última necessidade, ajudarei minha esposa a implementar esse plug-in e depois compartilhá-lo.
NOTA: Se for uma atualização dinâmica, inserir, excluir uma instrução, você poderá alterar o <select> acima para atualizar (sem necessidade de usar <lete> e <ret>) e usar o valor de retorno, o que é muito mais fácil do que selecionar.
O exposto acima é uma explicação detalhada da instrução SQL de execução mybatis apresentada a você pelo editor. Espero que seja útil para você. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a você a tempo. Muito obrigado pelo seu apoio ao site wulin.com!