Manchmal ist ein Sicherheitsurteil erforderlich unter den Bedingungen der SQL -Erklärung. Wenn beispielsweise der übergebene Parameter bei der Abfrage nach einer bestimmten Bedingung leer ist, ist das Abfrageergebnis wahrscheinlich zu diesem Zeitpunkt leer. Wenn wir den Parameter brauchen, um leer zu sein, werden wir vielleicht alle Informationen finden. Verwenden Sie die Sequenzen von Oracle und MySQL, um IDs zu generieren. Zu diesem Zeitpunkt können wir dynamische SQL verwenden. Alle folgenden Aussagen sind MySQL -Syntax und Funktionen (z. B. die String -Link -Funktion concat).
SelectKey -Tag
In der Anweisung Insert verwendet Oracle häufig Sequenzen und Funktionen in MySQL, um automatisch den Primärschlüssel der Insert -Tabelle zu generieren, und eine Methode ist erforderlich, um diesen generierten Primärschlüssel zurückzugeben. Dieser Effekt kann mit dem SelectKey -Tag von MyBatis erreicht werden. Das folgende Beispiel besteht darin, die medizinische Datenbank -Funktion von MySQL Database NextVal ('Student') zu verwenden, um einen Schlüssel zu generieren und auf die studentID -Eigenschaft in der bestandenen Entitätsklasse festzulegen. Nach der Ausführung dieser Methode kann die Kante den generierten Schlüssel über diese Entitätsklasse erhalten.
<!-STUDISTION STUDISTIC AUTOMATISCHE TEIL Taste-> <Einfügen id = "CreateStudentAutokey" ParameterType = "Liming.Student.Manager.Data.Model.studententity" KeyProperty = "StudentID"> <selectKey keyproperty = "studentId" resultTYPe = "String" -Schange "Vorher"-Vorher "> vor"> vor "> vor"> vor "> vor"> ">"> ">"> ">"> ">"> ">"> ">"> ">"> ">"> ">"> ">"> ">"> ">"> ">"> ">"> ">"> ">"> ">"> ">"> ">" -Schudel ")" student Student_Name, Student_sex, Student_Birthday, Student_photo, class_id, place_id) Werte ( #{studentid}, #{studentName}, #{studentSex}, #{StudentBirthday}, #{Studentphoto, Javatype = byte [], jdbctype = blob, jdbctype = blob, typeHandler = org.apache.ibatis.type.blobTypeHandler}, #{classID}, #{placeId}) </einfügen>
Rufen Sie Schnittstellenmethoden auf und erhalten Sie die automatische Schlüsselgenerierung
Studententity Entity = New Studententity (); Entity.SetStudentName ("Hallo Dawn"); Entity.SetStudentSex (1); Entity.SetStudentBirthday (DateUtil.Parse ("1985-05-28"); entity.setClassid ("20000001"); Entity.SetPlaId ("70000001"); this.dynamicsqlmapper.CreateStudentautokey (Entität); System.out.println ("neue Studenten -ID:" + entity.getstudentid ());
Konfigurationsdetails der Eigenschaftsanweisung auswählen:
| Eigentum | beschreiben | Erhalten Sie den Wert |
| Schlüsselproperschaft | Das Attribut, das für das von der SelectKey -Anweisung generierte Ergebnis festgelegt werden muss. | |
| Ergebnistyp | Ergebnistypen generieren. MyBatis ermöglicht die Verwendung grundlegender Datentypen, einschließlich String- und INT -Typen. | |
| Befehl | 1: Vorher wird der Primärschlüssel zuerst ausgewählt, dann wird der Schlüsselproperty festgelegt, und dann wird die Einfügeanweisung ausgeführt. 2: Führen Sie anschließend zuerst die Anweisung Insert und dann die SelectKey -Anweisung aus. | VOR NACH |
| AUSGABETTYPE ARTAGTTYPE | MyBatis unterstützt Anweisungen, vorbereitete und aufrufbare Anweisungsformulare, entsprechend der Antworten zur Erklärung, vorbereiteten Angaben und Callablestatements. | STELLUNGNAHME VORBEREITET ABRUFBAR |
Wenn Tag
Wenn Tags in vielen Arten von SQL -Anweisungen verwendet werden können, nehmen wir als Beispiel die Abfrage an. Schauen wir uns zunächst eine sehr gewöhnliche Abfrage an:
<!-Abfragestudentliste wie Name-> <select id = "getstudentListlikename" parameterType = "studententity" resultmap = "studentResultmap"> select * from student_tbl st Where St.Student_Name wie concat ('concat ('%', {studentname}),'%') </select> </select> </select> </select> Wenn StudentName oder StudentSex zu diesem Zeitpunkt jedoch null sind, wird diese Anweisung wahrscheinlich einen Fehler melden oder das Abfrageergebnis ist leer. Zu diesem Zeitpunkt verwenden wir die IF Dynamic SQL -Erklärung, um zuerst Urteile zu fällen. Wenn der Wert null oder gleich einer leeren Zeichenfolge ist, urteilen wir nicht über diese Erkrankung und erhöhen die Flexibilität.
Der Parameter ist die Entitätsklassenstudentität. Alle Attribute in der Entitätsklasse werden beurteilt, und wenn sie nicht leer sind, wird die Urteilsbedingung ausgeführt.
<!-2 wenn (Parameter des Urteils)-Verwenden Sie die Eigenschaft, deren Entitätsklasse nicht leer ist, da Bedingung-> <select id = "getstudentlist_if" resultMap = "resultmap_studententity" parameterType = "liming.Manager.Data.model St.Student_Birthday, St.Student_Photo, St.class_id, St.place_id von student_tbl st, wo <if test = "studentName! "> Und St.Student_sex = #{studentSex, jdbctype = Integer} </if test =" studentBirthday! #{classId, jdbctype = varchar} </if> <if test = "classEntity! = null und classEntity.classid! = null und classEntity.classid! St.Place_id = #{placeId, jdbctype = varchar} </if> <if test = "placeEntity! = Null und placeEntity.placeid! St.Student_id = #{studentid, jdbctype = varchar} </if> </select>Wenn Sie es verwenden möchten, müssen Sie die Bedingung für eine neue Entitätsklasse einschränken. Sie müssen den entsprechenden Wert nur an den Zustand anbringen. Im Gegenteil, wenn Sie den Wert nicht zuordnen, können Sie nicht wo beurteilen.
public void select_test_2_1 () {Studententity Entity = new Studententity (); Entity.SetStudentName (""); Entity.SetStudentSex (1); Entity.SetStudentBirthday (DateUtil.Parse ("1985-05-28"); entity.setClassid ("20000001"); //Entity.setPlaId("70000001 "); Liste <Stud StudyEntity> list = this.dynamicsQlmapper.getstudentList_if (Entity); für (studententity e: list) {System.out.println (e.toString ()); }}
Wenn + wenn bedingte Urteilsvermögen
Solche Kombinationen können zu Fehlern führen, wenn die Bedingungen, bei denen mehr als Tags verwendet werden. Nehmen wir die Anweisung der Abfrage in 3.1 als Beispiel, wenn der Java -Code wie folgt aufgerufen wird:
@Test public void select_test_2_1 () {studententity entity = new Studententity (); Entity.SetStudentName (NULL); Entity.SetStudentSex (1); Liste <Stud StudyEntity> list = this.dynamicsQlmapper.getstudentList_if (Entity); für (studententity e: list) {System.out.println (e.toString ()); }} Wenn das obige Beispiel null ist, wird die Spalte student_name nicht beurteilt, und der zusätzliche Fehler SQL für das Schlüsselwort "Wo und" wird direkt abgeleitet.
Zu diesem Zeitpunkt können wir verwenden, wo dynamische Aussagen das Problem lösen. Dieses "Where" -Tag wird wissen, dass, wenn das Tag es enthält, einen Rückgabewert hat, es ein 'Where' einfügt. Wenn der von einem Tag zurückgegebene Inhalt mit und oder oder oder oder oder oder oder nicht gestartet wird, wird er entfernt.
Das obige Beispiel wird geändert an:
<!- 3 auswählen- wobei/if (Parameter des Urteils)- Verwenden Sie die Eigenschaft, deren Entitätsklasse nicht leer ist wie die Bedingung-> <select id = "getstudentlist_where" resultmap = "resultmap_studententity" parameterType = "liming.Student.Manager.Data.Model.studentity"> st.studentity "> St.Student_Student. St.Student_Birthday, St.Student_Photo, St.class_id, St.place_id von student_tbl st <where> <if test = "studentName! '' "> Und St.Student_sex = #{studentSex, jdbctype = Integer} </if> <if test =" StudentBirthday! #{classId, jdbctype = varchar} </if> <if test = "classEntity! = null und classEntity.classid! jdbctype = varchar} </if> <if test = "placeEntity! = null und placeEntity.placeid! jdbctype = varchar} </if> </where> </select> Aktualisieren Sie die Anweisung für if + fest
Wenn das IF -Tag in der Aktualisierungsanweisung nicht verwendet wird, wird bei einem Parameter -Null -Null ein Fehler verursacht.
Bei Verwendung von TAGs in Aktualisierungsanweisungen kann dies zu einem redundanten Kommissionsfehler führen. Verwenden Sie das SET -Tag, um die Set -Schlüsselwörter dynamisch zu konfigurieren und nicht verwandte Kommas zu entfernen, die am Ende des Zustands angehängt sind.
Nach dem Ändern mit dem iF+-Set -Tag wird es nicht aktualisiert, wenn ein Element null ist, der ursprüngliche Datenbankwert wird jedoch beibehalten. Das folgende Beispiel:
<!-4 if/set (Urteilsparameter)-Aktualisierung Attribute, deren Entitätsklasse nicht leer ist-> <Update ID = "updatestudent_if_set" parameterType = "liming.student.Manager.Data.Model.studententity"> update_tbl <set> <if test = "Studentname! #{StudentName}, </if> <if test = "studentSex! = null und studentSex! "> Student_tbl.student_photo = #{StudentPhoto, javatype = byte [], jdbctype = bloB, typeHandler = org.apache.ibatis.type.blobTypeHandler}, </if test =" classid! ! </update> If + Trimm statt wo/setze tag tag
TRIM ist ein flexiblerer Ort für redundante Keyword -Tags, die die Auswirkungen von wo und einstellen können.
trimmen statt wo
<!-5.1 if/trim ersetzt wob Student_tbl st <trim prefix = "wob = #{studentSex, jdbctype = Integer} </if> <if test = "studentBirthday! jdbctype = varchar} </if> <if test = "classEntity! = null und classEntity.classid! = null und classEntity.classid! #{placeId, jdbctype = varchar} </if> <if test = "placeEntity! = null und placeEntity.placeid! #{studentId, jdbcType = varchar} </if> </trim> </select>
Trimmen Sie anstelle von Set
<!-- 5.2 if/trim replaces set (judgment parameter) - Update attributes whose entity class is not empty --> <update id="updateStudent_if_trim" parameterType="liming.student.manager.data.model.StudentEntity"> UPDATE STUDENT_TBL <trim prefix="SET" suffixOverrides=","> <if test="studentName != null and studentName ! #{StudentBirthday}, </if> <if test = "studentPhoto! Student_tbl.class_id = #{classId}, </if> <if test = "placeId! Wählen Sie (wann, sonst)
Manchmal möchten wir nicht alle Bedingungen anwenden, sondern nur eine aus mehreren Optionen auswählen. Bei Verwendung des iF -Tags werden die Bedingungen im iF -Tag ausgeführt, solange der Ausdruck im Test zutreffend ist. MyBatis bietet das Auswahlelement. Wenn Tag eine Beziehung zu (und) ist und wählen Sie eine Beziehung zu (oder).
Das Auswahl -Tag besteht darin, festzustellen, ob die Testbedingung im internen beim Tag gültig in der Reihenfolge gültig ist. Wenn einer gültig ist, endet die Auswahl. Wenn alle gewählten Bedingungen nicht erfüllt sind, wird der SQL in sonst ausgeführt. Ähnlich wie bei der Switch -Anweisung von Java wählen Sie Switch, wenn Fall und sonst Standard.
Beispielsweise schreiben die folgenden Beispiele auch alle Bedingungen auf, die eingeschränkt werden und sie verwenden können. Wählen Sie eine SQL -Ausführung mit Test True von oben nach unten beim Tag. Bei Sicherheitsüberlegungen verwenden wir die Auswahl und platzieren mehr Schlüsselwörter als Fehler.
<!-- 6 choose(judgment parameters) - Take the first property of the entity class that is not empty in order as where condition--> <select id="getStudentList_choose" resultMap="resultMap_studentEntity" parameterType="liming.student.manager.data.model.StudentEntity"> SELECT ST.STUDENT_ID, ST.STUDENT_NAME, ST.STUDENT_SEX, St.Student_Birthday, St.Student_Photo, St.Class_id, St.place_id von student_tbl st <whe> <wosen> <wenn test = "studentName! ! #{classId, jdbctype = varchar} </wenn> <wenn test = "classEntity! = null und classEntity.classid! jdbctype = varchar} </wenn> <wenn test = "placeEntity! = null und placeEntity.placeid! jdbctype = varchar} </wenn> <sonst> </sonst> </wählen> </where> </select>
nach
Es ist sehr notwendig, dass dynamische SQL, hauptsächlich über eine Sammlung iteriert, normalerweise für unter Bedingungen. Listeninstanzen verwenden "Liste" als Schlüssel, und Array -Instanzen verwenden "Array" als Schlüssel.
Das Foreach -Element ist sehr leistungsstark und ermöglicht es Ihnen, eine Sammlung anzugeben, Sammlungselemente und Indexvariablen zu deklarieren, die im Elementkörper verwendet werden können. Sie können auch offene und geschlossene Zeichenfolgen angeben und Separatoren zwischen Iterationen platzieren. Dieses Element ist sehr klug und fügt zusätzliche Separatoren nicht zufällig an.
Hinweis: Sie können eine Listeninstanz oder ein Array als Parameterobjekt an MyBatis übergeben. Wenn Sie dies tun, wickelt MyBatis es automatisch in eine Karte mit dem Namen als Schlüssel. Listeninstanzen verwenden "Liste" als Schlüssel, und Array -Instanzen verwenden "Array" als Schlüssel.
Dieser Abschnitt wird über XML -Konfigurationsdateien und XML -Zuordnungsdateien besprochen. Im nächsten Abschnitt werden die Java -API detailliert erörtert, sodass Sie die effizientesten Zuordnungen erhalten, die Sie erstellt haben.
1. Schreiben Sie das Beispiel des Parameters als Array
Schnittstellenerklärung:
öffentliche Liste <Stud StudyEntity> GetStudentListByClassids_foreach_array (String [] classIds);
Dynamische SQL -Anweisung:
<!― 7.1 foreach(loop array parameter) - as the condition for in in where --> <select id="getStudentListByClassIds_foreach_array" resultMap="resultMap_studentEntity"> SELECT ST.STUDENT_ID, ST.STUDENT_NAME, ST.STUDENT_SEX, ST.STUDENT_BIRTHDAY, ST.STUDENT_PHOTO, ST.CLASS_ID, ST.PLACE_ID FROM Student_tbl st, wo st.class_id in <foreach collection = "array" item = "classIds" open = "(" separator = "," close = ")"> #{classIds} </foreach> </select>
Testen Sie den Code, um Schüler in den beiden Klassen von 20000001 und 20000002 zu befragen:
@Test public void test7_foreach () {string [] classIds = {"20000001", "20000002"}; Liste <Stud StudyEntity> list = this.dynamicsqlmapper.getstudentListByClassids_foreach_array (Classids); für (studententity e: list) {System.out.println (e.toString ()); }} 2. Schreiben Sie das Beispiel der Parameterliste
Schnittstellenerklärung:
öffentliche Liste <Stud StudyEntity> getStudentListByClassids_foreach_List (Liste <string> classIdList);
Dynamische SQL -Anweisung:
<!-- 7.2 foreach(Loop List<String> Parameter) - as a condition for in in where --> <select id="getStudentListByClassIds_foreach_list" resultMap="resultMap_studentEntity"> SELECT ST.STUDENT_ID, ST.STUDENT_NAME, ST.STUDENT_SEX, ST.STUDENT_BIRTHDAY, ST.STUDENT_PHOTO, ST.CLASS_ID, ST.PLACE_ID FROM Student_tbl st, wo st.class_id in <foreach collection = "list" item = "classIdList" open = "(" separator = "," close = ")"> #{classIdList} </foreach> </select>
Testen Sie den Code, um Schüler in den beiden Klassen von 20000001 und 20000002 zu befragen:
@Test public void test7_2_foreach () {ArrayList <string> classIdList = new ArrayList <string> (); classIdList.add ("20000001"); classIdList.add ("20000002"); Liste <Stud StudyEntity> list = this.dynamicsqlmapper.getstudentListByClassids_foreach_List (ClassIdList); für (studententity e: list) {System.out.println (e.toString ()); }}3.. Einkapseln Sie die Parameter in die Art der Karte selbst ein
<select id = "dynamicforeach3Test" resultType = "blog"> ausgewählt * aus t_blog wob
Der Wert der obigen Sammlung ist IDs, die der Schlüssel der in übergebenen Parameterkarte und der entsprechende Mapper -Code ist:
öffentliche Liste <blog> dynamicforeach3Test (MAP <string, objekt> params);
Entsprechender Testcode:
@Test public void dynamicforeach3Test () {SQLSession Session = util.getSQLSessionFactory (). OpenSession (); BlogMapper blogmapper = session.getMapper (BlogMapper.Class); endgültige Liste <Integer> ids = new ArrayList <GanzEger> (); 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 ("Titel", "China"); Liste <blog> blogs = blogmapper.dynamicforeach3Test (Params); für (Blog Blogs: Blogs) system.out.println (Blog); Sitzung.CLOSE (); }