Иногда требуется какое -то решение по безопасности в условиях Заявления SQL. Например, если пропущенный параметр пуст при запросе в соответствии с определенным условием, результат запроса, вероятно, будет пустым в это время. Возможно, когда нам нужен параметр, чтобы быть пустым, мы найдем всю информацию. Используйте последовательности Oracle и функции MySQL для генерации идентификаторов. В это время мы можем использовать динамический SQL. Все ниже представляют собой синтаксис MySQL и функции (например, функция строковой ссылки Concat).
SelectKey Tag
В операторе вставки Oracle часто использует последовательности и функции в MySQL для автоматического генерации первичного ключа таблицы вставки, и для возврата этого сгенерированного первичного ключа требуется метод. Этот эффект может быть достигнут с помощью тега SelectKey Mybatis. Следующим примером является использование пользовательской функции базы данных MySQL NextVal («Студент»), чтобы сгенерировать ключ и установить ее в свойство StudentID в классе пропущенных объектов. Таким образом, после выполнения этого метода край может получить сгенерированный ключ через этот класс объектов.
<!-Вставьте автоматический первичный ключ студента-> <INSERT ID = "TreatudentAutokey" parameterType = "liming.student.manager.data.model.studententity" keyproperty = "studentId"> <selectKey KeyProperty = "studentId" outsertype = "restry" order = "> select nextval ('student' insertype =" order = "> select nextval ('Student') </orseke orseke orseke orseke orseke orseke orseke orseke orseke orseke orseke orshee Студент_tbl (Student_id, Student_name, Student_sex, Student_birthday, Student_photo, class_id, place_id) values ( #{studentId}, #{studentName}, #{studentSex}, #{studentBirthday}, #{studentPoto, javatype = byte [], jdbcty}, #{studentPoto, javatype = byte [], Jdbcty}, # typehandler = org.apache.ibatis.type.blobtypehandler}, #{classid}, #{placeid}) </insert>
Методы интерфейса вызовов и получить автоматическую генерацию ключей
Студенческая организация = новый студент (); Entity.SetStudentName ("Hello Dawn"); Entity.SetStudentSex (1); Entity.SetStudentBirthDay (dateUtil.parse ("1985-05-28")); Entity.SetClassid ("2000000001"); Entity.SetPlaceID ("70000001"); this.dynamicsqlmapper.createStudentAutokey (Entity); System.out.println ("Новый идентификатор студента:" + entity.getStudentId ());
Сведения о конфигурации Свойства SelectKey:
| свойство | описывать | Получите значение |
| KeyProperty | Атрибут, который должен быть установлен для результата, сгенерированного оператором SelectKey. | |
| ResultType | Генерировать типы результатов. Mybatis позволяет использовать основные типы данных, включая типы строк и INT. | |
| Заказ | 1: До начала первичного ключа будет выбрана сначала, затем будет установлен KeyProperty, а затем будет выполнен оператор INSERT; 2: после того, как сначала запустите оператор INSERT, а затем оператор SELECTKEY. | ДО ПОСЛЕ |
| ApportType atportionType | Mybatis поддерживает заявление, подготовленные и вызывшие формы операторов, соответствующие операторам, подготовленным ответам и CallableStatement. | ЗАЯВЛЕНИЕ ГОТОВЫЙ Каллируемый |
Если тег
Если теги можно использовать во многих типах операторов SQL, давайте возьмем запрос в качестве примера. Во -первых, давайте посмотрим на очень обычный запрос:
<!-Список студентов запроса, например, имя-> <select id = "getStudentLikLikEname" parameterType = "studentEntity" resultMap = "studentResultmap"> select * from student_tbl st, где st.student_name как concat (concat ('%', #{student}, '%') </select> Однако, если в настоящее время StudentName или StudentSex не является нулевым, это утверждение, вероятно, сообщит об ошибке, или результат запроса пуст. В настоящее время мы используем Dynamic SQL -заявление, чтобы сначала вынести суждения. Если значение является нулевым или равным пустой строке, мы не будем выносить суждения об этом условии и повышать гибкость.
Параметр является ученичество класса сущности. Все атрибуты в классе объектов оцениваются, и если они не пусты, условие решения выполняется.
<!-2 if (параметр суждения)-Используйте свойство, класс объектов, класс объектов, не является пустым, так как условие-> <select id = "getStudentList_if" resultMap = "resultMap_studententity" parametertype = "liming.student.manager.data.model.studententist"> select st.student_id, st.student_name, st.sted_name. St.student_birthday, St.student_photo, St.class_id, St.place_id от student_tbl st, где <if test = "studentName! = Null"> st.student_name like concat (concat ('%', #{studentName, jdbctype = varchar}), '%') </if> <ifcty nulls! "> И St.student_sex = #{StudentSex, jdbctype = integer} </if> <if test =" studentBirthday! = Null "> и St.Student_Birthday = #{studentBirthday, jdbctype = date} </if> <if test =" classid! #{classid, jdbctype = varchar} </if> <if test = "classentity! = null и classentity.classid! = null and classentity.classid! = ''"> и St.class_id = #{classentity.classid, jdbctepe = varchar} </if> <if test = naul! St.place_id = #{Placeid, jdbctype = varchar} </if> <if test = "placeentity! = Null и Placeentity.faceid! = Null и Placeentism.faceid! = ''"> И St.place_id = #{Placeentity.faceid, jdbctepe = var warch} </if> <if test = "untlyid! St.student_id = #{StudentId, jdbctype = varchar} </if> </select>При использовании его, если вы хотите его использовать, вам необходимо ограничить условие для нового класса такого объекта. Вам нужно только прикрепить соответствующее значение к тому, где условие. Напротив, если вы не назначаете значение, вы не можете судить, где.
public void select_test_2_1 () {studententity entity = new StudentEntity (); Entity.SetStudentName ("" "); Entity.SetStudentSex (1); Entity.SetStudentBirthDay (dateUtil.parse ("1985-05-28")); Entity.SetClassid ("2000000001"); //entity.setplaceid("70000001 "); List <toodtantity> list = this.dynamicsqlmapper.getStudentList_if (entity); для (StudentEntity E: List) {System.out.println (e.toString ()); }}
Если + где условное суждение
Такие комбинации могут вызывать ошибки при условиях, где используются больше, если теги. Давайте возьмем заявление запроса в 3.1 в качестве примера, когда код Java называется следующим образом:
@Test public void select_test_2_1 () {StudentEntity entity = new StudentEntity (); Entity.SetStudentName (null); Entity.SetStudentSex (1); List <toodtantity> list = this.dynamicsqlmapper.getStudentList_if (entity); для (StudentEntity E: List) {System.out.println (e.toString ()); }} Если приведенный выше пример является нулевым, столбец student_name не будет оцениваться, а дополнительная ошибка SQL для «где и» ключевое слово будет выявлен непосредственно.
В настоящее время мы можем использовать там, где динамические операторы для решения проблемы. Этот тег «где» будет знать, что если тег, который он содержит, имеет возвратное значение, он вставит «где». Кроме того, если контент возвращается тегом и или или или или, он будет удален.
Приведенный выше пример изменен на:
<!- 3 SELECT- Где/if (параметр суждения)- Используйте свойство, класс объектов, класс объектов, не пуст в качестве условия,> <select id = "getStudentList_whereif" resultMap = "resultMap_Studententity" parameterType = "Liming.Student.Manager.Data.ModelEntentity"> SELECTSTUDED_ID_NAMED_NAMERED_NAMEREDEREDEREDEREDEREDEREDEREDEREDERENTUDERENTUDES St.student_birthday, St.student_photo, St.class_id, St.place_id из Student_tbl St <где> <if test = "studentName! = Null"> st.student_name like (concat ('%', #{studentName, jdbctype = varchar}), '%') </if stuldse = ntuldse! '"> И st.student_sex = #{StudentSex, jdbctype = integer} </if> <if test =" studentBirthday! = Null "> и St.student_birthday = #{studentBirthday, jdbctype = date} </if> <if test =" = null! #{classid, jdbctype = varchar} </if> <if test = "classentity! = null и classentity.classid! = ''"> и St.class_id = #{classentity.classid, jdbctype = varchar} </if> <if test = "placeid! jdbctype = varchar} </if> <if test = "Placeentity! = null и Placeentity.PlaceId! = null и Placeentity.PlaceID! jdbctype = varchar} </if> </where> </select> Оператор обновления для if + set
Когда тег, если тег не используется в операторе обновления, если есть параметр NULL, он вызовет ошибку.
При использовании, если теги в операторах обновления, если предыдущее, если не выполнено, это может привести к избыточной ошибке запятой. Используйте тег SET для динамической настройки ключевых слов SET и для удаления любых не связанных запятых запятых, добавленных в конце условия.
После изменения с помощью тега if+set, если элемент нулевой, он не будет обновлен, но исходное значение базы данных будет сохранено. Следующий пример:
<!-4 if/set (параметр суждения)-Атрибуты обновления, класс объектов, класс объектов не пуст-> <Обновление идентификатор = "updateStudent_if_set" parametertype = "liming.student.manager.data.model.studententity"> update outdent_tbl <set> <if test = "student andame! #{studentName}, </if> <if test = "studentSex! = null и StudentSex! = ''"> student_tbl.student_sex = #{studentSex}, </if> <if test = "studentBirthday! = null"> student_tbl.student_birthday = #{student "> Study_tbl.student_photo = #{StudentPhoto, javatype = byte [], jdbctype = blob, typehandler = org.apache.ibatis.type.blobtypehandler}, </if> <if test =" classid! = ''> Testb ! = '' "> Study_tbl.place_id = #{placeid} </if> </set>, где study_tbl.student_id = #{studeId}; </update> if + trim вместо того, где/установить тег
TRIM - это более гибкое место, где можно перейти к избыточным тегам ключевых слов, которые могут практиковать влияние того, где и установка.
обрезать вместо того, где
<!-5.1 if/trim заменяет, где (параметр суждения)-Используйте атрибуты, класс объектов, класс сущности не является пустым, так как условие-> <select id = "getStudentList_if_trim" resultMap = "resultMap_studententity"> Select St.student_id, St.student_Name, St.Student_Sex, St.Student_BiRthDay, St.St.T.Place_phot_phot_phot_phot_phot_phot_phot_phot_phot_phot_phot_phot_phot_phot_phot_phot_phot_phot_phot_phot_phot_phot_phot_phot_phot От student_tbl st <trim prefix = "где" prefixoverrides = "и | или"> <if test = "studentName! = Null"> st.student_name like concat (concat ('%', #{studentName, jdbctype = varchar}), '%') </if> <if test = "student! St.student_sex = #{studentSex, jdbctype = integer} </if> <if test = "StudentBirthDay! = Null"> и St.Student_BirthDay = #{StudentBirthDay, jdbctype = date} </if> <if test = classid! = Null и classid! jdbctype = varchar} </if> <if test = "classentity! = null и classentity.classid! = null и classentity.classid! #{placeid, jdbctype = varchar} </if> <if test = "Placeentity! = null и Placeentity.PlaceId! = null и Placeentity.PlaceId! = ''"> и St.place_ID = #{Placeentity.PlaceId, JDBCTYP = varChar} </if> <if test = "student! #{StudentId, jdbctype = varchar} </if> </trim> </select>
обрезать вместо набора
<!-5.2 if/trim заменяет набор (параметр суждения)-атрибуты обновления, класс объектов, класс объектов не пуст-> <Обновление идентификатор = "updateStudent_if_trim" parametertype = "liming.student.manager.data.model.studententity"> update_tbl <trim prefix = "set" suffixriderides = "> <iftull и" ntull and ntull ratull и "natull и" natull and ntull ratull ratull и ". ! = '' "> Student_tbl.student_name = #{studentName}, </if> <if test =" studentSex! = Null и Student #{studentBirthday}, </if> <if test = "studentPhoto! = null"> studive_tbl.student_photo = #{studePhoto, javatype = byte [], jdbctype = blob, typehandler = org.apache.ibatis.type.blobehandler}, </if.pache.ibatis.type.blobehandler}, <if.pache.ibatis.type.blob Study_tbl.class_id = #{classid}, </if> <if test = "placeid! = ''"> Study_tbl.place_id = #{placeid} </if> </trim>, где Student_tbl.student_id = #{studeId} </uppleation> Выберите (когда, иначе)
Иногда мы не хотим применять все условия, но просто выбираем один из нескольких вариантов. При использовании тега IF, до тех пор, пока выражение в тесте является истинной, условия в if -теге будут выполнены. Mybatis предоставляет элемент выбора. Если тег - это отношение с (и), а выбор - это связь с (или).
Тег выбора состоит в том, чтобы определить, является ли условие тестирования во внутренней, когда тег действителен по порядку. Если кто -то действителен, выбор заканчивается. Когда все условия по выбору не выполняются, SQL в противном случае выполняется. Подобно оператору переключения Java, выберите Switch, Case и иным образом по умолчанию.
Например, следующие примеры также записывают все условия, которые можно ограничить, и их используют. Выберите, выберите выполнение SQL с Test True сверху вниз при теге. Для соображений безопасности мы используем, где можно обернуть выбор и разместить больше ключевых слов, чем ошибки.
<!-6 Выберите (параметры суждения)-возьмите первое свойство класса сущности, которое не является пустым в порядке в порядке, так как условие-> <select id = "getStudentList_choose" resultMap = "resultMap_Studententity" ParameterType = "Liming.Student.Manager.Data.ModelEntentity"> SELECTSTUDEDEREDEREDEREDERSTUDEDEREDERSTUDEREDEREDEREDEREDERSTUDEREDENTUDEREDENTUDEREDENTUDEREDERSTUDEDERSTUDEDERSTUDEREDERSTUDEDERSTUD St.student_birthday, St.student_photo, St.class_id, St.place_id от Student_tbl St <Где> <Выберите> <When Test = "studentName! = Null"> St.Student_Name Like Concat (concat ('%', #{studentName, jdbctype = varChar), '%') </когда> <dlyStemSx = ntull и "test =" natull и "natull и" ntull и "ntull и" test and student = " #ntull и" natuld! ! = '' "> И St.student_sex = #{StudentSex, jdbctype = integer} </when> <of test =" studentBirthday! = Null "> и St.student_birthday = #{studentBirthday, jdbctype = date} </when> <when test =" classid! #{classid, jdbctype = varchar} </when> <when test = "classentity! = null и classentity.classid! = ''"> и St.class_id = #{classentity.classid, jdbctype = varchar} </when> <when test = "placeid! jdbctype = varchar} </when> <when test = "Placeentity! = NULL и Placeentity.PlaceID! = NULL и Placeentity.PlaceID! jdbctype = varchar} </when> <extert> </inese> </select> </where> </select>
Фореш
Это очень необходимо для динамического SQL, в основном для итерации над коллекцией, обычно для условий. Экземпляры списка будут использовать «список» в качестве ключа, а экземпляры массива будут использовать «массив» в качестве ключа.
Элемент Foreach очень мощный, он позволяет вам указать коллекцию, объявлять предметы сбора и индексные переменные, которые можно использовать в корпусе элемента. Это также позволяет указать открытые и закрытые строки, размещая разделители между итерациями. Этот элемент очень умный, и он не добавляет дополнительных сепараторов случайно.
Примечание. Вы можете передать экземпляр списка или массив в качестве объекта параметра в Mybatis. Когда вы делаете это, Mybatis автоматически завершит его на карту с именем в качестве ключа. Экземпляры списка будут использовать «список» в качестве ключа, а экземпляры массива будут использовать «массив» в качестве ключа.
Этот раздел обсуждается о файлах конфигурации XML и файлах отображения XML. В следующем разделе подробно рассказывается о Java API, так что вы можете получить наиболее эффективные отображения, которые вы создали.
1. Напишите пример параметра в качестве массива
Метод объявление интерфейса:
public list <toodtantity> getStudentListByClassids_foreach_array (String [] classids);
Динамический оператор SQL:
<! -7.1 Foreach (параметр массива петли) -как условие для IN IN -> <SELECT ID = "GetStudentListByClassids_foreach_array" resultMap = "resultMap_Studententity"> Select St.student_id, St.student_Name, St.student_sex, St.Stlace_BIRTHID_PHOT_PHOT, St. ST.PlaceS_SLASS, St.FlaceS_PLASS, St.flaceS_SLASS, St.flaceS_PLASS, St. ST.PlaceS_PLASS, St. ST.PlaceS_PLASS, St. Student_tbl St, где St.class_id в <foreach collection = "array" item = "classids" open = "(" seperator = "," close = ")"> #{classids} </foreach> </select>
Проверьте код, чтобы запросить студентов в двух классах 20000001 и 2000000:
@Test public void test7_foreach () {string [] classids = {"20000001", "20000002"}; List <toodtantity> list = this.dynamicsqlmapper.getStudentListbyClassids_foreach_array (classids); для (StudentEntity E: List) {System.out.println (e.toString ()); }} 2. Напишите пример списка параметров
Метод объявление интерфейса:
public List <toodtantity> getStudentListByClassids_foreach_list (список <string> classidlist);
Динамический оператор SQL:
<!-7.2 Foreach (List List <string> Параметр)-как условие для IN IN-> <SELECT ID = "GETSTUDENTILLISTBYCLASSIDS_FORECH_LIST" RESSUTMAP = "RESSUTMAP_STUDENTENTITIO Student_tbl St, где st.class_id в <foreach collection = "list" item = "classidlist" open = "(" seperator = "," close = ")"> #{classidlist} </foreach> </selet>
Проверьте код, чтобы запросить студентов в двух классах 20000001 и 2000000:
@Test public void test7_2_foreach () {arraylist <string> classidlist = new ArrayList <string> (); classidlist.add ("20000001"); classidlist.add ("20000002"); List <toodtantity> list = this.dynamicsqlmapper.getStudentListbyClassids_foreach_list (classidlist); для (StudentEntity E: List) {System.out.println (e.toString ()); }}3. Инкапсулируйте параметры в тип карты самостоятельно
<SELECT ID = "DynamicForeACH3TEST" refultyPe = "blog"> select * From t_blog, где заголовок как «%» #{title} «%» и id в <foreach collection = "ids" index = "index" item = "item" open = "(" sepreator = "," close = ")"> #{itex} </foreeach> </select>Значение приведенной выше коллекции - это идентификаторы, которая является ключом к карте параметров, и соответствующий код Mapper:
public List <loge> dynamicforeach3test (map <string, object> params);
Соответствующий тестовый код:
@Test public void dynamicforeach3test () {sqlSession session = util.getSqlSessionFactory (). OpenSession (); Blogmapper blogmapper = session.getmapper (blogmapper.class); Окончательный список <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», «Китай»); List <logs> blogs = blogmapper.dynamicforeach3test (params); для (блог блогов: блоги) System.out.println (блог); session.close (); }