Introduction à Ibatis:
Ibatis est un projet open source d'Apache et une solution de mappage O / R. La plus grande caractéristique d'Ibatis est qu'elle est compacte et rapide à démarrer. Si vous n'avez pas besoin de trop de fonctions complexes, Ibatis est la solution la plus simple qui peut répondre à vos besoins et être suffisamment flexible. Maintenant, Ibatis a été renommé Mybatis.
Le site officiel est: http://www.mybatis.org/
1. Le paramètre d'entrée est une seule valeur
<delete id = "com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" ParameterClass = "Long"> Delete de MemersAccessLog où AccessTimeStamp = # Value # </preete> <Delete ID = "com.fashionfree.stat.accesslog.deleteMemberAccesslogsbefore" Paramètre " AccessTimeStamp = # Value # </ Delete>
2. Le paramètre d'entrée est un objet
<insert id = "com.fashionfree.stat.accesslog.memberAccesslog.insert" ParameterClass = "com.fashionfree.stat.accesslog.model.memberaccesslog> INSERT INDERACCESSLOG (AccessLogid, membre, ClientIp, HttpMethod, ActionId # AccessLogid #, # membre-membre #, # clientIp #, # httpMethod #, # ActionID #, # requestUrl #, # AccessTimestamp #, # extension1 #, # extension2 #, # extension3 #) </serser> <insert id = "com.fashionfree.stat.accesslog.memberaccesslog.insert" ParameterClass = "com.fashionfree.stat.accesslog.model.memberAccessLog> Insérer dans MememberAccessLog (AccessLogid, membre, ClientIp, HttpMethod, ActionId, Requep # requestUrl #, # AccessTimestamp #, # extension1 #, # extension2 #, # extension3 #) </sert>
3. Le paramètre d'entrée est un java.util.hashmap
<select id = "com.fashionfree.stat.accesslog.SelectActionIdAndActionNumber" ParameterClass = "hashmap" resultMap = "getACTACIDAndActionNumber"> Sélectionner ActionId, count (*) comme count from yemersAccesslog où menemberId = # membre # et accessTimeStamp> # start # et accessTiterAmp <= # fin # groupe par actionid </ Select> id = "com.fashionfree.stat.accesslog.SelectActionIdAndActionNumber" ParameterClass = "hashmap" resultMap = "getActionIdAndActionNumber"> Sélectionner ActionId, Count (*) comme nombre de membres accessoires de membre où le membre # Group par ActionId </ SELECT>
4. Les paramètres d'entrée contiennent des tableaux
<insert id = "updateStatusBatch" ParameterClass = "hashmap"> Mise à jour le jeu de questions status = # statut # <dynamic prend = "où questionId dans"> <isnotnull Property = "ActionId <insert id = "updateStatusBatch" ParameterClass = "hashmap"> Mise à jour le jeu de questions status = # statut # <dynamic prend = "où questionId dans"> <isnotnull Property = "ActionId
Description: Actionids est le nom du tableau passé; Utilisez la balise dynamique pour éviter les erreurs de syntaxe de l'instruction SQL lorsque le tableau est vide; Utilisez la balise ISNOTNULL pour éviter les erreurs d'analyse ibatis lorsque le tableau est nul
5. Les paramètres de passage ne contient qu'un seul tableau
<select id = "com.fashionfree.stat.acsslog.model.statmemberAction.SelectActidSofmodule" resultClass = "hashmap"> sélectionner moduleId, actionId from statMemberAction <dynamic prendare = "où moduleId in"> <itterate open = "(" close = ")" conjonction = ","> # [] </lelect> <select id = "com.fashionfree.stat.accesslog.model.statmemberAction.SelectActidSofmodule" resultClass = "hashmap"> sélectionner moduleId, actionId from statmemberAction = dynamic present = "où moduleid in"> <itaterate open = "(" close = ")" conjonction = ","> # [] </ moduleid </lect>Remarque: Notez qu'il n'y a pas d'élément de classe de paramètre dans la balise de sélection
Aussi: vous pouvez également mettre le tableau dans un hashmap ici, mais il ajoute des frais généraux supplémentaires et n'est pas recommandé de l'utiliser.
6. Laissez Ibatis analyser les paramètres directement dans les cordes
<select id = "com.fashionfree.stat.accesslog.SelectSumDistinctCountofOfACCESSMEMBERNUM" ParameterClass = "hashmap" resultClass = "int"> SELECT COUNT (DISTANDEDID) FROM DEMENTACTACSLOG WHERE ACCESSTIMESTAMP> = # start # et accessTimestamp <# end # et actionId dans $ ACTIONIDSTRING $ </ SELECT> id = "com.fashionfree.stat.accesslog.SelectSumDistinctCountofOfAccessMembernum" ParameterClass = "hashmap" resultClass = "int"> SELECT COUNT (distinct menedId) From membreAccessLog where AccessTimestamp> = # start # et accessTiTaM
Remarque: Il existe un risque d'injection SQL lors de l'utilisation de cette méthode, et il n'est pas recommandé de l'utiliser.
7. PagedQuery
<select id = "com.fashionfree.stat.accesslog.selectMemberAccessLogby" ParamètreClass = "hashmap" resultMap = "membreAcSCessLogmap"> <include refid = "selectAllsql" /> <include refid = "whheresql" /> <include refid = "pagesql" /> </ select> id = "com.fashionfree.stat.accesslog.selectMemberAccessLogby.Count" ParameterClass = "hashmap" resultClass = "int"> <include refid = "countSql" /> <include refid = "wheresql" /> </ select> <sql id = "selectAllsQL"> select AccessLogId, membre, membre, httpMETH, " ActionId, requestUrl, AccessTimeStamp, Extend1, Extend2, Extend3 de MememberAccessLog </QL> <SQL ID = "WHERESQL"> AccessTimeStamp <= # AccessTimeStamp # </QL> <SQL ID = "COUNTSQL"> SELECT COUNT (*) From MememberAccessLog </SQL> <sql ID = "Coutsql" </ql> <sql id = "wheresql"> AccessTimeStamp <= # AccessTimeStamp # </QL> <SQL ID = "COUNTSQL"> SELECT COUNT (*) From MecelAccesslog </QL> <SQL ID = "Pagesql"> <synamic> <isnotnull Property = "StartIndex"> <isNotNull Property = "PageSize" # startIndex #, # pagesize # </ isnotnull> </ isnotnull> </synamic> </ql> <select id = "com.fashionfree.stat.accesslog.selectMemberAccessLogby" ParameterClass = "hashmap" resultmap = "menemberaccesslogmap"> <incluse refid = "selectAllsq" refid = "wheresql" /> <include refid = "pagesql" /> </ select> <select id = "com.fashionfree.stat.accesslog.selectmemberaccesslogby.count" paramètreclasse = "hashmap" resulteclass = "int"> <include refid = "countSql" /> <include refe id = "selectAllSQL"> Sélectionnez AccessLogid, membre, clientIp, httpMethod, ActionId, Dequerl, AccessTimeStamp, Extend1, Extend2, Extend3 à partir de MecelAccessLog </ SQL> <SQL ID = "WHERESQL"> AccessTimeStamp <= # AccessTimestamp # </QLL> <SQL ID = " </ql> <sql id = "pagesql"> <synamic> <isnotnull property = "startIndex"> <isNotNull Property = "pagesize"> limit # startIndex #, # pagesize # </snotnull> </ isnotnull> </synamic> </sql>
Remarque: Dans cet exemple, le code doit être:
Hashmap hashmap = new hashmap (); hashmap.put ("AccessTimeStamp", SomeValue); PagedQuery ("com.fashionfree.stat.accesslog.selectmemberaccesslogby", hashmap);La méthode PagedQuery recherche d'abord une instruction mappée nommée com.fashionfree.stat.accesslog.selectMemberAccessLogby.Count pour effectuer SQL Query, obtenant ainsi le nombre d'enregistrements de com.fashionfree.stat.Accesslog.SelectMemberAccessLogby Query, puis exécute le SQL Query requis requis Query Query (com.fashionfree.stat.accesslog.selectmemberaccesslogby). Pour le processus spécifique, veuillez vous référer au code pertinent dans la classe UTILS.
8. L'instruction SQL contient plus que le signe> et moins que le signe <1. Écrivez le plus que le signe et moins que le signe comme:> <par exemple:
<delete id = "com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" ParameterClass = "Long"> Delete de membreaccesslog où AccessTimeStamp <= # value # </preete> xml <Delete id = "com.fashionfree.stat.AccessSlete MemberAccesslog où AccessTimeStamp <= # Value # </ Delete>
Placer des caractères spéciaux dans la zone CDATA de XML:
<delete id = "com.fashionfree.stat.accesslog.DeleteMemberAccessLogsBefore" ParameterClass = "Long"> <! [CDATA [Delete from amerecaccesslog où AccessTimeStamp <= # value #]]> </ delete> <Delete id = "com.fashionfree.stat.accesslog.detettemembera ParameTerClass = "Long"> <! [CDATA [Supprimer de MememberAccessLog où AccessTimeStamp <= # Value #]]> </ Delete>
Il est recommandé d'utiliser la première méthode, l'écrivez-la comme <et> (XML n'analyse pas le contenu en CDATA, donc si le CDATA contient des balises dynamiques, cela ne fonctionnera pas)
9. Inclure et les balises SQL organisent ensemble des instructions SQL communes pour un partage facile:
<sql id = "selectBasicsQL"> Sélectionner Samplingtimestamp, OnlineNum, année, mois, semaine, jour, heure à partir de OnlineMembernum </QL> <SQL ID = "WHERESQLBEFOR"> où SamplingTimeStamp <= # SamplingTimeStamp # </ SQL> <Select id = "com.fashionfree.accesslog.selectonlineMembernumsBefoResamplingtimestamp" ParameterClass = "hashmap" resultClass = "onlineMemberNum"> <include refid = "selectBasic Samplingtimestamp, onlineNum, année, mois, semaine, jour, heure de OnlineMembernum </ql> <sql id = "wheresqlbefore"> où samplingtimestamp <= # samplingtimestamp # </ql> <select id = "com.fashionfree.AccessLoge.SelectonneMemberNumsBeforESAmpLindAmp" ParameTerClass = "hashmap" resultClass = "onlineMembernum"> <include refid = "selectBasicsql" /> <inclure refid = "whiresqlbefore" /> </lect>
Remarque: les balises SQL ne peuvent être utilisées que pour référence et ne peuvent pas être considérées comme des instructions mappées. Comme dans l'exemple ci-dessus, il existe un élément SQL nommé SelectBasicsQL, et il est mal d'essayer de l'utiliser comme instruction SQL à exécuter:
sqlmapClient.QueryForList ("selectBasicsQL"); ×10. Sélectionnez des enregistrements au hasard
<sql id = ”randomsql”> Ordre par rand () limite # numéro # </ql>
Sélectionnez au hasard les enregistrements de numéro dans la base de données (uniquement pour MySQL)
11. champs de point dans le groupe SQL en regroupant
<sql id = ”selectGroupBy> select a.answerercategoryid, a.answererid, a.answeRname, a.QuestionCategoryId, a.score, a.answerednum, a.correctNum, a.answersEcondes, a.CreatedTimeStamp, a.LastQueStionAppraveTamp, a.lastmodified, groupe, groupe_concat (q. À partir de réponses de catégorie A, QuestionCategory q où a.QuestionCategoryId = Q.QuittionCategoryId Group par A.Sanswererid Order by A.AnswererCategoryId </ql> <SQL ID = ”SelectGroupBy> SELECT A.ANSWERECCORYID, A.answererid, A.answeRname, A.Qtioncategoryid, A.Score, A.answerednum, A.CorrectNum, A.Score, A.answerednum, A.CorrectNum, A.Score, A.answerednum, A.CorrectNUM,, A.SCORE A.SanswersEcondes, A.Createdtimestamp, a.LastQurestionApprovedtimestamp, a.lastmodified, groupe_concat (q.categoryName) en catégorie de réponse à la catégorie de la catégorie A.
Remarque: La fonction Group_Concat de MySQL est utilisée dans SQL
12. Trier dans l'ordre dans
①mysql:
<sql id = ”groupByinarea”> sélectionner moduleId, modulename, status, lastmodifierid, lastmodifiedName, lastmodified from Statmodule où moduleid in (3, 5, 1) commander par instr (', 3,5,1,', ',' + ltrim (moduleid) + ',') </ql> modulename, status, lastmodified, lastmodifiedName, lastmodified à partir de statmodule où moduleid dans (3, 5, 1) ordre par instr (', 3,5,1,', ',' + ltrim (moduleid) + ',') </ sql>②SqlServer:
<sql id = ”groupByinarea”> sélectionner moduleId, modulename, status, lastmodifierid, lastmodifiedName, lastmodified à partir de statmodule où moduleid dans (3, 5, 1) commander par charindex (',' + ltrim (moduleid) + ',', ', 3,5,') </sql> moduleId, modulename, status, lastmodifierid, lastmodifiedName, lastmodified à partir de statmodule où moduleid dans (3, 5, 1) ordre par charindex (',' + ltrim (moduleid) + ',', ', 3,5,1,') </ sql>Description: Les résultats de la requête seront retournés dans l'ordre de moduleID dans la liste in (3, 5, 1).
Mysql: instant (str, substr)
SQLServer: Charindex (substr, str) Renvoie la première position d'occurrence de la sous-chaîne dans la chaîne STR ltrim (str) Renvoie la chaîne STR, son caractère d'espace de démarrage (gauche) est supprimé
13.ResultMap ResultMap est responsable de la cartographie des valeurs de colonne de SQL Results set en valeurs d'attribut de Java Beans
<ResultMap id = "getActionIdAndActionNumber"> <result Column = "ActionId" propriété = "actionId" jdbcType = "bigInt" javatype = "long" /> <résultat Column = "count" Property = "count" JDBCTYPE = "int" javatype = "int" /> </ resultMap> xml code <resultMaps colonnes = "actionId" property = "actionId" jdbcType = "bigint" javatype = "long" /> <result Column = "count" Property = "count" jdbcType = "int" javatype = "int" /> </ résultatmap>
L'utilisation de resultMAP est appelée mappage explicite de résultats, qui correspond à la classe de résultats (cartographie des résultats en ligne). Le plus grand avantage de l'utilisation de résultats est qu'il est simple et pratique. Il ne nécessite pas que le résultat spécifié soit affiché. Ibatis détermine la décision basée sur la réflexion. ResultMap peut fournir une authentification de configuration plus stricte en spécifiant JDBCTYPE et Javatype.
14.Typealias
<tycias alias = "membreonlineduration" type = "com.fashionfree.stat.accesslog.model.memberOnlineduration" /> <tycias>
Vous permettre de définir des alias pour éviter une entrée répétée de noms excessivement longs
15.remap
<select id = "TestForremap" ParameterClass = "hashmap" resultClass = "hashmap" remapResults = "true"> SELECT USERID <isEqual Property = "Tag" compareValue = "1">, userName </ isEqual> <isElequal Property = "Tag" Comparevalue = "2">, userPass Gotwwor id = "TestForRemap" ParameterClass = "hashmap" resultClass = "hashmap" remapResults = "true"> SELECT USERID <isEqual Property = "Tag" compareValue = "1">, username </Sequal> <isElequal Property = "Tag" CompareValue = "2">, userPassword </ IsEqual> De l'intermédiaire
Dans cet exemple, différents ensembles de résultats seront obtenus en fonction de la valeur de la balise de paramètre. S'il n'y a pas d'attribut remapResults = "true", Ibatis mettra en cache le résultat des résultats lors de la première requête. Le mappage du jeu de résultats ne sera pas effectué la prochaine fois (il doit toujours être dans le processus), mais l'ensemble de résultats mis en cache sera utilisé.
Par conséquent, si dans l'exemple ci-dessus, RemapResult est la fausse propriété par défaut, et qu'un programme est écrit comme ceci:
Hashmap <String, Integer> Hashmap = new HashMap <String, Integer> (); hashmap.put ("tag", 1); SQLClient.QueryForList ("TestForMap", Hashmap); hashmap.put ("tag", 2); SQLClient.QueryForList ("TestForMap", Hashmap); Code java
Hashmap <String, Integer> Hashmap = new HashMap <String, Integer> (); hashmap.put ("tag", 1); SQLClient.QueryForList ("TestForMap", Hashmap); hashmap.put ("tag", 2); SQLClient.QueryForList ("TestForMap", Hashmap);Le programme rapportera une erreur lors de l'exécution de la dernière requête de requête. La raison en est qu'Ibatis utilise l'ensemble de résultats de la première requête, et les ensembles de résultats des premier et des deux dernières fois sont différents: (UserId, nom d'utilisateur) et (UserId, UserPassword), ce qui conduit à une erreur. Si la propriété RemapResults = "True" est utilisée, Ibatis effectuera le mappage du jeu de résultats à chaque fois que la requête est exécutée, évitant ainsi les erreurs (il y aura beaucoup de frais généraux).
16. L'attribut Prendater de la balise dynamique est ajouté comme préfixe au contenu des résultats. Lorsque le contenu du résultat de l'étiquette est vide, l'attribut PREPEND ne fonctionnera pas.
Lorsque l'attribut PRENPEND existe dans la balise dynamique, le premier attribut Prend de ses sous-titres imbriqués sera ignoré. Par exemple:
<sql id = "wheresql"> <dynamic prend = "where"> <isnotnull propriété = "userId" prend = "bogus"> userid = # userid # </snotnull> <isNotempty Property = "username" prend = "et"> username = # username # </ isNotempty> id = "wheresql"> <dynamic prend = "where"> <isnotnull propriété = "userId" prend = "bogus"> userid = # userid # </snotnull> <isNotempty propriété = "username" prend = "et"> username = # username # </ isNoteMpty> </s dynamic> </sql>
Dans cet exemple, la balise dynamique contient deux sous-étiquettes <snotnull> et <isNotempty>. Selon les principes décrits ci-dessus, si le faux attribut prend = "Bogus" n'est pas dans la balise <snotnull> pour supprimer la dynamique, et la balise <isNotempty> sera ignorée, provoquant des erreurs de syntaxe SQL.
Remarque: Lorsqu'une balise dynamique n'a pas d'attribut Prend, le premier attribut de pré-talon de sa balise enfant n'est pas automatiquement ignoré.
Ce qui précède est 16 instructions SQL que Ibatis est utilisée pour vous présenter. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!