A veces, se requiere algún juicio de seguridad en las condiciones de la declaración SQL. Por ejemplo, si el parámetro aprobado está vacío al consultar de acuerdo con una determinada condición, es probable que el resultado de la consulta esté vacío en este momento. Quizás cuando necesitemos que el parámetro esté vacío, encontraremos toda la información. Use las secuencias de Oracle y las funciones MySQL para generar ID. En este momento podemos usar SQL dinámico. Todas las siguientes son sintaxis y funciones de MySQL (como la función de enlace de cadena concat).
etiqueta de llave de selección
En la instrucción Insertar, Oracle a menudo usa secuencias y funciones en MySQL para generar automáticamente la clave principal de la tabla de insertar, y se requiere un método para devolver esta clave primaria generada. Este efecto se puede lograr utilizando la etiqueta de llave de selección de MyBatis. El siguiente ejemplo es usar la función personalizada de la base de datos MySQL NextVal ('Student') para generar una clave y establecerla en la propiedad de StudentID en la clase de entidad aprobada. Entonces, después de ejecutar este método, el borde puede obtener la clave generada a través de esta clase de entidad.
< Student_name, student_sex, student_birthay, student_photo, class_id, lugar_id) valores ( #{studentId}, #{studentName}, #{studentsex}, #{studentbirthday}, #{studentPhoto, javatype = byte [], jdbctype = blob, typeHandler = org.apache.ibatis.type.blobtypeHandler}, #{classID}, #{placeId}) </sert>
Llame a los métodos de la interfaz y obtenga la generación de claves automáticas
Entidad de StudentEntity = new StudentEntity (); entity.setStudentName ("Hello Dawn"); entity.setStudentSex (1); entity.setStudentBirthday (dateUtil.parse ("1985-05-28")); entity.setClassid ("20000001"); entity.setPlaceID ("70000001"); this.dynamicsqlmapper.CreateStudentouTokey (entidad); System.out.println ("New Student ID:" + Entity.getStudentId ());
Detalles de configuración de la propiedad de la declaración de selección de llave:
| propiedad | describir | Obtener el valor |
| KeyProperty | El atributo que debe establecerse para el resultado generado por la instrucción SelectKey. | |
| tittype | Generar tipos de resultados. MyBatis permite el uso de tipos de datos básicos, incluidos los tipos de cadena e int. | |
| Orden | 1: Antes, la clave primaria se seleccionará primero, luego se establecerá KeyProperty y luego se ejecutará la instrucción Insertar; 2: Después, ejecute la instrucción Insertar primero y luego la instrucción SelectKey. | ANTES DESPUÉS |
| DeclaryType DeclaryType | MyBatis admite la declaración, formularios de instrucción preparados y llamables, correspondientes a la declaración, preparación y respuestas de CallableStatement. | DECLARACIÓN PREPARADO Llamable |
Si la etiqueta
Si las etiquetas se pueden usar en muchos tipos de declaraciones SQL, tomemos la consulta como ejemplo. Primero, veamos una consulta muy ordinaria:
<
Sin embargo, si StudentName o StudentSex es nulo en este momento, es probable que esta declaración reporte un error o el resultado de la consulta está vacío. En este momento, utilizamos la declaración SQL dinámica IF para hacer juicios primero. Si el valor es nulo o es igual a una cadena vacía, no emitiremos juicios sobre esta condición y aumentaremos la flexibilidad.
El parámetro es la Entity Class StudentEntity. Se juzgan todos los atributos en la clase de entidad, y si no están vacíos, se ejecuta la condición del juicio.
< 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 (coincat ('%', #{studentName, jdbctType = Varchar}), '%') </if> <i if test = "studentsx! = N. "> Y St.student_sex = #{StudentSex, jdbctype = Integer} </if> <if test =" StudentBirthday! = Null "> y St.student_Birthday = #{StudentBirthday, jdbctype = date} </if> <if test =" classid! #{classid, jdbctype = varchar} </if> <if test = "classentity! = null y classentity.classid! = null y classentity.classid! = '' '"> y St.class_id = #{classentity.classid, jdbctype = varcharche = if if> <if test = "placeid! = null y lugar' '' '' '' '' '' '' '' '' '' St.Place_id = #{placeId, jdbctype = varchar} </if> <if test = "placeEntity! = Null y placeEntity.placeId! = Null y placeEntity.placeId! = '' '"> Y St.Place_id = #{placeEntity.Plausid, jdbctype = varCharche = if if> <if if test = " St.student_id = #{studentId, jdbctype = varchar} </if> </select>Al usarlo, si desea usarlo, debe limitar la condición para una nueva clase de entidad. Solo necesita adjuntar el valor correspondiente a donde la condición. Por el contrario, si no asigna el valor, no puede juzgar dónde.
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 "); List <deudentIntity> list = this.dynamicsqlmapper.getstudentList_if (entidad); para (StudentEntity E: List) {System.out.println (e.ToString ()); }}
Si + donde el juicio condicional
Dichas combinaciones pueden causar errores cuando las condiciones en los que usan más etiquetas if. Tomemos la declaración de consulta en 3.1 como ejemplo, cuando el código Java se llama como sigue:
@Test public void select_test_2_1 () {StudentEntity entity = new StudentEntity (); entity.setStudentName (nulo); entity.setStudentSex (1); List <deudentIntity> list = this.dynamicsqlmapper.getstudentList_if (entidad); para (StudentEntity E: List) {System.out.println (e.ToString ()); }} Si el ejemplo anterior es nulo, la columna Student_Name no será juzgada, y el error adicional SQL para la palabra clave "Where and" se derivará directamente.
En este momento, podemos usar las declaraciones dinámicas para resolver el problema. Esta etiqueta "donde" sabrá que si la etiqueta contiene tiene un valor de retorno, insertará un 'donde'. Además, si el contenido devuelto por una etiqueta comienza con y o o, se eliminará.
El ejemplo anterior se modifica a:
< 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, jdbtbtype = varChar}) '' "> Y St.student_sex = #{studentSex, jdbctype = integer} </if> <if test =" studentbirthday! = Null "> y St.student_birthay = #{studentBirthday, jdbctype = date} </if> <if test =" classid! = Null y classid! = '' " #{classId, jdbcType=VARCHAR} </if> <if test="classEntity != null and classEntity.classId !=' ' "> AND ST.CLASS_ID = #{classEntity.classId, jdbcType=VARCHAR} </if> <if test="placeId != null and placeId != '' "> AND ST.PLACE_ID = #{placeId, jdbctype = varchar} </if> <if test = "placeEntity! = null y placeEntity.placeId! = null y placeEntity.placeId! = ''"> y St.Place_id = #{placeEntity.placeID, jdbctype = varchar} </fi> <if test = "studentid! = student! = '' ''" jdbctype = varchar} </if> </where> </select> Declaración de actualización para si + set
Cuando la etiqueta if no se usa en la declaración de actualización, si hay un parámetro nulo, causará un error.
Al usar las etiquetas IF en las declaraciones de actualización, si el IF anterior no se ejecuta, puede resultar en un error redundante de coma. Use la etiqueta SET para configurar dinámicamente las palabras clave SET y eliminar las comas no relacionadas adjuntas al final de la condición.
Después de modificar con la etiqueta if+set, si un elemento es nulo, no se actualizará, pero se mantendrá el valor de la base de datos original. El siguiente ejemplo:
< #{studentName}, </if> <if test = "studentsex! = null y studentsex! = '' '"> student_tbl.student_sex = #{studentsex}, </if> <if test = "studentbirthday! = null"> student_tbl.student_birthday = #{studentBirthday}, </if test! "> Student_tbl.student_photo = #{studentPhoto, javatype = byte [], jdbctype = blob, typeHandler = org.apache.ibatis.type.blobtypeHandler ! = '' "> Student_tbl.place_id = #{placeId} </if> </set> donde student_tbl.student_id = #{studentId}; </update> if + recortar en lugar de dónde/establecer etiqueta
TRIM es un lugar más flexible para ir a etiquetas de palabras clave redundantes, que pueden practicar los efectos de dónde y establecer.
Recorte en lugar de donde
< St.Place_id de Student_tbl st <Trim prefix = "Where" prefiXoverrides = "y | o"> <if test = "studentName! = Null"> St.student_name Like concat (concat ('%', #{studentName, jdbctype = varcharchar}), '%') </if> <i test = "stentsex! = Null! St.student_sex = #{studentSex, jdbctype = integer} </if> <if test = "studentbirthday! = Null"> y St.student_birthday = #{studentBirthday, jdbctype = date} </if> <if test = "classid! = Null y classid! = ''" jdbctype = varchar} </if> <if test = "classEntity! = null y classentity.classid! = null y classentity.classid! = '' '"> y St.class_id = #{classentity.classid, jdbctype = varchar} </if> <if test = "placeid! = null y lugarid! =' '" #{placeId, jdbctype = varchar} </if> <if test = "placeEntity! = null y placeEntity.placeId! = null y placeEntity.placeId! = '' '"> y St.Place_id = #{placeEntity.placeID, jdbctype = varchar} </if> <if test = "studing! = null y stentalid! #{studentId, jdbctype = varchar} </if> </crim> </select>
Recorte en lugar de establecer
< '' "> STUDENT_TBL.STUDENT_NAME = #{studentName}, </if> <if test="studentSex != null and studentSex != '' "> STUDENT_TBL.STUDENT_SEX = #{studentSex}, </if> <if test="studentBirthday != null "> STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday}, </if> <if test = "StudentPhoto! = Null"> student_tbl.student_photo = #{studentPhoto, javatype = byte [], jdbctype = blob, typeHandler = org.apache.ibatis.type.blobtypeHandler}, </if> <if test = "Classid! = '' '" #{classid}, </if> <if test = "placeId! = ''"> student_tbl.place_id = #{placeID} </if> </trom> Where student_tbl.student_id = #{studentID} </update> Elija (cuándo, de lo contrario)
A veces no queremos aplicar todas las condiciones, pero simplemente elija una de múltiples opciones. Cuando se usa la etiqueta if, siempre que la expresión en la prueba sea verdadera, las condiciones en la etiqueta if se ejecutarán. MyBatis proporciona el elemento de elección. Si la etiqueta es una relación con (y), y elegir es una relación con (o).
La etiqueta de elección es determinar si la condición de prueba en la interna cuando la etiqueta es válida en orden. Si uno es válido, la elección termina. Cuando no se cumplen todas las condiciones en Elegir, el SQL en lo contrario se ejecuta. Similar a la instrucción Switch de Java, elija Switch, When Case y de otra manera predeterminado.
Por ejemplo, los siguientes ejemplos también escriben todas las condiciones que pueden restringirse y usarlas. Elija seleccionará una ejecución SQL con Test True de arriba a abajo cuando la etiqueta. Para consideraciones de seguridad, utilizamos dónde concluir la elección y colocar más palabras clave que los errores.
< St.student_birthday, St.student_photo, St.class_id, St.Place_id desde Student_tbl st <Where> <Eloin> <When test = "StudentName! = Null"> St.student_name Like Concat (concat ('%', #{studentName y sententerments = null! ! = '' "> Y St.student_sex = #{studentSex, jdbctype = integer} </when> <when test =" studentbirthday! = Null "> y St.student_birthday = #{studentbirthday, jdbctype = fecha} </when> <when test =" classid! = Null y classid " #{classId, jdbcType=VARCHAR} </when > <when test="classEntity != null and classEntity.classId !=' ' "> AND ST.CLASS_ID = #{classEntity.classId, jdbcType=VARCHAR} </when > <when test="placeId != null and placeId != '' "> AND ST.PLACE_ID = #{placeId, jdbctype = varchar} </when> <when test = "placeEntity! = null y placeEntity.placeId! = null y placeEntity.placeID! = ''"> y St.Place_id = #{placeEntity.placeID, jdbctype = varchar} </when> <when test = "studentid! = student! = '' '' '" jdbctype = varchar} </when> <lo contrario> </lo contrario> </le elige> </where> </select>
abarrotarse
Es muy necesario para SQL dinámico, principalmente para iterar sobre una colección, generalmente en condiciones. Las instancias de lista utilizarán "List" como clave, y las instancias de matriz usarán "matriz" como clave.
El elemento foreach es muy potente, le permite especificar una colección, declarar elementos de recolección y variables de índice, que se pueden usar dentro del cuerpo del elemento. También le permite especificar cadenas abiertas y cerradas, colocando separadores entre iteraciones. Este elemento es muy inteligente y no agrega separadores adicionales por casualidad.
Nota: Puede pasar una instancia de lista o matriz como objeto de parámetro a myBatis. Cuando hagas esto, MyBatis lo envolverá automáticamente en un mapa con el nombre como clave. Las instancias de lista utilizarán "List" como clave, y las instancias de matriz usarán "matriz" como clave.
Esta sección se discute sobre los archivos de configuración XML y los archivos de mapeo XML. La siguiente sección discutirá la API Java en detalle, para que pueda obtener las asignaciones más eficientes que haya creado.
1. Escriba el ejemplo del parámetro como matriz
Declaración de método de interfaz:
Lista pública <SentuentEntity> GetStudentListByClassids_ForEach_Array (String [] classIds);
Declaración dinámica de SQL:
<! -7.1 foreach (parámetro de matriz de bucle) -como la condición para en Where -> <select id = "getStudentListByClassids_Foreach_Array" resultMap = "resultMap_Studentity"> select St.student_id, St.Student_Name, St.Student_Sex, St.student_Birthday, St.StudentTent, St.Class_, St.StUdent_D de St.CLAS Student_tbl st donde St.class_id en <foreach Collection = "Array" item = "classids" Open = "(" separator = "," Close = ")"> #{classids} </foreach> </select>
Pruebe el código para consultar a los estudiantes en las dos clases de 20000001 y 20000002:
@Test public void test7_forEach () {string [] classIDs = {"2000000001", "20000002"}; Lista <StudentEntity> list = this.dynamicsqlmapper.getStudentListByClassids_FOREACH_Array (classids); para (StudentEntity E: List) {System.out.println (e.ToString ()); }} 2. Escriba el ejemplo de la lista de parámetros
Declaración de método de interfaz:
Lista pública <SentuentEntity> GetStudentListByClassids_ForEach_List (List <String> ClassIdList);
Declaración dinámica de SQL:
< Desde Student_tbl St donde St.class_id en <foreach Collection = "list" item = "classidList" Open = "(" separator = "," Close = ")"> #{classidList} </foreach> </select>
Pruebe el código para consultar a los estudiantes en las dos clases de 20000001 y 20000002:
@Test public void test7_2_foreach () {ArrayList <String> classidList = new ArrayList <String> (); classidList.add ("20000001"); classidList.add ("20000002"); Lista <StudentEntity> list = this.dynamicsqlmapper.getStudentListByClassids_FOREACH_LIST (classidList); para (StudentEntity E: List) {System.out.println (e.ToString ()); }}3. Encapsula los parámetros en el tipo de mapa por ti mismo
<Select id = "DynamicForeach3Test" resultType = "Blog"> SELECT * de t_blog donde title Like "%" #{title} "%" e id en <foreach Collection = "IDS" index = "index" item = "item" open = "(" separator = "," cerrar = ")"> #{item} </boreach> </etect>El valor de la colección anterior es IDS, que es la clave del mapa de parámetros que se pasa y el código mapeador correspondiente:
Lista pública <Blog> DynamicForeach3Test (map <string, object> params);
Código de prueba correspondiente:
@Test public void DynamicForeach3Test () {sqlsession session = util.getSqlSessionFactory (). OpenSession (); BlogMapper BlogMapper = session.getMapper (blogMapper.class); Lista final <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 ("título", "China"); List <Blog> Blogs = BlogMapper.DynamicForeach3Test (Params); para (Blog Blog: Blogs) System.out.println (blog); session.close (); }