En fait, l'une des caractéristiques puissantes de MyBatis est généralement ses capacités dynamiques SQL. Si vous avez de l'expérience en utilisant JDBC ou d'autres cadres similaires, vous comprenez qu'il est très emmêlé pour concaténer dynamiquement les chaînes SQL, assurez-vous de ne pas oublier les espaces ou d'omettre des virgules à la fin de la liste. Le SQL dynamique dans Mybatis peut gérer soigneusement cette douleur. Pour SQL dynamique, le moyen le plus simple est de nous donner divers jugements de comportement dynamique lorsqu'il est codé dur. Dans MyBatis, un langage SQL dynamique puissant est utilisé pour améliorer cette situation, qui peut être utilisée dans n'importe quelle mappage des instructions SQL. Les éléments SQL dynamiques sont similaires à l'utilisation de JSTL ou d'autres processeurs de texte basés sur XML similaires. Mybatis utilise des expressions puissantes basées sur OGNL pour éliminer d'autres éléments.
Plusieurs éléments de nœud que nous utilisons couramment incluent IF, choisissez (quand, sinon), la garniture (où, si) et le foreach. Je me sens un peu comme l'utilisation de XSLT (je le mentionnerai plus tard dans l'article ~).
(1) utilisation de si
Dans la configuration de pagination du viisitmapper, si PageIndex> -1 et pagesize> -1, la pagination correspondante SQL sera ajoutée, sinon elle ne sera pas ajoutée (la valeur par défaut est prise), comme suit:
<select id = "getListBypageNate" ParameterType = "PagenateArgs" resultType = "Visitor"> SELECT * FROM (<include refid = "getListSQL" /> <inclure refid = "orderBysql" />) t <! - # {} signifie paramétrie test = "Pagestart> -1 et pageSize> -1"> limite # {pagestart}, # {pageSize} </ if> </ select> <sql id = "getListSQL"> SELECT * From Visitor Where Status> 0 </ql> <Sql id = "OrderBysql"> Ordre par $ {OrderFieldStr} $ {OrderDirdir}Parce que nos paramètres PageIndex et PageSize sont tous deux des valeurs int, nous pouvons porter des jugements directs comme celui-ci. S'il s'agit d'une instance d'objet, nous pouvons utiliser un jugement nul pour contrôler une logique dynamique. Le développement spécifique dépend des besoins commerciaux. Je pense qu'il est important de noter ici qu'il n'est pas facile d'écrire &&, cela ne sera pas reconnu dans la configuration ~.
(2) L'utilisation de choix (quand, sinon)
Choisissez lorsqu'il est principalement utilisé dans les scénarios d'application qui ne remplissent que l'une des conditions dans plusieurs conditions. Par exemple, voici une condition de requête, un identifiant, un nom et une création respectivement. Supposons que lorsque nous interrogeons le tableau des visiteurs, si VisitorId a une valeur, utilisez la requête ID et si VisitorName a une valeur, utilisez la requête VisitName. Comme suit, ajoutez la méthode List <Visitor> getListChooseWhenme (BasicQueryargs Args) à la classe d'interface david.mybatis.demo.ivisitoroperation. Ajoutez la configuration du nœud de sélection correspondant dans VisitOrmapper:
Package David.mybatis.demo; Importer java.util.list; importer david.mybatis.model.basicqueryargs; importer david.mybatis.model.pagenateargs; import david.mybatis.model.visitor; import david.mybatis.model.Visitorwithrn; interface publique {* * * * Advrow Visiteur * / public int Add (visiteur visiteur); / * * Supprimer le visiteur * / public int Delete (int id); / * * Mise à jour Visitor * / public int mettrate (visiteur visiteur); / * * Requête Visitor * / Public Visitor Query (int id); / * * Liste de requête * / Liste publique <Sisitor> getList (); / * * Liste des requêtes de pagination * / Liste publique <Sisetor> getListBypageNate (pagenateargs args); / * * Liste de requête de pagination (y compris Rownum) * / Liste publique <Visitorwithrn> GetListBypageNateWithrn (Pagenateargs args); / * * Basic Query * / Public Visitor BasicQuery (int id); / * * Dynamic Condition Query (choisissez, quand) instance * / public list <Visitor> getListChooseWhenmemo (BasicQueryArgs args); / * * Dynamic Condition Query (où, if) instance * / public list <sin visitor> getListHhereDemo (BasicQueryArgs args); / * * Dynamic Query (foreach) instance * / public list <sin visitor> getListForEachDemo (list <Integer> ids); } <? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Mappep Public "- // Mybatis.org//dtd Mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><Mapper namespace = "david.mybatis.demo.ivisitoroperation"> <resultmap type = "Visitor" id = "Visitorrs"> <id Column = "id" Property = "id" /> <Result Column = "name" Property = "Name" /> <Result Collumn = "Courriel" Property = "Courriel" /> <Result Column = "Status" Property = "Status" /> <Result Collum Property = "CreateTime" /> </ ResultMap> <Sql id = "getListSQlConditions"> Sélectionner * dans Visitor </QL> <! - Choisissez quand l'une des conditions est remplie -> <select id = "getListChoosewendo" <if test = "QueryStatus> 0"> status = # {queryStatus} </ if> <poose> <quand test = "QueryId! = 0"> Et id = # {queryId} </ when> <Quand test = "QueryName! = Null"> Et nom comme # {queryName} </ WHOR </ Where> </lect> </naupper>(3) utilisation de l'endroit où (garniture)
L'avantage de l'endroit où les mots clés sont que s'il existe des conditions de filtre correspondantes, il sait insérer où les mots clés à des moments appropriés. Et il sait également quand supprimer les connecteurs correspondants et / ou, traitant principalement des scénarios suivants
<select id = "findactivebloglily" resultType = "blog"> sélectionner * dans le blog où <if test = "state! = null"> state = # {state} </ if> <if test = "title! = null"> and title comme # {title} </ if> <if test = "Author! = null and Authrame.name! = null"> et auteurIl ne deviendra pas le résultat de l'échec de toutes les conditions
<select id = "findactivebloglily" resultType = "blog"> sélectionner * dans le blog où </lect>
Ou parce que la première condition n'est pas remplie, la condition suivante n'est remplie que.
<select id = "findactivebloglily" resultType = "blog"> sélectionner * dans le blog où et un titre comme 'Sometitle' </lect>
Par conséquent, pour cela, nous pouvons créer un exemple de choix lors de la condition, et ajouter la méthode correspondante de la liste publique <Sisetor> getListHereDemo (BasicQueryArgs Args) à la classe d'interface IvisitorOperation, et ajouter la configuration correspondante dans le fichier de configuration VisitorMapper comme suit:
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Mappep Public "- // Mybatis.org//dtd Mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><Mapper namespace = "david.mybatis.demo.ivisitoroperation"> <sql id = "getListsqlConditions"> Sélectionner * dans le visiteur </ql> <! - Ajouter des opérations si les conditions sont remplies -> <Select Id = "getListHeredemo" ResultMap = "Visitorrs" paramètre = "BasicQueryargs"> <incluse refits " /> <où> <if test = "QueryStatus> 0"> Statut> 0 </ if> <if test = "queryId> 0"> et id = # {queryId} </ if> <if test = "QueryName! = Null"> Et name Like = # {queryname} </f> <if test = "Querytime! = Null"> et crénetime> = # # # # # # # # # # # # </ querytime! = NULL "> Et Createtime> = # # # # # # # # # # ' </ où> <! - <Trim prefix = "où" prefixoverRides = "et | ou"> <if test = "QueryStatus> 0"> status> 0 </ if> <if test = "queryId> 0"> et id = # {queryId} </ if> <if test = "QueryName! = Null"> et name comme = # {Queryname} test = "querytime! = null"> et createTime> = # {querytime} </ if> </mim> -> </lect> </naunper>(4) Utilisation de Forach
Dans un SQL dynamique couramment utilisé, nous avons un scénario commercial où ID dans une grande chaîne d'ID. Dans ce cas, nous pouvons utiliser ForEach sans avoir à travailler dur pour épisser la chaîne d'ID. La même étape consiste à ajouter la méthode correspondante à la classe publique de classe d'interface Ivisitoroperation <Visitor> getListForEachDemo (list <Integer> IDS), puis à configurer les informations d'élément de nœud correspondantes dans le fichier de mapper correspondant, comme suit:
<? xml version = "1.0" Encoding = "UTF-8"?> <! Doctype Mappep Public "- // Mybatis.org//dtd Mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><Mapper namespace = "david.mybatis.demo.ivisitoroperation"> <sql id = "getListsQlConditions"> Sélectionner * From Visitor </QL> <! - ForEach Loop Conditions -> <Select Id = "GetListForEachDemo" ResultMap = "Visitorrs"> <incluse Rebelle = "getListSQLConditions" /> WHERE STATRALLE> <ID dans <for pour leach Collection = "list" item = "item" index = "index" open = "(" séparateur = "," close = ")"> $ {item} </foreach> </lect> </ mapper>Enfin, il vous suffit d'établir la méthode de test correspondante dans Demorun, et le SQL dynamique dans MyBatis sera terminé. La méthode Demorun utilisée pour le test ci-dessous
/ * * Dynamic Query ForEach Instance * / public static void getListForEachDemo (list <Integer> ids) {sqlSession session = mybatisutils.getsqlSession (); IVisitorOperation Voperation = session.getMapper (iVisitorOperation.class); List <Visitor> ls = voperation.getListForEachDemo (ids); pour (visiteur visiteur: ls) {System.out.println (visiteur); }} / * * Dynamic Query où If If instance * / public static void getListwheRecondition (int id, name de chaîne, date de création) {name = name == ""? NULL: nom; SESSESSE SQLSESSION = MyBatisUtils.getsQlSession (); BasicQueryArgs args = new BasicQueryArgs (id, nom, CreateTime); IVisitorOperation Voperation = session.getMapper (iVisitorOperation.class); List <Visitor> ls = voperation.getListHereDemo (args); if (ls.size () == 0) System.out.println ("Check No Match!"); else {for (visiteur visiteur: ls) {System.out.println (visiteur); }}} / * * Dynamic Query Choisissez quand l'instance * / public static void getListchoosewhenmemo (int id, nom de chaîne, date de création) {name = name == ""? NULL: nom; SESSESSE SQLSESSION = MyBatisUtils.getsQlSession (); BasicQueryArgs args = new BasicQueryArgs (id, nom, CreateTime); IVisitorOperation Voperation = session.getMapper (iVisitorOperation.class); List <Visitor> ls = voperation.getListChoosewendemo (args); if (ls.size () == 0) System.out.println ("Check No Match!"); else {for (visiteur visiteur: ls) {System.out.println (visiteur); }}}
PS: À propos d'Ognl
OGNL est l'abréviation du langage de navigation graphique objet. Du point de vue de la langue: c'est un langage d'expression puissant utilisé pour obtenir et définir les propriétés des objets Java. Il vise à fournir une syntaxe d'abstraction plus élevée pour naviguer sur les graphiques d'objets Java. OGNL a des applications dans de nombreux endroits, comme:
Langue de liaison comme éléments GUI (TextField, ComboBox, etc.) pour modéliser les objets.
Tableau de base de données pour swing la langue de la source de données de TableModel de Swing.
Le langage de liaison pour les composants Web et les objets de modèle d'arrière-plan (webognl, tapestry, webwork, webObjects).
En tant qu'alternative plus expressive à Jakarata Commons Beanutils ou en langue d'expression JSTL.
De plus, il y a beaucoup de choses qui peuvent être faites dans Java, qui peuvent également être faites en utilisant OGNL, telles que la cartographie de la liste et la sélection. Pour les développeurs, en utilisant OGNL, vous pouvez utiliser la syntaxe concise pour terminer la navigation des objets Java. D'une manière générale, la navigation des informations sur les objets est terminée par un "chemin". Ce "chemin" peut être un attribut à un bean Java, un objet indexé dans une collection, etc., plutôt que d'utiliser directement la méthode get ou set.