Parfois, un jugement de sécurité est requis dans les conditions de la déclaration SQL. Par exemple, si le paramètre passé est vide lors de l'interrogation en fonction d'une certaine condition, le résultat de la requête est susceptible d'être vide pour le moment. Peut-être que lorsque nous aurons besoin que le paramètre soit vide, nous trouverons toutes les informations. Utilisez les séquences d'Oracle et les fonctions MySQL pour générer des ID. À l'heure actuelle, nous pouvons utiliser Dynamic SQL. Tous les éléments suivants sont la syntaxe et les fonctions MySQL (telles que String Link Function Concat).
SELECTKEY TAG
Dans l'instruction INSERT, Oracle utilise souvent des séquences et des fonctions dans MySQL pour générer automatiquement la clé principale de la table d'insertion, et une méthode est requise pour renvoyer cette clé primaire générée. Cet effet peut être réalisé en utilisant la balise SelectKey de MyBatis. L'exemple suivant est d'utiliser la fonction personnalisée de la base de données MySQL NextVal («Student») pour générer une clé et la définir sur la propriété StudentID dans la classe d'entité passée. Ainsi, après avoir exécuté cette méthode, le bord peut obtenir la clé générée via cette classe d'entité.
<! - INSERT Student Automatic Primary Key -> <insert id = "createStudentAutokey" ParameterType = "liming.student.manager.data.model.studententity" keyproperty = "StudentId"> <SelectKey Keyproperty = "StudentId" ResultType = "String" Ordre = "avant"> SELECT NEXTVAL ('Student') </ SelectKe Student_tbl (Student_id, Student_name, Student_Sex, Student_Birthday, Student_photo, class_id, place_id) Values (# {StudentId}, # {StudentName}, # {StudentSex}, # {StudentBirthday}, # {StudentPhoto, Javatype = Byte [], JdbcType = Blob, Javatype = Byte [], JdbcType = Blob, Blob, Javatype = Byte [], JDBCTYPE = BLOB, BLOB, Javaty typehandler = org.apache.ibatis.type.blobtypeHandler}, # {classid}, # {PlaceId}) </serser>
Appeler des méthodes d'interface et obtenir la génération automatique de clés
StudentEntity Entity = New StudentEntity (); entity.setStudentName ("Hello Dawn"); entité.setStudentSex (1); entity.setStudentBirthday (dateUtil.parse ("1985-05-28")); entity.setClassId ("20000001"); entity.setplaceID ("70000001"); this.damicsqlmapper.CreateStudentAutokey (entité); System.out.println ("New Student ID:" + Entity.getStudentid ());
Détails de configuration de la propriété SELECTKKEY:
| propriété | décrire | Obtenez la valeur |
| député | L'attribut qui doit être défini pour le résultat généré par l'instruction SelectKey. | |
| résultat | Générer des types de résultats. MyBatis permet l'utilisation de types de données de base, y compris les types de chaîne et INT. | |
| Commande | 1: Avant, la clé primaire sera d'abord sélectionnée, puis le KeyProperty sera défini, puis l'instruction INSERT sera exécutée; 2: Après, exécutez d'abord l'instruction INSERT, puis l'instruction SelectKey. | AVANT APRÈS |
| ConstatType StatementType | MyBatis prend en charge la déclaration, les formulaires de déclaration préparés et appelés, correspondant aux réponses de déclaration, de mise en scène et de callablestatement. | DÉCLARATION PRÉPARÉ Appelant |
Si tag
Si les balises peuvent être utilisées dans de nombreux types d'instructions SQL, prenons la requête comme exemple. Tout d'abord, regardons une requête très ordinaire:
<! - Query Student List, Like Name -> <Select id = "getStudentListlikename" ParameterType = "StudentEntity" resultMap = "StudentResultMap"> SELECT * FROM Student_tbl St Where St.Student_name Like Concat (Concat ('%', # {StudentName}), '%') </ Select> Cependant, si StudentName ou StudentSex est nul pour le moment, cette déclaration est susceptible de signaler une erreur ou que le résultat de la requête est vide. Pour le moment, nous utilisons l'instruction SQL IF dynamique pour porter les jugements en premier. Si la valeur est nulle ou égale à une chaîne vide, nous ne porterons pas de jugements sur cette condition et augmenterons la flexibilité.
Le paramètre est l'étudiant de classe d'entité. Tous les attributs de la classe d'entité sont jugés et s'ils ne sont pas vides, la condition de jugement est exécutée.
<! - 2 if (paramètre de jugement) - Utilisez la propriété dont la classe d'entité n'est pas vide comme l'endroit où la condition -> <select id = "getStudentList_if" resultMap = "resultMap_studententity" ParameterType = "liming.student.manager.data.model.studententity"> SELECT ST.Student_id, St.Student_name, stetudent_sex, saint St.Student_Birthday, St.Student_photo, St.Class_id, St.Place_id de Student_tbl St Where <if test = "StudentName! = Null"> St.Student_name Like Concat (Concat ('%', # {StudentName, JDBCTYPE = VARCAT "> Et saint-est_sex = # {StudentSex, jdbcType = Integer} </ if> <if test =" StudentBirthday! = Null "> et saint-datte_birthday = # {StudentBirthday, JdbcType = Date} </If> <If Test =" Classid! = Null et Classid! = '' "" # {Classid, jdbcType = varchar} </ if> <if test = "classitity! = null and clasentity.classid! = null and clasentity.classid! = ''"> et st.class_id = # {Classentity.classid, jdbcType = varchar} </ if> <if test = "lis St.Place_id = # {PlaceId, jdbcType = varChar} </ if> <if test = "PlaceEntity! = Null and PlaceEntity.placeID! = Null et placeentity.placeID! = ''"> Et st.Place_id = # {Placeentity.PlaceId, jdbcType = Varchar} </f> <if test = "StudentId! = Null! ="> " St.Student_id = # {StudentId, jdbcType = varchar} </ if> </lect>Lorsque vous l'utilisez, si vous souhaitez l'utiliser, vous devez limiter la condition pour une nouvelle classe d'entité. Il vous suffit de fixer la valeur correspondante à l'endroit où la condition. Au contraire, si vous n'attribuez pas la valeur, vous ne pouvez pas juger dans où.
public void select_test_2_1 () {StudentEntity Entity = new StudentEntity (); entity.setStudentName (""); entité.setStudentSex (1); entity.setStudentBirthday (dateUtil.parse ("1985-05-28")); entity.setClassId ("20000001"); //entity.setplaceID("70000001 "); List <StudentEntity> list = this.damicsqlmapper.getStudentList_if (entité); for (StudentEntity e: list) {System.out.println (e.toString ()); }}
Si + où le jugement conditionnel
De telles combinaisons peuvent entraîner des erreurs lorsque les conditions dans l'endroit utilisent plus si les balises. Prenons l'instruction de requête en 3.1 comme exemple, lorsque le code Java est appelé comme suit:
@Test public void select_test_2_1 () {StudentEntity Entity = new StudentEntity (); entity.setStudentName (null); entité.setStudentSex (1); List <StudentEntity> list = this.damicsqlmapper.getStudentList_if (entité); for (StudentEntity e: list) {System.out.println (e.toString ()); }} Si l'exemple ci-dessus est nul, la colonne Student_name ne sera pas jugée et l'erreur supplémentaire SQL pour le mot clé "Where and" sera directement dérivée.
Pour le moment, nous pouvons utiliser des instructions dynamiques pour résoudre le problème. Cette balise "où" saura que si la balise qu'il contient a une valeur de retour, elle insérera un «où». De plus, si le contenu renvoyé par une balise commence par et ou ou, il sera supprimé.
L'exemple ci-dessus est modifié à:
<! - 3 SELECT - WHERE / IF (paramètre de jugement) - Utilisez la propriété dont la classe d'entité n'est pas vide comme condition où -> <select id = "getStudentList_WhereF" resultMap = "ResultMap_studententity" ParameterType = "liming.student.manager.data.model.studentEntity"> SELECT ST.STUDENT_ID, ST.STUDENT_NAM St.Student_Birthday, St.Student_photo, St.Class_id, St.Place_id de Student_tbl ST <Where> <if test = "StudentName! = NULL"> St.Student_name Like Concat (Concat ('%') </ If> <if Test = "StudentSex! = Null et StudentSey) </ If> < '' "> Et St.Student_Sex = # {StudentSex, jdbcType = Integer} </ if> <if test =" StudentBirthday! = Null "> Et St.Student_Birthday = # {StudentBirthday, JdbcType = Date} </ If> <if Test =" Classid! = Null et Classid! = '' "" # {Classid, jdbcType = varchar} </ if> <if test = "Classity! = null and Classentity.classid! = ''"> et st.class_id = # {Classity.classid, JdbcType = Varchar} </ if> <if test = "PlaceId! = Null and PlaceId! = '' ''> Et St.Play jdbcType=VARCHAR} </if> <if test="placeEntity != null and placeEntity.placeId != null and placeEntity.placeId != '' "> AND ST.PLACE_ID = #{placeEntity.placeId, jdbcType=VARCHAR} </if> <if test="studentId != null and studentId != '' "> AND ST.STUDENT_ID = #{studentId, jdbcType = varchar} </ if> </ where> </lect> Mettre à jour l'instruction pour If + set
Lorsque la balise IF n'est pas utilisée dans l'instruction de mise à jour, s'il y a un paramètre nul, cela entraînera une erreur.
Lorsque vous utilisez des balises IF dans des instructions de mise à jour, si la précédente si n'est pas exécutée, cela peut entraîner une erreur redondante de virgule. Utilisez la balise SET pour configurer dynamiquement les mots clés SET et pour supprimer toutes les virgules non apparentées annexées à la fin de la condition.
Après avoir modifié avec la balise IF + SET, si un élément est nul, il ne sera pas mis à jour, mais la valeur de la base de données d'origine sera maintenue. L'exemple suivant:
<! - 4 if / set (paramètre de jugement) - Attributs de mise à jour dont la classe d'entité n'est pas vide -> <update id = "updateStudent_if_set" ParameterType = "liming.student.manager.data.model.studententity"> mettre à jour Student_tbl <et> <if test = "StudentName! = Null et StudentName! = ''" "Student_tbl # {StudentName}, </ if> <if test = "StudentSex! = Null et StudentSex! = ''"> Student_tbl.student_sex = # {StudentSex}, </ if> <if test = "StudentBirthday! = NULL"> Student_tbl.Student_Birthday = # {StudentBirthday}, </ if> "> Student_tbl.student_photo = # {StudentPhoto, javatype = byte [], jdbcType = blob, typeHandler = org.apache.ibatis.type.blobtypehandler}, </ if> <if test =" classid! = '' "> Student_tbl.class_id = # # {classid} ! = '' "> Student_tbl.place_id = # {PlaceId} </ if> </ set> où student_tbl.student_id = # {StudentId}; </fatedate> Si + Trim au lieu de l'endroit où / set tag
La garniture est un endroit plus flexible pour accéder aux balises de mots clés redondantes, ce qui peut pratiquer les effets de l'endroit et de la définition.
couper au lieu de où
<! - 5.1 Si / Trim remplace où (paramètre de jugement) - utilisez des attributs dont la classe d'entité n'est pas vide comme la condition -> <select id = "getStudentList_if_trim" ResultMap = "ResultMap_studentity"> SELECT ST.STUDENT_ID, ST.STUDENT_NAME, ST.STUDENT_SEX, ST.STUDE_BIRTHDAY, STOL De Student_tbl st <trim prefix = "où" prefixoverrides = "et | ou"> <if test = "studentName! = Null"> St.Student_name comme concat (concat ('%', # {étudiant, jdbcType = varchar}), '%') </ if> <if test = "StudentSEx! = Null and Studentsex! = ''> Et et Test =" StudentSEx! = Null et StudentSex ST.STUDENT_SEX = #{studentSex, jdbcType=INTEGER} </if> <if test="studentBirthday != null "> AND ST.STUDENT_BIRTHDAY = #{studentBirthday, jdbcType=DATE} </if> <if test="classId != null and classId!= '' "> AND ST.CLASS_ID = #{classId, jdbcType = varchar} </ if> <if test = "classitity! = null and clasentity.classid! = null and clasentity.classid! = ''"> et st.class_id = # {classity.classid, jdbctype = varchar} </ if> <if test = "placeid! = null et liselid! = '" " # {PlaceId, jdbcType = varchar} </ if> <if test = "PlaceEntity! = null and PlaceEntity.placeId! = null and PlaceEntity.placeID! = ''"> Et st.place_id = # {Placeentity.placeId, jdbcType = Varchar} </ if> <if test = "StudentId! = null et nulld! = '> et St. # {StudentId, jdbcType = varchar} </ if> </mim> </lect>
couper au lieu de régler
<! - 5.2 If / Trim Remplace Set (Paramètre de jugement) - Attributs de mise à jour dont la classe d'entité n'est pas vide -> <update id = "updateStudent_if_trim" ParameterType = "liming.student.manager.data.model.studententity"> Update Student_tbl <Trim prefix = "set" SuffixoveRides = ","> <if Test = "Studentname! StudentName! = '' "> Student_tbl.student_name = # {étudiantname}, </ if> <if test =" StudentSex! = Null et StudentSex! = '' "> Student_tbl.student_sex = # {StudentSex}, </ if> <if test =" StudentBirthday! = Null "> Student_TBl # {StudentBirthday}, </ if> <if test = "Studentphoto! = null"> Student_tbl.student_photo = # {studentphoto, javatype = byte [], jdbcType = Blob, typehandler = org.apache.ibatis.type.blobTypeHandler}, </f> Student_tbl.class_id = # {classid}, </ if> <if test = "PlaceId! = ''"> Student_tbl.place_id = # {placeID} </ if> </prim> où student_tbl.student_id = # {studentId} </dated> Choisissez (quand, sinon)
Parfois, nous ne voulons pas appliquer toutes les conditions, mais choisissez-en une parmi plusieurs options. Lorsque vous utilisez la balise IF, tant que l'expression du test est vraie, les conditions de la balise IF seront exécutées. MyBatis fournit l'élément de choix. Si TAG est une relation avec (et), et choisissez est une relation avec (ou).
La balise de choix consiste à déterminer si la condition de test dans l'interne lorsque la balise est valide dans l'ordre. Si l'on est valide, le choix se termine. Lorsque toutes les conditions de choix ne sont pas satisfaites, le SQL est autrement exécuté. Semblable à l'instruction Switch de Java, choisissez Switch, lorsque le boîtier et autrement par défaut.
Par exemple, les exemples suivants notent également toutes les conditions qui peuvent être restreintes et les utiliser. Choison sélectionnera une exécution SQL avec le test true de haut en bas lorsque la balise. Pour les considérations de sécurité, nous utilisons où terminer le choix et placer plus de mots clés que les erreurs.
<! - 6 Choisissez (paramètres de jugement) - Prenez la première propriété de la classe d'entité qui n'est pas vide dans l'ordre comme la condition -> <select id = "getStudentList_Choose" ResultMap = "ResultMap_Studententity" ParameterType = "ling St.Student_Sex, St.Student_Birthday, St.Student_photo, St.Class_id, St.Place_id From Student_TBL ST <Where> <Coose> <When Test = "StudentName! = NULL"> St.Student_name Like Concat (Concat ('%', # {StudentName, JDBCTYPE = VARCHE ! = null et studentsex! = '' "> et saintStudent_Sex = # {StudentSex, jdbcType = Integer} </ when> <quand test =" StudentBirthday! = null "> Et St.Student_birthday = # {StudentBirthday, JDBCTYPE = Date} </ Wheri Et St.Class_id = # {Classid, jdbcType = varchar} </ when> <quand test = "Classity! = Null and Clastentity.classid! = ''"> Et st.class_id = # {Classentity.classid, jdbcType = Varchar} </ Where # {PlaceId, jdbcType = varchar} </ when> <quand test = "PlaceEntity! = null and PlaceEntity.placeId! = null and PlaceEntity.placeID! = ''"> Et st.place_id = # {Placeentity.placeId, jdbcType = Varchar} </ Where # {StudentId, jdbcType = varchar} </ when> <sinon> </ sinon> </ choix> </ Where> </lect>
foretter
Il est très nécessaire pour le SQL dynamique, principalement pour itérer une collection, généralement dans des conditions. Les instances de liste utiliseront la "liste" comme clé, et les instances de tableau utiliseront "Array" comme clé.
L'élément Foreach est très puissant, il vous permet de spécifier une collection, de déclarer des éléments de collecte et des variables d'index, qui peuvent être utilisées dans le corps de l'élément. Il vous permet également de spécifier des chaînes ouvertes et fermées, plaçant des séparateurs entre itérations. Cet élément est très intelligent et n'ajoute pas les séparateurs supplémentaires par hasard.
Remarque: vous pouvez transmettre une instance de liste ou un tableau comme objet de paramètre à MyBatis. Lorsque vous faites cela, MyBatis l'enveloppera automatiquement sur une carte avec le nom comme clé. Les instances de liste utiliseront la "liste" comme clé, et les instances de tableau utiliseront "Array" comme clé.
Cette section est discutée sur les fichiers de configuration XML et les fichiers de mappage XML. La section suivante discutera en détail de l'API Java, afin que vous puissiez obtenir les mappages les plus efficaces que vous ayez créés.
1. Écrivez l'exemple du paramètre comme tableau
Méthode Déclaration d'interface:
Public List <StudentEntity> getStudentListByClassids_Foreach_Array (String [] Classids);
Instruction SQL dynamique:
<! - 7.1 foreach (paramètre du tableau de boucle) - comme condition pour in where -> <select id = "getStudentLyClassids_foreach_array" resultMap = "ResultMap_studentity"> SELECT St.Student_id, St.Student_name, St.Student_SEX, St.Student_Birthday, St.Student_Photo, Saint Student_tbl st où St.Class_id dans <foreach collection = "array" item = "classids" open = "(" séparateur = "," close = ")"> # {classids} </foreach> </lect>
Testez le code pour interroger les étudiants dans les deux classes de 20000001 et 20000002:
@Test public void test7_foreach () {String [] classids = {"20000001", "20000002"}; List <StudentEntity> list = this.damicsqlmapper.getStudentListByClassids_Foreach_Array (Classids); for (StudentEntity e: list) {System.out.println (e.toString ()); }} 2. Écrivez l'exemple de la liste des paramètres
Méthode Déclaration d'interface:
public List <StudentEntity> getStudentListByClassids_Foreach_list (list <string> classidlist);
Instruction SQL dynamique:
<! - 7.2 FOREEACH (Liste de boucle <string> Paramètre) - comme condition pour in dans où -> <select id = "getStudentLyClassids_foreach_list" resultMap = "ResultMap_studententity"> SELECT St.Student_id, St.Student_name, St.Student_SEX, St.Student_Birthday, St.Student_Photo, Saint Student_tbl st où St.Class_id dans <foreach collection = "list" item = "classidlist" open = "(" séparateur = "," close = ")"> # {classidlist} </Foreach> </lect>
Testez le code pour interroger les étudiants dans les deux classes de 20000001 et 20000002:
@Test public void test7_2_foreach () {arrayList <string> classidlist = new ArrayList <string> (); ClassidList.Add ("20000001"); ClassidList.Add ("20000002"); List <StudentEntity> list = this.damicsqlmapper.getStudentListByClassids_Foreach_list (Classidlist); for (StudentEntity e: list) {System.out.println (e.toString ()); }}3. Encapsuler les paramètres dans le type de carte par vous-même
<select id = "dynamicForEach3Test" resultType = "blog"> sélectionner * dans T_Blog où le titre comme "%" # {title} "%" et id dans <foreach collection = "ids" index = "index" item = "item" open = "(" séparateur = "," close = ")"> # {item} </ foreach> </lect>La valeur de la collection ci-dessus est IDS, qui est la clé de la carte des paramètres transmise et le code de mappeur correspondant:
public list <glog> dynamicForEach3Test (map <string, objet> params);
Code de test correspondant:
@Test public void dynamicForEach3Test () {SqlSession Session = util.getsqlSessionFactory (). OpenSession (); BlogMapper blogmapper = session.getmapper (blogmapper.class); Liste finale <Integer> ids = new ArrayList <Integer> (); ids.add (1); ids.add (2); ids.add (3); ids.add (6); ids.add (7); ids.add (9); Map <string, object> params = new hashmap <string, object> (); Params.put ("ids", ids); Params.put ("Title", "Chine"); List <blog> blogs = blogmapper.dynamicForEach3Test (params); pour (blog blog: blogs) System.out.println (blog); session.close (); }