Às vezes, é necessário algum julgamento de segurança nas condições onde a declaração SQL. Por exemplo, se o parâmetro passado estiver vazio ao consultar de acordo com uma determinada condição, é provável que o resultado da consulta esteja vazio neste momento. Talvez quando precisamos que o parâmetro esteja vazio, encontraremos todas as informações. Use as seqüências da Oracle e as funções MySQL para gerar IDs. Neste momento, podemos usar o SQL dinâmico. Todos os seguintes são a sintaxe e as funções do MySQL (como a função de link da string concat).
Selecione TagKey Tag
Na instrução Insert, o Oracle geralmente usa sequências e funções no MySQL para gerar automaticamente a chave primária da tabela de inserção, e é necessário um método para retornar esta chave primária gerada. Esse efeito pode ser alcançado usando a tag SelectKey de Mybatis. O exemplo a seguir é usar a função personalizada do MySQL Database NextVal ('Student') para gerar uma chave e configurá -la para a propriedade StudentID na classe de entidade passada. Portanto, depois de executar esse método, a borda pode obter a chave gerada por meio dessa classe de entidade.
<!-Insira a chave primária automática do aluno-> <insert id = "createStestudentAutoKey" parameterType = "liming.student.manager.data.model.studententity" keyProperty = "studentId"> <leclect KeyProperty = "StudentId" ResultType = "String" = "Antes" "> 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}) </nsert>
Métodos de interface de chamada e obtenha geração automática de chaves
Entidade estudantil = new StudentEntity (); entity.setStudentName ("Hello Dawn"); entity.setStudentsex (1); entity.setStudentBirthday (dateutil.parse ("1985-05-28")); entity.setClassid ("200001"); entity.setplaceId ("70000001"); this.dynamicsqlmapper.createstudentautokey (entidade); System.out.println ("Novo ID do aluno:" + entity.getStudentId ());
Detalhes da configuração da propriedade Select Keyky:
| propriedade | descrever | Obtenha o valor |
| KeyProperty | O atributo que precisa ser definido para o resultado gerado pela instrução SELECTKEY. | |
| ResultType | Gerar tipos de resultados. O MYBATIS permite o uso de tipos de dados básicos, incluindo tipos de string e int. | |
| Ordem | 1: Antes, a chave primária será selecionada primeiro, a KeyProperty será definida e, em seguida, a instrução Insert será executada; 2: Depois, execute a instrução Insert primeiro e depois a instrução SELECTKEY. | ANTES DEPOIS |
| Declaração Declaração de Declaração | Mybatis suporta a instrução, formulários de instrução preparados e chamáveis, correspondentes a respostas de instrução, estatamento preparado e callablablestatement. | DECLARAÇÃO PREPARADO Chamável |
se tag
Se as tags puderem ser usadas em muitos tipos de instruções SQL, vamos tomar uma consulta como exemplo. Primeiro, vejamos uma consulta muito comum:
<!-Lista de estudantes de consulta, como nome-> <select id = "getStudentListlikename" parameterType = "StudentEntity" resultMap = "StudentResultmap"> selecione * de Student_tbl st Where St.Student_Name como concat (concat ('%', #{studentname}), '%') No entanto, se StudentName ou StudentSex estiverem nulos no momento, é provável que essa declaração relate um erro ou o resultado da consulta esteja vazio. Neste momento, usamos a instrução SQL se dinâmica para fazer julgamentos primeiro. Se o valor for nulo ou igual a uma corda vazia, não faremos julgamentos nessa condição e aumentaremos a flexibilidade.
O parâmetro é a classe de entidade. Todos os atributos na classe de entidade são julgados e, se não estiverem vazios, a condição de julgamento será executada.
<!-2 se (parâmetro de julgamento)-use a propriedade cuja classe de entidade não está vazia como onde condição-> <select id = "getStudentList_if" resultMap = "resultmap_studententity" parameterType = "liming.student.manager.data.model.studentEnTity"> select.ident_id, St.Student_birthday, St.Student_Photo, St.Class_Id, St.Place_Id de student_tbl st where <se test = "studentname! = Null"> sT.Student_name como concat (concat ('%', #{studentname, jdbctype = varchar}), '%') "> E St.Student_sex = #{StudentSex, JdbcType = Integer} </if> <if test =" StudentBirthday! = Null "> e St.Student_birthday = #{StudentBirthday, JdbcType = Date} </se> <fst =" "Classid! Classid! #{classId, jdbctype = varchar} </if> <if test = "classentity! = null e classentity.classid! = null and Classentity.classid! = ''"> e St.Class_id = #{Classentity.classid, jdbctype = st.class_id = # #{Classentity.classid, jdbctype = staning = ebclasl = # #{Classentity.classid, jdbctype = staning = ebclasl = # #{Classentity.classid, jdbctype = staning} </se [se St.place_id = #{placeId, jdbctype = varchar} </if> <if test = "placeentity! = Null e placeentity.placeId! = Null e placeentity.placeId! = ''"> E St.Place_Id = #{placeentity.placeId, jdbctype = esward =} </se " #) ST.STUDENT_ID = #{StudentId, JdbcType = varchar} </f> </leclect>Ao usá -lo, se você deseja usá -lo, precisará limitar a condição para a nova classe de entidade. Você só precisa anexar o valor correspondente a onde a condição. Pelo contrário, se você não atribuir o valor, não poderá julgar em onde.
public void select_test_2_1 () {estudanteEntity entity = new StudentEntity (); entity.setStudentName (""); entity.setStudentsex (1); entity.setStudentBirthday (dateutil.parse ("1985-05-28")); entity.setClassid ("200001"); //entity.setplaceId("70000001 "); Lista <TristentEntity> list = this.dynamicsqlmapper.getstudentlist_if (entidade); for (StudentEntity E: List) {System.out.println (e.toString ()); }}
Se + onde julgamento condicional
Tais combinações podem causar erros quando as condições em onde usam mais tags se. Vamos fazer a declaração de consulta em 3.1 como exemplo, quando o código Java é chamado da seguinte maneira:
@Test public void select_test_2_1 () {estudanteEntity entity = new StudentEntity (); entity.setStudentName (null); entity.setStudentsex (1); Lista <TristentEntity> list = this.dynamicsqlmapper.getstudentlist_if (entidade); for (StudentEntity E: List) {System.out.println (e.toString ()); }} Se o exemplo acima for nulo, a coluna do Student_Name não será julgada e o erro extra SQL para a palavra -chave "onde e" será derivado diretamente.
Neste momento, podemos usar onde instruções dinâmicas para resolver o problema. Esta tag "Where" saberá que, se a tag contiver tiver um valor de retorno, ela inserirá um 'where'. Além disso, se o conteúdo retornado por uma tag começar com e ou, ela será removida.
O exemplo acima é modificado para:
<!- 3 Selecione- onde/if (parâmetro de julgamento)- use a propriedade cuja classe de entidade não está vazia como a condição onde-> <select id = "getStudentList_wheref" resultmap = "resultmap_studententity" parametertype = "liming.student.manager.data.model.studentEntsity"> selectStudent.LetStudent.Student.Manager.data.data.model.studentEntsity "> seletStUdent.LetStudent.Student.Manager.data.data.model.studentEntsity"> seletStudent. St.Student_birthday, St.Student_photo, St.Class_Id, St.Place_Id de student_tbl st <where> '' "> E St.Student_sex = #{StudentSex, jdbcType = Integer} </if> <if test =" studentbirthday! = Null "> e st.student_birthday = #{studentbirthday, jdbctype = date} </if> <se" "{studentBirthday, na classe = nUlt! #{ClassID, jdbctype = varchar} </if> <if test = "ClassEntity! = null e ClassEntity.classid! = ''"> e St.Class_id = #{Classentity.classid, jdbctype = var} </if> <se test = "placeId! jdbctype = varchar} </if> <if test = "placeentity! = null e placeentity.placeId! = null e placeentity.placeId! = ''"> e St.place_id = #{placeentity.PlaceId, jdbctype = var} </'if> <se test = "acrédisid! jdbctype = varchar} </if> </where> </leclect> Declaração de atualização para IF + Set
Quando a tag IF não for usada na instrução Atualização, se houver um parâmetro nulo, causará um erro.
Ao usar as tags IF nas instruções de atualização, se não for executado se não for executado, isso pode resultar em um erro redundante de vírgula. Use a tag Definir para configurar dinamicamente as palavras -chave Definir e remover quaisquer vírgulas não relacionadas anexadas até o final da condição.
Depois de modificar com a tag if+definida, se um item for nulo, ele não será atualizado, mas o valor original do banco de dados será mantido. O exemplo a seguir:
<!-4 if/set (parâmetro de julgamento)-Atualize atributos cuja classe de entidade não está vazia-> <update id = "updatestudent_if_set" parametertype = "liming.student.manager.data.model.studentity"> atualize student_tbl <Set> <fSoT = "Studentname! #{StudentName}, </if> <se test = "StudentSex! = NULL e StudentSex! = ''"> student_tbl.student_sex = #{StudentSex}, </se> <if test = studentBirthday! "> Student_tbl.student_photo = #{studentphoto, javatype = byte [], jdbctype = blob, typeHandler = org.apache.ibatis.type.blobtypeHandler}, </f> <se test = #classes! ! = '' "> Student_tbl.place_id = #{placeid} </if> </set> where student_tbl.student_id = #{studentId}; </atualização> Se + aparar em vez de onde/tag definido
A TRIM é um local mais flexível para ir a tags de palavras -chave redundantes, que podem praticar os efeitos de onde e definir.
aparar em vez de onde
<!-5.1 se/TRIM substitui onde (parâmetro de julgamento)-use atributos cuja classe de entidade não está vazia como onde condição-> <select id = "getStudentlist_if_trim" resultMap = "resultMap_studentity"> select St.Student_id, St.Student_Name, St.Student_sex, St.place_id de student_tbl st <Trim prefix = "where" prefixoverrides = "e | ou"> <se test = "StudentName! = Null"> sT.student_name como concat (concat ('%', #{studentname, jdbctype = varchar}), '%') </se> <ftionName, testes> testes> ST.STUDENT_SEX = #{StudentSex, jdbcType = Integer} </if> <se test = "StudentBirthday! = Null"> e St.Student_birthday = #{StudentBirDay! jdbctype = varchar} </if> <if test = "classentity! = null e classentity.classid! = null e classentity.classid! = ''"> e st.class_id = #{Classentity.classid, jdbctype = varchar} </se> <se Test = "PlaceId! #{placeId, jdbctype = varchar} </if> <if test = "placeentity! = null e placeentity.placeId! = null e placeentity.placeId! = ''"> e St.Place_Id = #{placeentity.placeId, jdbctype = varchar} </se> <se TESTENDENT = " #{StudentId, jdbctype = varchar} </if> </avim> </leclect>
Apare em vez de definir
<!-5.2 se/TRIM substitui o conjunto (parâmetro de julgamento)-Atualize atributos cuja classe de entidade não está vazia-> <UPDATE ID = "UPDATESTUDENT_IF_TRIM" ParameterType = "Liming.student.Manager.data.model.studentity"> atualize student_tbl <trim prefix = "set" sfix = sufix ". StudentName! = '' "> student_tbl.student_name = #{StudentName}, </if> <se test =" StudentSex! = NULL e StudentSex! = '' "> student_tbl.student_sex = #{StudentSex}, </se> <se test =" StudentBirth! #{StudentBirthday}, </if> <if test = "studentphoto! = null"> student_tbl.student_photo = #{studentphoto, javatype = byte [], jdbctype = Blob, typeHandler = org.apache.ibatis.type.blobtypend = Student_tbl.class_id = #{ClassId}, </if> <if test = "placeId! = ''"> Student_tbl.place_id = #{placeid} </if> </avim> where student_tbl.student_id = #{StudentId} </puta> Escolha (quando, caso contrário)
Às vezes, não queremos aplicar todas as condições, mas basta escolher uma de várias opções. Ao usar a tag if, desde que a expressão no teste seja verdadeira, as condições na tag if serão executadas. Mybatis fornece o elemento de escolha. Se a tag for um relacionamento com (e), e escolher é um relacionamento com (ou).
A tag de escolha é determinar se a condição de teste no interno quando a tag é válida em ordem. Se um for válido, a escolha termina. Quando todas as condições em escolha não são satisfeitas, o SQL em de outra forma é executado. Semelhante à instrução Switch de Java, escolha Switch, quando caso e, de outra forma, padrão.
Por exemplo, os exemplos a seguir também anotam todas as condições que podem ser restritas e usá -las. Escolha selecionar uma execução SQL com teste true de cima para baixo quando tag. Para considerações de segurança, usamos onde encerrar a escolha e colocar mais palavras -chave do que erros.
<!-6 Escolha (parâmetros de julgamento)-Pegue a primeira propriedade da classe de entidade que não está vazia em ordem como onde a condição-> <select id = "getStudentlist_choose" resultMap = "resultMap_studententity" ParameterType = "liming.student.manager.data.model.studentitype "> ST.STUDENT_SEX, ST.STUDENT_Birthday, St.Student_Photo, St.Class_Id, St.Place_Id de Student_tbl st <where> <escolha> <when test = "studentname! ! = NULL e StudentSex! = '' "> e St.Student_Sex = #{StudentSex, JDBCType = Integer} </quando> <Quando test =" StudentBirthday! = null "> e st.student_birthday = # #{ # #{studentbirthday, Jdbctype =} E St.Class_Id = #{ClassID, JDBCTYPE = varchar} </quando> <Quando test = "ClassEntity! = NULL e CLASSENTITY.CLASSID! = ''"> E St.Class_Id = #{Classentity.classid, Jdbctype = Varchar} </When> <quando TESTIDID! #{placeId, jdbctype = varchar} </when> <when test = "placeentity! = null e placeentity.placeId! = null e placeentity.placeId! = ''"> e St.place_id = #{sweetentity.placeId, jdbctype = varchar} </when> <brinEnUrnid = "TestEntity.Testentity," TestenId! #{StudentId, jdbctype = varchar} </when> <bem>
foreach
É muito necessário para o SQL dinâmico, principalmente para iterar sobre uma coleção, geralmente para as condições. As instâncias da lista usarão "Lista" como chave, e as instâncias de matriz usarão "Array" como chave.
O elemento foreach é muito poderoso, permite especificar uma coleção, declarar itens de coleta e variáveis de índice, que podem ser usadas no corpo do elemento. Ele também permite especificar cadeias abertas e fechadas, colocando separadores entre as iterações. Esse elemento é muito inteligente e não anexa separadores extras por acaso.
NOTA: Você pode passar uma instância ou matriz de lista como objeto de parâmetro para mybatis. Quando você faz isso, o Mybatis o envolverá automaticamente em um mapa com o nome como chave. As instâncias da lista usarão "Lista" como chave, e as instâncias de matriz usarão "Array" como chave.
Esta seção é discutida sobre os arquivos de configuração XML e os arquivos de mapeamento XML. A próxima seção discutirá a API Java em detalhes, para que você possa obter os mapeamentos mais eficientes que criou.
1. Escreva o exemplo do parâmetro como matriz
Declaração do método da interface:
Lista pública <TristentEntity> getStudentListbyClassids_foreach_array (string [] classIds);
Declaração SQL dinâmica:
<! -7.1 foreach (parâmetro de matriz de loop) -como a condição para em onde -> <select id = "getStudentlistbyclassids_foreach_array" resultMap = "resultMap_studententity"> ST.STUDENT_ID, ST.STUDENT_NAME, ST.STUDENT_SEX, ST.BIRTHENT_IR, De Student_tbl St, onde St.Class_Id em <foreach collection = "array" item = "classIds" Open = "(" separator = "," Close = ")"> #{Classids} </foreach> </leclect>
Teste o código para consultar os alunos nas duas aulas de 20000001 e 20000002:
@Test public void test7_foreach () {string [] classIds = {"20000001", "20000002"}; Lista <TristentEntity> list = this.dynamicsqlmapper.getStudentListbyclassids_foreach_array (classids); for (StudentEntity E: List) {System.out.println (e.toString ()); }} 2. Escreva o exemplo da lista de parâmetros
Declaração do método da interface:
Lista pública <TristentEntity> getStudentListbyClassids_foreach_list (list <string> classIdList);
Declaração SQL dinâmica:
<!-- 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 de student_tbl st where St.class_id in <foreach collection = "list" item = "classIdList" open = "(" separator = "," Close = ")"> #{ClassIdList} </foreach> </leclect>
Teste o código para consultar os alunos nas duas aulas de 20000001 e 20000002:
@Test public void test7_2_foreach () {ArrayList <String> classIdList = new ArrayList <String> (); ClassIdList.add ("200001"); ClassIdList.add ("20000002"); Lista <TristentEntity> list = this.dynamicsqlmapper.getStudentListbyclassids_foreach_list (classIdlist); for (StudentEntity E: List) {System.out.println (e.toString ()); }}3. Encapsular os parâmetros no tipo de mapa sozinho
<select id = "DynamicForEach3test" ResultType = "Blog"> Selecione * FROM T_BLOG Onde o título como "%" #{title} "%" e ID em <foreach collection = "ids" index = "índice" item = "item" <//"" ("separator =", "Close =") "> #{} </paraEach>O valor da coleção acima é o IDS, que é a chave do mapa de parâmetros passados, e o código do mapeador correspondente:
Lista pública <blog> dynamicForEach3test (map <string, object> params);
Código de teste correspondente:
@Test public void dynamicForEach3Test () {SqlSession Session = util.getSqlSessionFactory (). OpenSession (); Blogmapper blogmapper = session.getmapper (blogmapper.class); LISTA FINAL <TEGER> IDS = new ArrayList <Teger> (); ids.add (1); ids.add (2); ids.add (3); ids.add (6); ids.add (7); ids.add (9); Mapa <string, object> params = new hashmap <string, object> (); params.put ("ids", ids); params.put ("title", "China"); List <blog> blogs = blogmapper.dynamicForEach3test (params); para (blog blog: blogs) system.out.println (blog); session.close (); }