Terkadang, beberapa penilaian keamanan diperlukan dalam kondisi pernyataan SQL di mana. Misalnya, jika parameter yang diteruskan kosong saat diminta sesuai dengan kondisi tertentu, hasil kueri kemungkinan akan kosong saat ini. Mungkin ketika kita membutuhkan parameter untuk kosong, kita akan menemukan semua informasi. Gunakan urutan Oracle dan fungsi MySQL untuk menghasilkan ID. Saat ini kita dapat menggunakan SQL dinamis. Semua yang berikut ini adalah sintaksis dan fungsi MySQL (seperti fungsi string link concat).
Tag SelectKey
Dalam pernyataan Sisipkan, Oracle sering menggunakan urutan dan fungsi di MySQL untuk secara otomatis menghasilkan kunci utama dari tabel insert, dan metode diperlukan untuk mengembalikan kunci primer yang dihasilkan ini. Efek ini dapat dicapai dengan menggunakan tag terpilih dari mybatis. Contoh berikut adalah menggunakan fungsi kustom database MySQL NextVal ('Student') untuk menghasilkan kunci dan mengaturnya ke properti StudentID di kelas entitas yang dilewatkan. Jadi setelah menjalankan metode ini, tepi dapat memperoleh kunci yang dihasilkan melalui kelas entitas ini.
<!-- Insert student automatic primary key--> <insert id="createStudentAutoKey" parameterType="liming.student.manager.data.model.StudentEntity" keyProperty="studentId"> <selectKey keyProperty="studentId" resultType="String" order="BEFORE"> select nextval('student') </selectKey> INSERT INTO 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, typeHandler = org.apache.ibatis.type.blobtypehandler}, #{classId}, #{placeId}) </insert>
Metode Antarmuka Panggilan dan Dapatkan Generasi Kunci Otomatis
Entitas Studententity = StudentEntity baru (); Entity.setStudentName ("Hello Dawn"); entity.setstudentsex (1); entity.setstudentbirthday (dateutil.parse ("1985-05-28"))); Entity.setClassid ("20000001"); entity.setplaceId ("70000001"); this.dynamicsqlmapper.createStudentAutokey (entitas); System.out.println ("ID Mahasiswa Baru:" + Entity.getstudentId ());
Detail Konfigurasi Properti Pernyataan PilihKey:
| milik | menggambarkan | Dapatkan nilainya |
| KeyProperty | Atribut yang perlu ditetapkan untuk hasil yang dihasilkan oleh pernyataan SelectKey. | |
| Hasil Hasil | Menghasilkan jenis hasil. MyBatis memungkinkan penggunaan tipe data dasar, termasuk tipe string dan int. | |
| Memesan | 1: Sebelumnya, kunci utama akan dipilih terlebih dahulu, maka KeyProperty akan ditetapkan, dan kemudian pernyataan insert akan dieksekusi; 2: Setelah, jalankan pernyataan masukkan terlebih dahulu dan kemudian pernyataan SelectKey. | SEBELUM SETELAH |
| Pernyataan Pernyataan Pernyataan | MyBatis mendukung pernyataan, formulir pernyataan yang disiapkan dan dapat dipanggil, sesuai dengan pernyataan, persiapan dan tanggapan callablestatement. | PENYATAAN SIAP Dapat dipanggil |
Jika tag
Jika tag dapat digunakan dalam banyak jenis pernyataan SQL, mari kita ambil kueri sebagai contoh. Pertama, mari kita lihat pertanyaan yang sangat biasa:
<!-Daftar Siswa Permintaan, Seperti Nama-> <pilih id = "getStudentListLikeName" parameterType = "studentEntity" resultMap = "studentResultMap"> pilih * dari student_tbl st di mana st.student_name seperti concat (concat ('%', #{studentName}), '%') </Pilihan ('%', #{studentName}), '%') Namun, jika StudentName atau Studentsex tidak ada saat ini, pernyataan ini kemungkinan akan melaporkan kesalahan atau hasil kueri kosong. Pada saat ini, kami menggunakan pernyataan SQL IF Dynamic untuk membuat penilaian terlebih dahulu. Jika nilainya nol atau sama dengan string kosong, kami tidak akan membuat penilaian pada kondisi ini dan meningkatkan fleksibilitas.
Parameternya adalah StudentEntity kelas entitas. Semua atribut dalam kelas entitas dinilai, dan jika tidak kosong, kondisi penilaian dieksekusi.
<!-2 jika (parameter penilaian)-Gunakan properti yang kelas entitasnya tidak kosong seperti kondisi-> <pilih id = "getStudentList_if" resultMap = "resultMap_studentity" parameTerType = "liming.student.manager.data.model.studentity"> st.student.student.idata.data.model.studentity "> st.student_student_id, st.student. St.Student_Birthday, St.student_photo, St.Class_id, St.Place_id dari Student_tbl st di mana <if test = "studentName! = Null"> st.student_name seperti concat (concat ('%', #{studentName, jdbctype = varchar}), '%') </if> if> ifer = jdbctype = varchar}), '%') </if> 'if> St.Student_Sex = #{StudentSex, jdbctype = integer} </if> <if test = "studentbirthday! = Null"> dan st.student_birthday = #{studentbirthday, jdbctype = date} </if> <if test = "classid! = Null dan null! jdbctype = varchar} </if> <if test = "classEntity! = null dan classentity.classid! = null dan classentity.classid! = ''"> dan st.class_id = #{classentity.classid, jdbctype = varchar} </if> <if test = "{{{{{{api {{{{{{{{{{{{{{", jdbctype = varchar} </if> <if test = "placeEntity! = null dan placeEntity.placeId! = null dan placeEntity.placeId! = ''"> dan St.place_id = #{PlaceEntity.PlaceID, JDBCTYPE = VARCHAR} </if> <if test = "Studentid! = NULL dan NULL! jdbctype = varchar} </if> </ pilih>Saat menggunakannya, jika Anda ingin menggunakannya, Anda perlu membatasi kondisi untuk kelas entitas baru tersebut. Anda hanya perlu melampirkan nilai yang sesuai ke mana kondisi tersebut. Sebaliknya, jika Anda tidak menetapkan nilainya, Anda tidak dapat menilai di mana.
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.setplaceId("70000001 "); Daftar <Sahukentitas> Daftar = this.dynamicsqlmapper.getStudentList_if (entitas); untuk (studententity e: list) {System.out.println (e.toString ()); }}
Jika + di mana penilaian bersyarat
Kombinasi semacam itu dapat menyebabkan kesalahan ketika kondisi di mana menggunakan lebih banyak jika tag. Mari kita ambil pernyataan kueri dalam 3.1 sebagai contoh, ketika kode Java dipanggil sebagai berikut:
@Test public void select_test_2_1 () {studententity entity = new StudentEntity (); entity.setstudentname (null); entity.setstudentsex (1); Daftar <Sahukentitas> Daftar = this.dynamicsqlmapper.getStudentList_if (entitas); untuk (studententity e: list) {System.out.println (e.toString ()); }} Jika contoh di atas adalah NULL, kolom Student_Name tidak akan dinilai, dan SQL kesalahan tambahan untuk kata kunci "di mana dan" "akan diturunkan langsung.
Pada saat ini, kita dapat menggunakan di mana pernyataan dinamis untuk menyelesaikan masalah. Tag "di mana" ini akan tahu bahwa jika tag yang dikandungnya memiliki nilai pengembalian, itu akan memasukkan 'di mana'. Selain itu, jika konten yang dikembalikan oleh tag dimulai dengan dan atau atau, itu akan dihapus.
Contoh di atas dimodifikasi menjadi:
<!- 3 Pilih- di mana/if (parameter penilaian)- Gunakan properti yang kelas entitasnya tidak kosong sebagai kondisi di mana-> <pilih id = "getStudentList_whereif" resultMap = "resultMap_studentity" parameterType = "st.student.student.student.model.studententity"> st.student.student. ST.STUDENT_BIRTHDAY, ST.STUDENT_PHOTO, ST.CLASS_ID, ST.PLACE_ID FROM STUDENT_TBL ST <where> <if test="studentName !=null "> ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName, jdbcType=VARCHAR}),'%') </if> <if test="studentSex != null and studentSex != '' "> Dan st.student_sex = #{studentsex, jdbctype = integer} </if> <if test =" studentbirthday! = Null "> dan st.student_birthday = #{studentbirthday, jdbctype = date} </if> <if test =" classid! = Classid dan null dan null dan null =} </if> <if test = "classid! jdbctype = varchar} </if> <if test = "classEntity! = null dan classEntity.classid! = ''"> dan st.class_id = #{classentity.classid, jdbctype = varchar} </if> <if test = "placeid! = null dan placeid! = '"> dan st. <if test = "PlaceEntity! = null and PlaceEntity.placeId! = null dan placeEntity.placeId! = ''"> dan St.place_id = #{placeEntity.placeId, jdbctype = varchar} </if> <if test = "studentId! = null dan studentid! = '' '' '' 'dan st.Student_id = #es = #{null dan studentId! =' '' '' '> dan St.Student_id = #id = #D = {null! </pilih> Perbarui Pernyataan untuk If + Set
Ketika tag if tidak digunakan dalam pernyataan pembaruan, jika ada parameter nol, itu akan menyebabkan kesalahan.
Saat menggunakan tag IF dalam pernyataan pembaruan, jika IF sebelumnya tidak dieksekusi, itu dapat menghasilkan kesalahan yang berlebihan koma. Gunakan tag set untuk secara dinamis mengkonfigurasi kata kunci dan untuk menghapus koma yang tidak terkait ditambahkan ke akhir kondisi.
Setelah memodifikasi dengan tag if+set, jika suatu item nol, itu tidak akan diperbarui, tetapi nilai database asli akan dipertahankan. Contoh berikut:
<!-4 if/set (parameter penilaian)-perbarui atribut yang kelas entitasnya tidak kosong-> <update id = "updateStudent_if_set" parameterType = "liming.student.manager.data.model.studentity"> update student_tbl <set> <if test = "studentname! = Null dan null dan null"> SPELLING_TBL <set> <if test = "studentname! = Null dan null dan null"> SPERWAGET_TBL <set> <if test = "StudentName! #{StudentName}, </if> <if test = "studentsex! = null dan studentsex! = ''"> student_tbl.student_sex = #{studentsex}, </if> <if test = "studentbirthday! = null"> students_tbl.student_birbray = #{nullay = nullay = {nullay, studentspl. "> Student_tbl.student_photo = #{studentphoto, javatype = byte [], jdbctype = blob, typeHandler = org.apache.ibatis.type.blobtypeHandler}, </if> <if test =" classid! = '' ''> Student_tbl.claps {if> <if test = "classid! = '' ''> Student_tbl.claps_id = '{if> {if test =" classid! = "> Student_tbl.place_id = #{PlaceId} </if> </tion> di mana student_tbl.student_id = #{studentId}; </update> jika + trim bukan tag di mana/set
Trim adalah tempat yang lebih fleksibel untuk pergi ke tag kata kunci yang berlebihan, yang dapat melatih efek di mana dan diatur.
Potong bukan dimana
<!-- 5.1 if/trim replaces where (judgment parameter) - Use attributes whose entity class is not empty as where condition--> <select id="getStudentList_if_trim" 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 dari Student_tbl st <trim awalan = "di mana" prefixoverrides = "dan | atau"> <if test = "studentName! = Null"> st.student_name like concat (concat ('%', #{studentName, jdbctype = varchar}), '%') </if> <if test = " St.Student_Sex = #{StudentSex, jdbctype = integer} </if> <if test = "studentbirthday! = Null"> dan st.student_birthday = #{studentbirthday, jdbctype = date} </if> <if test = "classid! = Null dan null! jdbctype = varchar} </if> <if test = "classEntity! = null dan classentity.classid! = null dan classentity.classid! = ''"> dan st.class_id = #{classentity.classid, jdbctype = varchar} </if> <if test = "{{{{{{api {{{{{{{{{{{{{{", jdbctype = varchar} </if> <if test = "placeEntity! = null dan placeEntity.placeId! = null dan placeEntity.placeId! = ''"> dan St.place_id = #{PlaceEntity.PlaceID, JDBCTYPE = VARCHAR} </if> <if test = "Studentid! = NULL dan NULL! jdbctype = varchar} </if> </ trim> </ pilih>
trim bukan diatur
<!-5.2 If/Trim Mengganti Set (Parameter Judgment)-Perbarui Atribut yang kelas entitasnya tidak kosong-> <update id = "updateStudent_if_trim" parameterType = "liming.student.manager.data.model.studentity"> update student_tbl <prefix trimer = "ifexover =" ifeLOnOME = "ifeLOM =" ifeLOM = "ifeLOM =" ifeLOMENOME = "ifeLOMENOME =" ifeLOMENOME = " ! = '' "> Student_tbl.student_name = #{studentName}, </if> <if test =" studentsex! = Null dan studentsex! = '' "> Student_tbl.student_sex = #{studentsex}, </if> <if test =" studentbirthday! = Null "> null"> </if> <if> <if test = "studentbirthday! = Null">> pewarna = PTREDODE = PINDLODTH. #{StudentBirthday}, </if> <if test = "studentphoto! = null"> student_tbl.student_photo = #{studentphoto, javatype = byte [], jdbctype = blob, typeHandler = org.apache.ibatis.type.blobtypeh '' = "" iF "ifache.apache.ibatis.type.blobtypeh," org Student_tbl.class_id = #{classId}, </if> <if test = "placeId! = ''"> Student_tbl.place_id = #{PlaceId} </if> </ trim> di mana student_tbl.student_id = #{studentId} </update> Pilih (kapan, sebaliknya)
Terkadang kami tidak ingin menerapkan semua kondisi, tetapi cukup pilih satu dari beberapa opsi. Saat menggunakan tag if, selama ekspresi dalam tes benar, kondisi dalam tag IF akan dieksekusi. Mybatis menyediakan elemen pilihan. Jika tag adalah hubungan dengan (dan), dan pilih adalah hubungan dengan (atau).
Tag pilihan adalah untuk menentukan apakah kondisi pengujian di internal saat tag valid secara berurutan. Jika seseorang valid, pilihan berakhir. Ketika semua kondisi dalam memilih tidak terpenuhi, SQL di jika tidak dijalankan. Mirip dengan pernyataan sakelar Java, pilih Switch, ketika case, dan sebaliknya default.
Misalnya, contoh -contoh berikut juga menuliskan semua kondisi yang dapat dibatasi dan menggunakannya. Pilih Akan Memilih Eksekusi SQL dengan Test True dari atas ke bawah saat tag. Untuk pertimbangan keamanan, kami menggunakan tempat untuk menyelesaikan pilihan dan menempatkan lebih banyak kata kunci daripada kesalahan.
<!-6 Pilih (Parameter Judgment)-Ambil properti pertama dari kelas entitas yang tidak kosong dalam urutan di mana kondisi-> <pilih id = "getstudentlist_choose" resultMap = "resultMap_studentity" parameterType = "liming.student.manager.data.model.studententity"> st.student.manager.data.model.studententity "> st.student.student, st.student, st.student, st.student, st.student, st.student, st.student, st.student, st.student, st.student, St.Student_Sex, St.Student_Birthday, St.student_photo, St.Class_id, St.Place_ID dari Student_tbl St <dial> <pilih> <when test = "studentname! = Null"> st.student_name like concat ('%', '), #{studentName, jdbctypy = varcat = varchar ('%') <%') null dan studentsex! = '' "> dan st.student_sex = #{studentsex, jdbctype = integer} </when> <when test =" studentbirthday! = null "> dan st.student_birthday = #{classbIrthday, jdbctype = date} </whe = #{classId, jdbctype = varchar} </when> <when test = "classEntity! = null dan classentity.classid! = ''"> dan st.class_id = #{classEntity.classid, jdbctype = varchar} </when> <when test = "placeid! = null dan placeid, '' '' dan paplaceid = '' {'{' placeid! = placeid! = '' jdbctype = varchar} </whow> <when test = "placeEntity! = null and placeEntity.placeId! = null and placeEntity.placeId! = ''"> dan st.place_id = #{placeEntity.placeId, jdbctype = varchar} </whow> <when test = "studentid! = null dan null, {'{' {'{when {students; jdbctype = varchar} </kap
foreach
Sangat penting untuk SQL dinamis, terutama untuk mengulangi koleksi, biasanya untuk kondisi. Daftar instance akan menggunakan "daftar" sebagai kunci, dan instance array akan menggunakan "array" sebagai kunci.
Elemen foreach sangat kuat, memungkinkan Anda untuk menentukan koleksi, mendeklarasikan item koleksi dan variabel indeks, yang dapat digunakan dalam badan elemen. Ini juga memungkinkan Anda untuk menentukan string terbuka dan tertutup, menempatkan pemisah di antara iterasi. Elemen ini sangat pintar, dan tidak menambahkan pemisah ekstra secara kebetulan.
Catatan: Anda dapat melewati contoh atau array daftar sebagai objek parameter ke mybatis. Saat Anda melakukan ini, mybatis akan secara otomatis membungkusnya di peta dengan nama sebagai kunci. Daftar instance akan menggunakan "daftar" sebagai kunci, dan instance array akan menggunakan "array" sebagai kunci.
Bagian ini dibahas tentang file konfigurasi XML dan file pemetaan XML. Bagian selanjutnya akan membahas Java API secara detail, sehingga Anda bisa mendapatkan pemetaan paling efisien yang pernah Anda buat.
1. Tulis contoh parameter sebagai array
Metode Deklarasi Antarmuka:
Daftar Publik <sahasien> getStudentListByClassids_foreach_array (string [] classids);
Pernyataan SQL Dinamis:
<!― 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 Dari student_tbl st di mana st.class_id di <freeach collection = "array" item = "classids" open = "(" sparator = "," close = ")"> #{classIds} </tandingeach> </pilih>
Uji kode untuk meminta siswa di dua kelas tahun 20000001 dan 20000002:
@Test public void test7_foreach () {string [] classIds = {"20000001", "20000002"}; Daftar <spinstryentity> list = this.dynamicsqlmapper.getStudentListByClassids_foreach_array (classIds); untuk (studententity e: list) {System.out.println (e.toString ()); }} 2. Tulis contoh daftar parameter
Metode Deklarasi Antarmuka:
Daftar Publik <Sahukentitas> getStudentListByClassIDS_FOREACH_LIST (Daftar <String> classIdlist);
Pernyataan SQL Dinamis:
<!-7.2 foreach (daftar loop <string> parameter)-sebagai syarat untuk di mana-> <pilih id = "getStudentListByClassids_foreach_list" resultMap = "resultMap_studentity"> st.student_id, st.student_name, st.student_sex, st.student_birdentsphayspurent_student_name, st.student_sex, st.students, st.student, St.student_name, st.student_sex, St.student, St.student, St.student_name, St.student_sex, St.student, St.Place_id dari Student_tbl St di mana St.Class_ID di <freeach collection = "list" item = "classIdlist" open = "(" puparator = "," close = ")"> #{classIdlist} </tandingeach> </pilih>
Uji kode untuk meminta siswa di dua kelas tahun 20000001 dan 20000002:
@Test public void test7_2_foreach () {arrayList <string> classIdlist = ArrayList baru <string> (); classidlist.add ("20000001"); classidlist.add ("20000002"); Daftar <spinesentity> list = this.dynamicsqlmapper.getStudentListByClassids_foreach_list (classIdlist); untuk (studententity e: list) {System.out.println (e.toString ()); }}3. Encapsulate parameter ke dalam jenis peta sendiri
<pilih id = "DynamicForeach3Test" resultType = "Blog"> Pilih * dari t_blog di mana judul seperti "%" #{title} "%" dan id di <freeach collection = "ids" index = "index" item = "item" open = "(" pemisah = "," close = ")"> #{item} </foreach>/parator = "Nilai koleksi di atas adalah ID, yang merupakan kunci dari peta parameter yang dilewati, dan kode mapper yang sesuai:
Daftar Publik <BOBAN> DYNAMICFOREACH3TEST (Peta <String, Object> Params);
Kode tes yang sesuai:
@Test public void dynamicforeach3test () {sqlSession session = util.getSqlSessionFactory (). Opensession (); BlogMapper BlogMapper = session.getMapper (blogmapper.class); Daftar Akhir <Integer> ids = ArrayList baru <Integer> (); ids.add (1); ids.add (2); ids.add (3); ids.add (6); ids.add (7); ids.add (9); Peta <String, Object> params = HashMap baru <String, Object> (); params.put ("IDS", IDS); params.put ("judul", "Cina"); Daftar <Bog> Blog = BlogMapper.DynamicForeach3Test (params); untuk (blog blog: blog) system.out.println (blog); session.close (); }