De fato, uma das características poderosas do Mybatis é geralmente seus recursos dinâmicos de SQL. Se você tem experiência em usar o JDBC ou outras estruturas semelhantes, entende que ele está muito emaranhado para concatenar dinamicamente seqüências de strings SQL juntas, não se esqueça de não esquecer os espaços ou omitir vírgulas no final da lista. O SQL dinâmico em Mybatis pode lidar com essa dor bem. Para o SQL dinâmico, a maneira mais simples é nos dar vários julgamentos de comportamento dinâmico quando codificado. Em Mybatis, uma poderosa linguagem SQL dinâmica é usada para melhorar essa situação, que pode ser usada em qualquer mapeamento de instruções SQL. Os elementos SQL dinâmicos são semelhantes ao uso de JSTL ou outros processadores de texto baseados em XML semelhantes. O Mybatis usa poderosas expressões baseadas em OGNL para eliminar outros elementos.
Vários elementos do nó que geralmente usamos incluem se, escolha (quando, caso contrário), compensar (onde, se) e foreach. Sinto -me um pouco como o uso do XSLT (vou mencioná -lo mais tarde no artigo ~).
(1) uso de se
Na configuração da paginação do Viisitmapper, se PageIndex> -1 e Pagesize> -1, o SQL de paginação correspondente será adicionado, caso contrário, não será adicionado (o padrão é todo tomado), como segue:
<select id = "getListbypagEnate" parameterType = "pagenateargs" resultype = "visitante"> selecione * de (<incluir refid = "getListsql" /> <incluir refid = "orderbysql" />) t <!- # #} significa saída parametrizada, $ {} meios de saída não é possível fazer qualquer coisa que não faça o que não é possível, se você não é possível que você não faça uma saída <! test = "pagestart> -1 e paagasize> -1"> limite #{Pagestart}, #{paGSize} </if> </select> <sql id = "getListsql"> selecione * order whest status> 0 </sql> <sql id = "OrderBys»Como nossos parâmetros PageIndex e PageSize são valores int, podemos fazer julgamentos diretos como este. Se for uma instância do objeto, podemos usar o julgamento nulo para controlar uma lógica dinâmica. O desenvolvimento específico depende das necessidades de negócios. Eu acho que é importante notar aqui que não é fácil escrever &&, isso não será reconhecido na configuração ~.
(2) o uso de escolha (quando, caso contrário)
Escolha quando usado principalmente em cenários de aplicação que atendem apenas a uma das condições em várias condições. Por exemplo, aqui está uma condição de consulta, ID de passagem, nome e createTime, respectivamente. Suponha que, quando consultemos a tabela de visitantes, se o VisitorID tiver um valor, use a consulta de ID e se o VisitorName tiver um valor, use a consulta VisitName. Da seguinte forma, adicione o método da lista <visitante> getListChooseWhEndemo (BasicQueryargs args) ao David.mybatis.demo.ivisitorOperation Interface Class. Adicione a configuração de Nó seleciona correspondente no VisitormPorpApper:
pacote David.mybatis.demo; importar java.util.list; importar David.mybatis.model.basicQueryargs; importar David.mybatis.model.pagenateargs; import.mybatis.model.visitor; Adicionar visitante*/ public int add (visitante visitante); /** Excluir visitante*/ public int excluir (int id); /** Atualizar visitante*/ public int update (visitante visitante); /** Consulta visitante*/ consulta de visitante público (int id); / * * Lista de consultas */ Lista pública <visitante> getList (); / * * Lista de consultas de paginação */ Lista pública <Misitor> getListBypagEnate (Pagenateargs args); / * * Lista de consultas de paginação (incluindo rownum) */ Lista pública <MisitorWithrn> getListByPagenateWithrn (pagenateargs args); /** Consulta básica*/ Visitante público BasicQuery (int id); / * * Consulta de condição dinâmica (escolha, quando) instância */ list < -visitante> getListChooseWhENDEMO (BasicQueryargs args); / * * Consulta de condição dinâmica (onde, se) instância */ list public <fisitor> getListwheredemo (BasicQueryArgs args); / * * Consulta Dynamic (foreach) Instância */ Lista pública <visitante> getListForEachdemo (List <Teger> IDS); }
<? xml versão = "1.0" coding = "utf-8"?> <! namespace = "David.mybatis.demo.ivisitorOperation"> <resultado Property = "CreateTime" /> < /ResultMap> <sql id = "getListsqlConditions"> selecione * do visitante </sql> <!-Escolha quando uma das condições é meta-> <select idyttypelistCooseWndEMO "resultmap =" visitORRS "parameterType =" BasicQueryargs "> resulta" " <se test = "Querystatus> 0"> status = #{querystatus} </if> <escolha> <quando test = "queryid! = 0"> e id = #{queryId} </quando> <when test = "queryname! </where> </leclect> </papper>(3) Uso de onde se (acabamento)
A vantagem de onde as palavras -chave é que, se houver condições de filtro correspondentes, ele saberá inserir onde as palavras -chave nos horários apropriados. E também sabe quando remover os conectores correspondentes e / / ou, principalmente, lidando principalmente com os seguintes cenários
<select id = "findactiveBlogLike" resultype = "blog"> selecione * do blog onde <se test = "state! = null"> state = #{state} </if> <if test = "title! = null"> e title como #{title} </if> <if test!Não se tornará resultado do fracasso de todas as condições
<select id = "findactiveBlogLike" resultType = "Blog"> Selecione * do blog onde </select>
Ou como a primeira condição não é atendida, a condição subsequente é atendida apenas.
<select id = "findactiveBlogLike" resultype = "blog"> selecione * do blog onde e título como 'algo' </leclect>
Portanto, para isso, podemos criar uma opção quando o exemplo de condição e adicionar o método correspondente Lista pública <visitante> getListwheredemo (BasicQueryargs args) à classe IVISITOPERATION Interface e adicionar a configuração correspondente no arquivo de configuração do VisitorMApper da seguinte forma:
<? xml versão = "1.0" coding = "utf-8"?> <! namespaço = "David.mybatis.demo.ivisitorOperation"> <sql id = "getListsqlconditions"> selecione * do visitante </sql> <!-Adicionar operações se as condições forem atendidas-> <select id = "getListwheredemo" resultado "Visitorrers" ParameterTypever = " refid = "getListsqlConditions"/> <where> <se test = "querystatus> 0"> status> 0 </if> <if test = "queryid> 0"> e id =#{queryid} </se> <se test = "queryname! CreateTime> =#{Querytime} </if> </where> <!- <TRIM prefix = "Where" prefixoverrides = "e | ou"> <se test = "querystatus> 0"> status> 0 </se> <se test = "queryid> 0" e id =#{queryid} </se> como =#{queryname} </if> <if test = "Querytime! = null"> e createTime> =#{Querytime} </if> </rodlet> -> </leclect> <//Mapper>(4) uso de foreach
Em SQL dinâmico comumente usado, temos um cenário de negócios em que o ID em uma grande série de IDs. Nesse caso, podemos usar o For -Eeach sem ter que trabalhar duro para unir a string de ID. A mesma etapa é adicionar o método correspondente à classe IVISITOPERACION Interface List <Visitor> getListForEachdemo (LIST <TEGER> IDS) e, em seguida, configure as informações correspondentes do elemento do nó no arquivo de mapeador correspondente, da seguinte maneira:
<? xml versão = "1.0" coding = "utf-8"?> <! namespace = "David.mybatis.demo.ivisitorOperation"> <sql id = "getListsqlConditions"> selecione * do visitante </sql> <!-foreach loop condições-> <bunsD = "getListForEachdoMo" resultMap = "visitorrs> <brustt =" Coleção = "List" Item = "Item" Index = "Index" Open = "(" Separator = "," Close = ")"> $ {Item} </foreach> </leclect> </papper>Por fim, você só precisa estabelecer o método de teste correspondente em Demorun, e o SQL dinâmico em Mybatis será concluído. O método Demorun usado para o teste abaixo
/** Consulta dinâmica para a instância*/ public static void getListForEachdemo (List <Teger> ids) {SqlSession Session = mybatisutils.getSqlSession (); VoPeation IVISITOPERATION = SESSÃO.GETMAPPER (IVISITOPERATION.CLASS); Lista <visitante> ls = Voperation.getListForEachdemo (IDS); para (visitante do visitante: ls) {System.out.println (visitante); }} /** Consulta dinâmica onde se instância* / public static void getListwherecondition (int id, nome da string, data createTime) {name = name == ""? nulo: nome; Sessão de sqlSession = mybatisutils.getSqlSession (); BasicQueryargs args = new BasicQueryargs (ID, nome, createTime); VoPeation IVISITOPERATION = SESSÃO.GETMAPPER (IVISITOPERATION.CLASS); List <visitante> ls = Voperation.getListwheredemo (args); if (ls.size () == 0) System.out.println ("Verifique nenhuma correspondência!"); else {for (visitante visitante: ls) {System.out.println (visitante); }}} /** Consulta dinâmica Escolha quando instância* / public static void getListChooseWhENDEMO (int id, nome da string, data createTime) {name = name == ""? nulo: nome; Sessão de sqlSession = mybatisutils.getSqlSession (); BasicQueryargs args = new BasicQueryargs (ID, nome, createTime); VoPeation IVISITOPERATION = SESSÃO.GETMAPPER (IVISITOPERATION.CLASS); Lista <visitante> ls = Voperation.getListChooseWhEndemo (args); if (ls.size () == 0) System.out.println ("Verifique nenhuma correspondência!"); else {for (visitante visitante: ls) {System.out.println (visitante); }}}
PS: Sobre Ognl
Ognl é a abreviação da linguagem de navegação de objetos-grafos. Do ponto de vista da linguagem: é uma linguagem de expressão poderosa usada para obter e definir as propriedades dos objetos Java. O objetivo é fornecer uma sintaxe de abstração mais alta para navegar nos gráficos de objetos Java. Ongl tem aplicativos em muitos lugares, como:
Linguagem de ligação como elementos da GUI (campo de texto, ComboBox, etc.) para modelar objetos.
Tabela de banco de dados para o idioma da fonte de dados do Tablemodel da Swing.
A linguagem de ligação para componentes da Web e objetos de modelo de plano de fundo (Webognl, tapeçaria, webwork, webobjects).
Como uma alternativa mais expressiva à linguagem de expressão de Jakarata Commons ou Linguagem de Expressão JSTL.
Além disso, há muitas coisas que podem ser feitas em Java, que também podem ser feitas usando o OGNL, como mapeamento e seleção de listas. Para desenvolvedores, usando o OGNL, você pode usar a sintaxe concisa para concluir a navegação de objetos Java. De um modo geral, a navegação das informações do objeto é concluída através de um "caminho". Esse "caminho" pode ser um atributo a um feijão java, um objeto indexado em uma coleção, etc., em vez de usar diretamente o método GET ou Set.