Introducción a Ibatis:
Ibatis es un proyecto de código abierto de Apache y una solución de mapeo O/R. La característica más importante de Ibatis es que es compacta y rápida para comenzar. Si no necesita demasiadas funciones complejas, Ibatis es la solución más simple que puede cumplir con sus requisitos y ser lo suficientemente flexible. Ahora Ibatis ha sido renombrado MyBatis.
El sitio web oficial es: http://www.mybatis.org/
1. El parámetro de entrada es un valor único
<delete id = "com.fashionfree.stat.accesslog.deletememberAccesslogSbeFore" parameterClass = "long"> Eliminar de memberAccesslog donde accesstimestamp = # valor # </elete> <elelete id = "com.fashionfree.accesslog.deletemberCesslogsBeBeforefore MemberAccesslog donde accesstimeStamp = # value # </delete>
2. El parámetro de entrada es un objeto
<insert id = "com.fashionfree.stat.accesslog.memberaccesslog.insert" parameterclass = "com.fashionfree.stat.accesslog.model.memberaccesslog> insertar en miembro memberaccesslog (accessLogid, miembro, clientip, httpmethod, actionId, request, timestamp, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1, Extend1 valores ( #accesslogid #, #memberId #, #clientip #, #httpmethod #, #actionId #, #requestUrl #, #accesstimeStamp #, #extend1 #, #extend2 #, #extend3 #) </sert> <insertar = "com.fashionfree.stat.accesslog.memberaccesslog.insert" "" "" "" parameterClass = "com.fashionfree.stat.accesslog.model.memberaccesslog> Inserte en memberAccessLog (AccessLogid, MemberId, ClientIP, Httpmethod, ActionId, requestUrl, AccessTimest, Extend1, Extend2, Extend3) Valores ( #AccessLogid #, #MemberId #, #Clientip #, #, #, #HTTPETPT #ActionID #, #requestUrl #, #accesstimeStamp #, #extend1 #, #extend2 #, #extend3 #) </insert>
3. El parámetro de entrada es un java.util.hashmap
<select id = "com.fashionfree.stat.accesslog.selectactionIdAndAncactionNumber" ParameterClass = "Hashmap" resultMap = "getActionIdAndActionNumber"> Seleccione ActionId, Count (*) como Count Desviant id = "com.fashionfree.stat.accesslog.SelectActionIdAndActionNumber" ParameterClass = "HashMap" resultMap = "getActionIdAndactionNumber"> Seleccione ActionId, Count (*) como Count desde MemberAccesSlog Where MemberId = # memberId # y AccessTimestamp> # Start # y AccessTimestamp <= # end # Group por ActionId </SEECT>
4. Los parámetros de entrada contienen matrices
<insertar id = "updateStatusBatch" parameterClass = "hashmap"> actualizar el set status = # status # <dynamic prepend = "WhereDid en"> <isnotNull Property = "ActionIds"> <iterate Property = "ActionIds" Open = "(" Close = ")" Conjunction = ","> #ActionIds [] # </</> </> <//esnotnule> </Dynamm. <insertar id = "updateStatusBatch" parameterClass = "hashmap"> actualizar el set status = # status # <dynamic prepend = "WhereDid en"> <isnotNull Property = "ActionIds"> <iterate Property = "ActionIds" Open = "(" Close = ")" Conjunction = ","> #ActionIds [] # </</> </> <//esnotnule> </Dynamm.Descripción: ActionIDS es el nombre de la matriz aprobada; Use la etiqueta dinámica para evitar errores de sintaxis de la declaración SQL cuando la matriz esté vacía; Use la etiqueta ISNOTNULL para evitar errores de análisis de ibatis cuando la matriz es nula
5. Los parámetros de paso contienen solo una matriz
<select id = "com.fashionfree.stat.accesslog.model.statmemberAction.SelectActionIdSOfModule" resultClass = "Hashmap"> Seleccione ModuleId, ActionId de StatMemberAction <Dynamic Prepend = "Where ModuleId en"> <iterate Open = "(" Close = ")" Conjunción = "> # [] # <iteererer. </select> <select id = "com.fashionfree.stat.accesslog.model.statmemberAction.selectActionIdSofModule" resultClass = "Hashmap"> select ModuleId, ActionId desde StatMemberAction <Dynamic PrePend = "Where ModuleId en"> <iterate Open = "(" Close = ")" AjUnction = ","> # [] # <] # </iterer por MODULEID </select>Nota: Tenga en cuenta que no hay un elemento de clase de parámetros en la etiqueta Seleccionar
Además: también puede poner la matriz en un hashmap aquí, pero agrega sobrecarga adicional y no se recomienda usarla.
6. Deje que ibatis analice los parámetros directamente en cadenas
<select id = "com.fashionfree.stat.accesslog.selectsumDistinctCountoFaccessMembernum" ParameterClass = "Hashmap" resultClass = "int"> select Count (distinto memberID) de MemberAccesslog Where AccessTimestitM> = # Start # y AccessTimestamp < # end # y ActionId en $ ActionIid $ <<</select> <Select> <Select> id = "com.fashionfree.stat.accesslog.selectsumDistinctCountoFaccessMembernum" ParameterClass = "Hashmap" resultClass = "int"> seleccione Count (Distinto MemberId) de MemberAccesslog Where AccessTimestamp> = # Start # y AccessTomestamp < # end # y ActionID en $ ActionIdstring $ <</select>>
Nota: Existe el riesgo de inyección SQL cuando se usa este método, y no se recomienda usarlo.
7. PagedQuery
<select id = "com.fashionfree.stat.accesslog.selectmemberAccesslogby" ParameterClass = "Hashmap" resultMap = "memberAccesslogMap"> <include refid = "selectallSql"/> <incluido refid = "wheresql"/> <include Refid = "pAGesql"/> </select> <select> <select> <Select> <Select> <Select> <Select> <Select> <Select> <SEEC id = "com.fashionfree.stat.accesslog.selectmemberaccesslogby.count" parameterClass = "hashmap" resultclass = "int"> <include refid = "countsql"/> <include Refid = "Wheresql"/> </select> <sql Id = "SelectallSql"> Select AccessLogid, MemberId, htttODDODYMETDODODODI ActionId, request, AccessTimestamp, Extend1, Extend2, Extend3 de MemberAccesSlog </sql> <sql id = "wheresql"> accesstimeStamp <= # accesstimeStamp # </sql> <sql id = "countsql"> select Count (*) de MemberAcCessLog </sql> <Sql ID = " MemberAccessLog </sql> <sql id = "wheresql"> accesstimeStamp <= # accesstimeStamp # </sql> <sql id = "CountSql"> select Count (*) de MemberAccessLog </sql> <Sql Id = "Pagesql"> <Dynamic> <isNull Property = "startIndex"> <s isStEx "> <sseTeTeT Propiedad = "PageSize"> Límite # StartIndex #, # PageSize # </snotnull> </snotnull> </ynamic> </sql> <select id = "com.fashionfree.stat.accesslog.selectmemberaccesslogby" parameter = "hashmap" resultMap = "miembro de memberaccesslogmap"> <incluir a refid = "selectallSql"/> <include refid = "wheresql"/> <include refid = "pagesql"/> </select> <select id = "com.fashionfree.stat.accesslog.selectememberAccessLogby.count" ParameterClass = "Hashmap" result -Class = "INT"> <Enl Incluye Refid = "CountSql"/" refid = "wheresql"/> </select> <sql id = "selectAllSql"> Seleccione AccessLogid, MemberId, ClientIP, Httpmethod, ActionAd, RequestUrl, AccesstimeStamp, Extend1, Extend2, Extend3 de MemberAsSlog <sql id = "countsql"> select Count (*) de MemberAccesSlog </sql> <sql id = "pagesql"> <nynamic> <isnotNull Property = "startIndex"> <isNotNull Property = "PageSize"> LIMIT # startIndex #, # Pagesize # </isNotnull> </esnotnull> </Dynym
Nota: En este ejemplo, el código debería ser:
Hashmap hashmap = new Hashmap (); Hashmap.put ("AccessTimestamp", SomeValue); PagedQuery ("com.fashionfree.stat.accesslog.selectmemberaccesslogby", hashmap);El método PagedQuery primero busca una declaración mapeada llamada com.fashionfree.stat.accesslog.selectmemberaccesslogby.count para realizar una consulta SQL, obteniendo así el número de registros de com.fashionfree.stat.accesslog.selectmemberAccessLogby Query, y luego realiza el sql query requerido (com.fashionfree.stat.accesslog.selectmemberaccesslogby). Para el proceso específico, consulte el código relevante en la clase Utils.
8. La declaración SQL contiene mayor que el signo> y menos que el signo <1. Escriba el signo mayor y menos que el signo como:> <Por ejemplo:
<Elelete id = "com.fashionfree.stat.accesslog.deletememberAccesslogSbefore" ParameterClass = "Long"> Eliminar de MemberAccesslog donde AccessTimestamp <= # valor # </elelete> XML Code <deletié = "com.fashion.stat.accesslog.deletememberaccessbefore" Desde MemberAccessLog donde AccessTimestamp <= # value # </elelete>
Coloque caracteres especiales en el área de Cdata de XML:
<delete id = "com.fashionfree.stat.accesslog.deletememberAccesslogSbefore" parameterClass = "long"> <! [Cdata [delete de memberAccesslog donde accesstimeStamp <= # valor #]]> </delelete> <elete id = "com.fashionfree.stat.accesslog.ddeletelEllogsLlogsLlogSlogslogslogslogsLogsLOGEBERSEBRE ParameterClass = "Long"> <! [CDATA [Delete de MemberAccessLog donde AccessTimestamp <= # valor #]]> </elete>
Se recomienda usar el primer método, escríbelo como <y> (XML no analiza el contenido en Cdata, por lo que si el CDATA contiene etiquetas dinámicas, no funcionará)
9. Incluya y las etiquetas SQL organizan declaraciones SQL comunes juntas para compartir fácilmente:
<sql id = "selectbasicsql"> Seleccionar SamplePlingtimeStamp, Onlinenum, año, mes, semana, día, hora de Onlinemembernum </sql> <sql id = "wheresqlbebefore"> Where SamplePplingtimeMestamp <= # SamplePlingtimeStamp # </sql> <Select SELECT id = "com.fashionFree.accesslog.SelectOnlinEmembernumSbeFefefefefefefefefefefefefefifeTimeStamp SamplingtimeStamp, Onlinenum, año, mes, semana, día, hora de Onlinemembernum </sql> <sql id = "wheresqlbebefore"> donde muestras de muestras <= # samplingtimeStamp # </sql> <select id = "com.fashionfree.accesslog.selectonlinEnlumnumsbeForesamPamlingtimeTtimsam" " ParameterClass = "Hashmap" resultClass = "Onlinemembernum"> <include refid = "selectBasicsql" /> <include Refid = "WheresqlBefore" /> </select>
Nota: Las etiquetas SQL solo se pueden usar como referencia y no pueden considerarse como declaraciones mapeadas. Como en el ejemplo anterior, hay un elemento SQL llamado SelectBasicsQL, y es incorrecto intentar usarlo como una declaración SQL para ejecutar:
sqlmapClient.QueryForList ("SELECTBASICSQL"); ×10. Seleccione al azar registros
<sql id = ”randomsql”> orden por rand () límite # número # </sql>
Seleccione al azar registros de números de la base de datos (solo para MySQL)
11. Campos de puntada en el grupo SQL agrupando
<Sql id = ”SelectGroupby> Seleccionar A.AnswerercategoryId, A.Answererid, A.Answerername, A.QuestionCategoryId, A.Score, A.AnsweredNum, A.CorrectNum, A.AnswerSeConds, A.CreateDtimeStamp, A.LastQuespapRovedTimestamp, A.LastModified, Group_Concat (Q.ConcatiM FROM AnswererCategory a, QuestionCategory q WHERE a.questionCategoryId = q.questionCategoryId GROUP BY a.answererId ORDER BY a.answererCategoryId </sql><sql id=”selectGroupBy> SELECT a.answererCategoryId, a.answererId, a.answererName, a.questionCategoryId, a.score, a.answeredNum, a.correctNum, A.AnsewerSeconds, A.CreatedtimeStamp, A.LastQuestionApprovedTimestamp, A.LastModified, Group_concat (Q.CategoryName) como CategoryName de RespuestaCercategoría A, CuestionCategoría Q donde laquestionCegatoryId
Nota: La función Group_concat de MySQL se usa en SQL
12. Ordenar en el orden en
①Mysql:
<sql id = ”groupbyinarea”> seleccione ModuleId, ModulEname, Status, LastModifierId, LastModifiedName, LastModified de StatModule Where ModuleId en (3, 5, 1) Orden por instreración (', 3,5,1,', ',+ltrim (Moduleid)+' ',') </sql> <sq Id = " Modulename, Status, LastModifierId, LastModifiedName, LastModified de StatModule donde ModuleId en (3, 5, 1) orden por instreras (', 3,5,1,', '+ltrim (ModuleId)+', ') </sql>②SQLServer:
<<sql id = "groupbyinArea"> seleccionar módulo de módulo, nombre de módulo, estado, últimoModifierId, LastModifiedName, LastModified de StatModule Where ModuleId en (3, 5, 1) orden por charindex (','+ltrim (moduleid)+',', ', 3,5,1,') MODULEID, MODULENEM, ESTADO, LASTMODIFERID, LastModifiedName, LastModified de StatModule donde ModuleId en (3, 5, 1) orden por charindex (','+ltrim (moduleid)+',', ', 3,5,1,') </sql>Descripción: Los resultados de la consulta se devolverán en el orden de móduloid en la lista In (3, 5, 1).
MySQL: Instr (Str, Substr)
SQLServer: CharIndex (Substr, Str) Devuelve la primera posición de ocurrencia de la subcadena en la cadena Str Ltrim (str) Devuelve la cadena Str, su carácter de espacio de arranque (izquierda) se elimina
13.ResultMap ResultMap es responsable de mapear los valores de la columna de los resultados de los resultados de la consulta SQL en los valores de atributo de los granos Java
<resultmap id = "getActionIdAndActionNumber"> <resultado columna = "ActionId" Property = "ActionId" JDBCType = "BigInt" Javatype = "Long"/> <Result Column = "Count" Property = "Count" JDBCType = "int" javatype = "int"/> </resultMap> xml Code <resultmap id = "getActionDandAndAndAnding columna = "ActionId" Property = "ActionId" JDBCType = "Bigint" javatype = "long"/> <resultado columna = "count" propiedad = "count" jdbctype = "int" javatype = "int"/> </sultMap>
El uso de ResultMap se denomina mapeo de resultados explícito, que corresponde a ResultClass (mapeo de resultados en línea). La mayor ventaja de usar ResultClass es que es simple y conveniente. No requiere que se muestre el resultado especificado. Ibatis determina la decisión basada en la reflexión. ResultMap puede proporcionar una autenticación de configuración más estricta especificando JDBCType y Javatype.
14. Typealias
<typealias alias = "memberonlineduration" type = "com.fashionfree.stat.accesslog.model.memberonlineduration" /> <Pyypealias>
Permitirle definir alias para evitar la entrada repetida de nombres excesivamente largos
15. Revestimiento
<select id = "testForrEmap" ParameterClass = "HashMap" resultClass = "HashMap" remapResults = "true"> seleccione UserId <isequal Property = "tag" compareValue = "1">, nombre de usuario </isequal> <Eequal Property = "Tag" CompareValue = "2">, UserPassword </isEqual> de userfo id = "testForrEmap" ParameterClass = "Hashmap" resultClass = "Hashmap" remapresults = "true"> seleccione UserId <isequal Property = "tag" compareValue = "1">, nombre de usuario </isequal> <isequal Property = "tag" compareValue = "2">, userpassword </isEqual> de useriMeNfo </select> SELECT>
En este ejemplo, se obtendrán diferentes conjuntos de resultados de acuerdo con el valor de la etiqueta de parámetro. Si no hay atributo remapresults = "verdadero", Ibatis almacenará en caché el resultado establecido durante la primera consulta. El mapeo del conjunto de resultados no se realizará la próxima vez (aún debe estar en el proceso), pero se utilizará el conjunto de resultados en caché.
Por lo tanto, si en el ejemplo anterior, remapresult es la propiedad falsa predeterminada, y un programa se escribe así:
Hashmap <string, integer> hashmap = new Hashmap <String, Integer> (); hashmap.put ("etiqueta", 1); sqlclient.QueryForList ("testForrEMap", hashmap); hashmap.put ("etiqueta", 2); sqlclient.QueryForList ("testForrEMap", hashmap); Código Java
Hashmap <string, integer> hashmap = new Hashmap <String, Integer> (); hashmap.put ("etiqueta", 1); sqlclient.QueryForList ("testForrEMap", hashmap); hashmap.put ("etiqueta", 2); sqlclient.QueryForList ("testForrEMap", hashmap);El programa informará un error al ejecutar la última consulta de consulta. La razón es que Ibatis usa el conjunto de resultados de la primera consulta, y los conjuntos de resultados de las primeras y últimas dos veces son diferentes: (UserId, UserName) y (UserId, UserPassword), lo que conduce a un error. Si se usa la propiedad remapResults = "verdadera", Ibatis realizará el mapeo del conjunto de resultados cada vez que se ejecute la consulta, evitando así los errores (habrá muchas sobrecargas).
16. El atributo prepend de la etiqueta dinámica se agrega como prefijo al contenido de resultados. Cuando el contenido de resultados de la etiqueta está vacío, el atributo Prepend no funcionará.
Cuando el atributo Prepend existe en la etiqueta dinámica, se ignorará el primer atributo Prepend de sus subtítulos anidados. Por ejemplo:
<sql id = "wheresql"> <<Dynamic prepend = "Where"> <isnotNull Property = "userId" prepend = "Bogus"> userId = # userId # </isnotnull> <isnotempty Property = "username" prepend = "y"> username = # username # </snotempty> </ynamic> </sql> <Sql> <Sql> id = "wheresql"> <Dynamic Prepend = "Where"> <isNotNull Property = "userId" prepend = "Bogus"> userId = # userId # </isnotnull> <isNotEmpty Property = "username" prepend = "y"> username = # username # </snotempty> </ynynamic> </sql>
En este ejemplo, la etiqueta dinámica contiene dos sub-etiquetas <snotnull> y <isotempty>. De acuerdo con los principios descritos anteriormente, si el atributo falso prepend = "falso" no está en la etiqueta <isnotnull> para eliminar la dinámica, y en la etiqueta <snotempty> se ignorará, causando errores de sintaxis SQL.
Nota: Cuando una etiqueta dinámica no tiene un atributo Prepend, el primer atributo Prepend de su etiqueta infantil no se ignora automáticamente.
Las anteriores son 16 declaraciones SQL que se usa Ibatis para presentarle. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!