Introdução ao ibatis:
Ibatis é um projeto de código aberto do Apache e uma solução de mapeamento O/R. A maior característica do ibatis é que ela é compacta e rápida para começar. Se você não precisa de muitas funções complexas, o ibatis é a solução mais simples que pode atender aos seus requisitos e ser flexível o suficiente. Agora Ibatis foi renomeado para Mybatis.
O site oficial é: http://www.mybatis.org/
1. O parâmetro de entrada é um único valor
<delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" parameterClass="long"> delete from MemberAccessLog where accessTimestamp = #value# </delete> <delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" parameterClass="long"> delete from MemberAccessLog where Accesstimestamp = # Valor # </lete>
2. O parâmetro de entrada é um objeto
<insert id="com.fashionfree.stat.accesslog.MemberAccessLog.insert" parameterClass="com.fashionfree.stat.accesslog.model.MemberAccessLog> insert into MemberAccessLog ( accessLogId, memberId, clientIP, httpMethod, actionId, requestURL, accessTimestamp, extend1, extend2, extend3 ) values ( #AccessLogId #, #membroID #, #clientip #, #httpmethod #, #actionId #, #requesturl #, #accesstimestamp #, #extend1 #, #estend2 #, #extend3 #) </insert> <insert id = "com.fashionFree.stat.accessLog.memerccessLOg.Inslog.Inslog.instrog.instrog.instrog.instrog.instrestract.instrestert. parameterClass="com.fashionfree.stat.accesslog.model.MemberAccessLog> insert into MemberAccessLog ( accessLogId, memberId, clientIP, httpMethod, actionId, requestURL, accessTimestamp, extend1, extend2, extend3 ) values ( #accessLogId#, #memberId#, #clientIP#, #httpMethod#, #actionId#, #requestUrl #, #accesstimestamp #, #estend1 #, #estend2 #, #estend3 #) </insert>
3. O parâmetro de entrada é um java.util.hashmap
<select id = "com.fashionFree.stat.accessLog.SelectActionIdAndActionNumber" ParameterClass = "hashmap" resultMap = "getActionIdAndactionNumber"> Selecione ActionId, contagem (*) como contagem de membros do membro <= # # # membro # e access) id = "com.fashionFree.stat.accessLog.SelectActionIdAndActionNumber" parameterClass = "hashmap" resultMap = "getActionIdActionNumber"> selecione ActionId, contagem (*) como contagem do membro do grupo em que # # # # membro e accessTimestamp> # start # e accesstimes
4. Os parâmetros de entrada contêm matrizes
<insert id = "updatestatusbatch" parameterclass = "hashmap"> atualizar conjunto de perguntas status = # status # <dynamic precend = "where questionId in"> <isnotNull Property = "actionIds"> <tereate Property = "actionIds" ("/" close = ")" conjunta = ",", #action> [] <insert id = "updatestatusbatch" parameterclass = "hashmap"> atualizar conjunto de perguntas status = # status # <dynamic precend = "where questionId in"> <isnotNull Property = "actionIds"> <tereate Property = "actionIds" ("/" close = ")" conjunta = ",", #action> []Descrição: ActionIds é o nome da matriz passada; Use a tag dinâmica para evitar erros de sintaxe da instrução SQL quando a matriz estiver vazia; Use a tag IsNotNull para evitar erros de análise de Ibatis quando a matriz é nula
5. Os parâmetros de passagem contêm apenas uma matriz
<select id = "com.fashionfree.stat.accessLog.model.statmemberaction.SelectactionIdSofModule" resultClass = "hashmap"> selecione ModuleId, ActionId de StatMemberAction <dinâmico prepen = "Where ModuleId em"> <itereate = "(" Close = ")" Conjunção </select> <select id = "com.fashionFree.stat.accessLog.model.statmemberAction.SelectactionIdSofModule" resultClassClass = "hashmap"> selecione ModuleId, ActionId de StatMemberAction <Dynamic precend = "Where ModuleId em"> <itreate Open = "(" Close = "" "" "" "" "" "" "" "" "" "" "" ModuleId </leclect>NOTA: Observe que não há item do ParameterClass na tag Selecionar
Além disso: você também pode colocar a matriz em um hashmap aqui, mas adiciona sobrecarga extra e não é recomendável usá -la.
6. Deixe ibatis analisar os parâmetros diretamente em strings
<select id = "com.fashionFree.stat.accessLog.SelectSumDistinctCountOfaccessMembernum" parameterclass = "hashmap" resultclass = "int"> selecione count (distinto membro) de MemberCessLog WHERE ActionTimestamp> = # Start # e accesstimesp) id = "com.fashionFree.stat.accessLog.SelectSumDistinctCountOfaccessMembernum" ParameterClass = "HashMap" resultClass = "int"> Selecione contagem (distintiM membro) do membro do MemberCessLog onde o AccessTimeStamp> = # # e accesstimestamp < # end # e actionId em $
Nota: Existe um risco de injeção de SQL ao usar esse método e não é recomendável usá -lo.
7. PagedQuery
<select id = "com.fashionFree.stat.accessLog.SelectMemberAccessLogby" parameterclass = "hashmap" resultMap = "MemberCessLogMap"> <Incluir refid = "Selectallsql"/> <incluir refid = "wheReResql"/> <blue refid = "Pagesql"/> < id="com.fashionfree.stat.accesslog.selectMemberAccessLogBy.Count" parameterClass="hashMap" resultClass="int"> <include refid="countSql"/> <include refid="whereSql"/> </select> <sql id="selectAllSql"> select accessLogId, memberId, clientIP, httpMethod, actionId, requestUrl, AccessTimeSTamp, Extend1, Extend2, Extend3 do membroCessaLog </sql> <sql id = "whereresql"> accesstimeStamp <= # accessTimestamp # </sql> <sql id = "countSql"> select count (*) de MemberCessLog </sql> </sql> <sql id = "whereresql"> accesstimestamp <= # Accesstimestamp # </sql> <sql id = "countSql"> selecione count (*) de membro do membro </sql> <sql id = "Pagesql"> <ninâmico> <snotNull Property = " # startIndex #, # Pagesize # </snotNull> </isNotNull> </dynamic> </sql> <select id = "com.fashionFree.stat.accessLog.SelectMemberCessLogby" parameterclass = "hashmap" resultado "membro do" membro do membro "> refID = "whereresql"/> <incluir refid = "Pagesql"/> </select> <select id = "com.fashionFree.stat.accessLog.SelectMemberCessLogby.count" parameterclass = "hashmap" resultclass = "int"> <incluir refid = "countSQLID"/" id = "SelectAllSql"> Selecione AccessLogId, MemberID, Clientip, HttpMethod, ActionId, RequestUrl, AccessTimeStamp, Extend1, Extend2, Extend3 do membroCessLog </sql> <sql id = "whereresql"> accessTeMestamp <= # AccessMestamp # </sql> Membro do membro do membro </sql> <sql id = "PAGESQL"> <ninkinic> <isNotNull Property = "startIndex"> <isNotNull Property = "Pagesize"> Limit # startIndex #, # PageSize # </snotnull> </isnotnull> </dinâmico> </sql>
Nota: Neste exemplo, o código deve ser:
Hashmap hashmap = new hashmap (); hashmap.put ("accesstimestamp", algum valor); PagedQuery ("com.fashionFree.stat.accessLog.SelectMemberAccessLogby", hashmap);O método de PagedQuery pesquisa primeiro uma declaração mapeada chamada com.fashionfree.stat.accessLog.SelectMemberccessLogby.count para executar a consulta SQL, obtendo assim o número de registros de com.fashionFree.stat.accessLog.SelectMembercesAccessLogby consulta e depois executados (com.fashionFree.stat.accessLog.SelectMemberAccessLogby). Para o processo específico, consulte o código relevante na classe Utils.
8. A instrução SQL contém maior que o sinal> e menor que o sinal <1. Escreva o maior que o sinal e menor que o sinal como:> <por exemplo:
<Delete id = "com.fashionFree.stat.accessLog.DeleTemEmberAccessLogsBefore" ParameterClass = "Long"> Excluir do membro do MEMBORCESSLOG WHERE AccessTimeStamp <= # Valor # </DeLete> Xml Código <DELETE ID = "COM.FashionFree.stat.accessLog.LeteMlestembercke MEMBERACCESSLOG WHERE AccessTimeSTamp <= # Valor # </lete>
Coloque caracteres especiais na área de CDATA de XML:
<Delete id = "com.fashionFree.stat.accessLog.DeleTemEmberCesclesLogsBefore" ParameterClass = "Long"> <! [CDATA [Delete From MemberCessLog WHEN AccessTimestamp <= # Value #]> </Delete> <Delete ID = "com.FashionFretE.stat.accessLog.DaccessLog.Deret.Deret.DoMELT.CESSLOG.DOCESSLOG.DOMELT.CESSLOG.DOMELTBESTBESTBESTBESTBESTBESTBESTBESTBESTBESTBESTBESTBESTBESTBESTBESTBESTBESTBESTBESTBESTBESTBESTBESTA <! [CDATA [Excluir do membroCesado onde acessar
Recomenda -se usar o primeiro método, escrevê -lo como <e> (XML não analisa o conteúdo no CDATA; portanto, se o CDATA contiver tags dinâmicas, não funcionará)
9. As tags de incluir e SQL organizam instruções SQL comuns juntas para facilitar o compartilhamento:
<sql id = "selectBasicsql"> Selecione SamplingTimestamp, onlineNum, ano, mês, semana, dia, hora de onlinemembernum </sql> <sql id = "onde seasqlbefore"> onde samplingtimestamp <= # samplingtimestamp # </sql> <SELECT id = "com.fashionFree.accessLog.SelectonLineMemberNumsBeforesMplingTimestamp" parameterClass = "hashmap" resultclass = "onlineMembernum"> <incluir refid = "selectBasicsql" /> <incluir = "whereresqlbefore" /> < /select> <sql "ql" /> <bid = "whereresqlbefore" /> < /select> <sq "ql ql" /> <bid = "whereresqlbefore" /> < /select> <sq "ql ql" /> <bid = "whereresqleffore" /> < /select> <sq "ql" ql " />" SamplingTimestamp, onlinenum, ano, mês, semana, dia, hora de onlineMembernum </sql> <sql id = "whereresqlbe antes"> onde samplingtimestamp <= # samplingTimestamp # </Sql> <select = "com.FashionFree.AccessLog.selectSonMerMgernMgernMgernMiglernMiglernMiglernninMernMgernninMernMgernninMlernMiglern ParameterClass = "hashmap" resultclass = "onlineMembernum"> <incluir refid = "selectBasicsql" /> <incluir refID = "whereresqlbefore" /> </leclect>
Nota: as tags SQL só podem ser usadas para referência e não podem ser consideradas instruções mapeadas. Como no exemplo acima, existe um elemento SQL chamado SelectBasicsQL, e está errado tentar usá -lo como uma instrução SQL para executar:
sqlmapClient.QueryForList ("SelectBasicsql"); ×10. Selecione aleatoriamente registros
<sql id = "randomsql"> order by rand () limite # número # </sql>
Selecione aleatoriamente registros de números no banco de dados (apenas para MySQL)
11. Campos de ponto no grupo SQL agrupando
<sql id=”selectGroupBy> SELECT a.answererCategoryId, a.answererId, a.answererName, a.questionCategoryId, a.score, a.answeredNum, a.correctNum, a.answerSeconds, a.createdTimestamp, a.lastQuestionApprovedTimestamp, a.lastModified, GROUP_CONCAT(q.categoryName) as categoryName FROM ResponderCategory A, QuestionCategory q Onde a.QuestionCategoryId = q.QuestionCategoryId Grupo por A.Answererid Order por A.AnswerCategoryId </sql> <sql id = ”SelectGroupby> Select A.AnswerCategoryId, A.Answerid, A.AnswerName, a.MederCumMelcate. A.AnswerSeconds, A.CreatedTimestamp, A.LastQuestionAprovedTimestamp, A.LastModified, Group_Concat (q.CategoryName) como categoryName da ResponderCategory A, QuestionCategory q onde A.QuestionCategoryId = q.QuestoCoryIdid Group por A.Answerid Order By Orders By A. A.
Nota: a função Group_Concat do MySQL é usada no SQL
12. classificar na ordem em
①mysql:
<sql id=”groupByInArea”> select moduleId, moduleName, status, lastModifierId, lastModifiedName, lastModified from StatModule where moduleId in (3, 5, 1) order by instr(',3,5,1,' , ','+ltrim(moduleId)+',') </sql> <sql id=”groupByInArea”> select moduleId, ModuleName, Status, LastModifierId, LastModifiedName, Modificado pela última②SqlServer:
<sql id = "groupByinarea"> selecione ModuleId, ModuleName, Status, LastModifierId, LastModifiedName, LastModified From StatModule, onde o ModuleId em (3, 5, 1) Ordem por Charindex (','+lTRIM (ModuleId)+',', 3,5,1, ') </s) </moduleId),', 3,5,5,1, ') </moduleid),', 3,5,5,1, ') </moduleid),', 3,5,5, '), ModuleId, ModuleName, Status, LastModifierId, LastModifiedName, LastModified From Statmodule, onde o ModuleId em (3, 5, 1) ordem de Charindex (','+lTrim (ModuleId)+',', ', 3,5,1,') </Sql>Descrição: Os resultados da consulta serão retornados na ordem do ModuleID na lista IN (3, 5, 1).
MySQL: Instr (STR, Substr)
SQLSERVER: Charindex (Substr, Str) Retorna a primeira posição de ocorrência da substring na String str ltrim (STR) retorna a string str, seu caractere de espaço (esquerda) é excluído
13.ResultMap ResultMap é responsável pelo mapeamento dos valores da coluna dos resultados de consulta SQL nos valores de atributo de Java Beans
<resultMap id="getActionIdAndActionNumber"> <result column="actionId" property="actionId" jdbcType="BIGINT" javaType="long"/> <result column="count" property="count" jdbcType="INT" javaType="int"/> </resultMap> Xml code<resultMap id="getActionIdAndActionNumber"> <result column = "actionId" propriedade = "actionId" jdbctype = "bigint" javatype = "long"/> <resultado colun = "count" propriedade "count" jdbctype = "int" javatype = "int"/> </resultado>
O uso do ResultMap é chamado de mapeamento explícito de resultados, que corresponde à Classe ResultClass (mapeamento de resultados embutidos). A maior vantagem de usar o ResultClass é que é simples e conveniente. Não requer que o resultado especificado seja exibido. Ibatis determina a decisão com base na reflexão. O ResultMap pode fornecer autenticação de configuração mais rigorosa especificando JDBCType e Javatype.
14.Typealias
<typeAlias alias = "MemberOnLineduration" type = "com.fashionFree.stat.accessLog.model.MemberonLineduration" /> <TypeAlias>
Permita que você defina alias para evitar a contribuição repetida de nomes excessivamente longos
15.Remap
<select id = "testForreMap" parameterclass = "hashmap" resultclass = "hashmap" revapresults = "true"> selecione UserID <isequal propriedade = "tag" comparevalue = "1">, username </isequal> <isequal property = "" tageValue = "2">, 2 ", é o usuário </isequal> <isequal) id = "testForremap" parameterclass = "hashmap" resultclassClass = "hashmap" revapresults = "true"> selecione UserID <isequal Property = "tag" compareValue = "1">, username </isequal> <isequal propriedade "tag" compareNein> </userPassword </isequal> <isequal = "tag" CompareNein> </userpassword </userpassword> </isequal>
Neste exemplo, diferentes conjuntos de resultados serão obtidos de acordo com o valor da tag de parâmetro. Se não houver um atributo remapresults = "true", o ibatis cache o conjunto de resultados durante a primeira consulta. O mapeamento do conjunto de resultados não será realizado na próxima vez (ainda deve estar no processo), mas o conjunto de resultados em cache será usado.
Portanto, se no exemplo acima, remapresult for a propriedade falsa padrão, e um programa for escrito assim:
Hashmap <string, número inteiro> hashmap = new hashmap <string, número inteiro> (); hashmap.put ("tag", 1); SQLCLIENT.QUERYFORLIST ("TestForreMap", hashmap); hashmap.put ("tag", 2); SQLCLIENT.QUERYFORLIST ("TestForreMap", hashmap); Código Java
Hashmap <string, número inteiro> hashmap = new hashmap <string, número inteiro> (); hashmap.put ("tag", 1); SQLCLIENT.QUERYFORLIST ("TestForreMap", hashmap); hashmap.put ("tag", 2); SQLCLIENT.QUERYFORLIST ("TestForreMap", hashmap);O programa reportará um erro ao executar a última consulta de consulta. O motivo é que o ibatis usa o conjunto de resultados da primeira consulta, e os conjuntos de resultados do primeiro e da última vez são diferentes: (UserID, Name de usuário) e (UserID, UserPassword), o que leva a um erro. Se a propriedade RemaResults = "True" for usada, o iBATIS executará o mapeamento do conjunto de resultados toda vez que a consulta for executada, evitando assim erros (haverá muita sobrecarga).
16. O atributo de prenda da tag dinâmica é adicionado como um prefixo ao conteúdo do resultado. Quando o conteúdo do resultado do rótulo estiver vazio, o atributo de prenda não funcionará.
Quando o atributo de prenda existe na tag dinâmica, o primeiro atributo de prenda de suas legendas aninhadas será ignorado. Por exemplo:
<sql id = "whereresql"> <dynamic precend = "where"> <isnotNull Property = "userId" precend = "bomeus"> userId = # userID # </snotNull> <snotEmpty Property = "userName" precend = "e"> username = # username # </isNoty = " id = "whereresql"> <dynamic precend = "where"> <isNotNull Property = "userId" precend = "bokus"> userid = # userID # </snotNull> <isNoTEmpty Property = "UserName" precend = "e"> username = # uSername # </isNotMy> </dinâmica
Neste exemplo, a tag dinâmica contém duas sub-parcelas <sNotNull> e <snotEmpty>. De acordo com os princípios descritos acima, se o false atributo precend = "fals" não estiver na tag <snotNull> para remover a dinâmica, e a tag e na tag <snotempty> será ignorada, causando erros de sintaxe do SQL.
NOTA: Quando uma tag dinâmica não possui um atributo de prenda, o primeiro atributo de prensa de sua tag infantil não é automaticamente ignorado.
Os acima são 16 declarações SQL que o IBATIS é usado para apresentar a você. 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!