De hecho, una de las potentes características de MyBatis suele ser sus capacidades dinámicas de SQL. Si tiene experiencia usando JDBC u otros marcos similares, comprende que está muy enredado para concatenar dinámicamente las cuerdas SQL juntas, asegúrese de no olvidar los espacios u omitir comas al final de la lista. El SQL dinámico en MyBatis puede manejar este dolor a fondo. Para SQL dinámico, la forma más simple es darnos varios juicios de comportamiento dinámico cuando se codifica. En MyBatis, se utiliza un poderoso lenguaje SQL dinámico para mejorar esta situación, que puede usarse en cualquier mapeo de declaraciones SQL. Los elementos SQL dinámicos son similares al uso de JSTL u otros procesadores de texto basados en XML similares. MyBatis utiliza poderosas expresiones basadas en OGNL para eliminar otros elementos.
Varios elementos de nodo que usamos comúnmente incluyen si, elija (cuándo, de lo contrario), recorte (dónde, si) y foreach. Me siento un poco como el uso de XSLT (lo mencionaré más adelante en el artículo ~).
(1) Uso de IF
En la configuración de paginación del ViisitMapper, si PageIndex> -1 y PageSize> -1, se agregará el SQL de paginación correspondiente, de lo contrario no se agregará (el valor predeterminado se toma), como sigue:
<select id = "getListByPagenate" parametertype = "pagenateArgs" dentType = "visiter"> select * de (<incluido refid = "getListsQl" /> <incluido refid = "ordenbysql" />) t <!- #{} significa salida parametrizada, $ {} significa que la salida directa no funciona en ningún escudo, transfiera a las operaciones, transfiera <" test = "PageStart> -1 y PageSize> -1"> Limit #{PAGESTART}, #{PageSize} </if> </select> <sql id = "getListsql"> select * de Visitor Where> 0 </sql> <sql Id = "OrderBysql"> Orden por $ {OrderFieldRtr} $ {OrderDirection}Debido a que nuestros parámetros PageIndex y PageSize son valores INT, podemos hacer juicios directos como este. Si se trata de una instancia de objeto, podemos usar un juicio nulo para controlar alguna lógica dinámica. El desarrollo específico depende de las necesidades comerciales. Creo que es importante tener en cuenta aquí que no es fácil de escribir &&, esto no se reconocerá en la configuración ~.
(2) El uso de elección (cuándo, de lo contrario)
Elija cuando se use principalmente en escenarios de aplicación que solo cumplan con una de las condiciones en múltiples condiciones. Por ejemplo, aquí hay una condición de consulta, ID de aprobación, nombre y CreateTime, respectivamente. Supongamos que cuando consultemos la tabla de visitantes, si VisitorId tiene un valor, use la consulta de identificación y si VisitOrname tiene un valor, use la consulta de VisitName. De la siguiente manera, agregue la lista <Scisitor> GetListChooseWhendemo (BasicQueryargs Args) Método a la clase de interfaz david.mybatis.demo.ivisitorperation. Agregue la configuración de nodo selectas correspondiente en visitormapper:
paquete David.mybatis.demo; import java.util.list; import david.mybatis.model.basicQueryargs; import david.mybatis.model.pagenateargs; import David.mybatis.model.visitor; import.mybatis.model.visitorwithrn; público interface Agregar visitante*/ public int add (visitante visitante); /** Eliminar visitante*/ public int delete (int id); /** Actualizar visitante*/ public int actualización (visitante visitante); /** Consulta visitante*/ consulta de visitante público (int id); / * * Lista de consultas */ Public List <Sisitor> getList (); / * * Lista de consultas de paginación */ Lista pública <Scisitor> GetListByPagenate (PagenateArgs Args); / * * Lista de consultas de paginación (incluido Rownum) */ Public List <SisitorWithrn> GetListByPagenateWithrn (PagenateArgs Args); /** Consulta básica*/ Public Visitor BasicQuery (int id); / * * Consulta de condición dinámica (elija, cuándo) instancia */ lista pública <Sisitor> getListChooseWhendemo (BasicQueryargs args); / * * Consulta de condición dinámica (donde, if) instancia */ lista pública <Scisitor> getList WhereDeMo (BasicQueryargs args); / * * Consulta dinámica (foreach) instancia */ lista pública <Sisitor> getListForeachDemo (List <Integer> IDS); }
<? xml versión = "1.0" encoding = "utf-8"?> <! Doctype mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace = "David.mybatis.Demo.IVISIterSerperation"> <resultMap type = "Visitor" id = "VisitOrs"> <id columna = "id" propiedad = "id" /> <resultado columna = "name" propiedad = "name" /> <resultado columna = "correo electrónico" propiedad = "correo electrónico" /> <resultado columna = "estatus" estatus = "estatus" /> <resultado columna columna = "createTime" createTime "createMe" </resultMap> <sql id="getListSqlConditions"> select * from Visitor </sql> <!-- Choose when one of the conditions is met--> <select id="getListChooseWhenDemo" resultMap="visitorRs" parameterType="BasicQueryArgs"> <include refid="getListSqlConditions" /> <where> <if test = "querystatus> 0"> status = #{queryStatus} </if> <lowe> <when test = "QUERYID! = 0"> y id = #{QueryID} </when> <when test = "QueryName! = null"> y nombre como #{QueryName} </When> <lo contrario> y creatime> = #{querytime} </where> </select> </mapper>(3) Uso de dónde (recorte)
La ventaja de dónde las palabras clave es que si hay condiciones de filtro correspondientes, sabe insertar dónde las palabras clave en los momentos apropiados. Y también sabe cuándo eliminar los conectores correspondientes, principalmente, tratando con los siguientes escenarios
<select id = "findActiveBloglike" resultType = "Blog"> SELECT * De Blog Where <if test = "state! = null"> state = #{state} </if> <if test = "title! = null"> y title Like #{title} </if> <if test = "autor! = null y autor.name! = null"> y autor_name </if> </select>No se convertirá en el resultado de la falla de todas las condiciones
<select id = "findActiveBloglike" resultType = "Blog"> SELECT * De Blog Where </elect>
O debido a que no se cumple la primera condición, la condición posterior solo se cumple.
<select id = "findActiveBloglike" resultType = "Blog"> SELECT * DEL BLOG DONDE Y TITAR como 'ATITITLE' </select>
Por lo tanto, para esto podemos crear una opción cuando el ejemplo de condición, y agregar el método correspondiente de la lista pública del método <Sisitor> GetList Wheredemo (BasicQueryargs args) a la clase de interfaz de ivisitorerperación y agregue la configuración correspondiente en el archivo de configuración de VisitMapper de la siguiente manera:
<? xml versión = "1.0" encoding = "utf-8"?> <! Doctype mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper Namespace = "David.mybatis.Demo.IVISITEROPERATION"> <SQL ID = "getListsQlConditions"> Seleccionar * de Visitor </sql> <!-Agregar operaciones si las condiciones se cumplen-> <select id = "getListWherDeMo" ResultMap = "VisitOrs" ParameterTypeType = "BasicQueryargs"> <incluye refiDeReRyMo " /> <Where> <if test = "QUERYSTATUS> 0"> STATUS> 0 </if <if if test = "QUERYID> 0"> y id =#{QUIERYID} </if> <if test = " </Where> <!- <Trim prefix = "Where" prefiXoverrides = "y | o"> <if test = "QueryStatus> 0"> Status> 0 </if> <if test = "Queryid> 0"> y id =#{ test = "QueryTime! = Null"> y CreateTime> =#{QueryTime} </if> </tripl> -> </ectele> </mapper>(4) Uso de Foreach
En SQL dinámico comúnmente utilizado, tenemos un escenario comercial donde ID en una gran cadena de ID. En este caso, podemos usar foreach sin tener que trabajar duro para empalmar la cadena de identificación. El mismo paso es agregar el método correspondiente a la lista pública de la clase de interfaz ivisitorperación <Scisitor> GetListForeachDemo (List <Steger> IDS) y luego configurar la información del elemento de nodo correspondiente en el archivo mapper correspondiente, de la siguiente manera:
<? xml versión = "1.0" encoding = "utf-8"?> <! Doctype mapper public "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace = "David.mybatis.Demo.IVISIterSoperation"> <sql id = "getListsqlConditions"> seleccionar * de visitante </sql> <!-frecuencias de bucle de foreCh colección = "list" item = "item" index = "index" open = "(" separator = "," close = ")"> $ {item} </foreach> </select> </ mapper>Finalmente, solo necesita establecer el método de prueba correspondiente en Demorun, y se completará el SQL dinámico en MyBatis. El método demorun utilizado para la prueba a continuación
/** Consulta dinámica foreach instancia*/ public static void getListForeachDemo (list <integer> ids) {sqlsession session = myBatisutils.getSqlSession (); Ivisitoreperation voperation = session.getMapper (ivisitoreperation.class); Lista <Sisitor> ls = voperation.getListForeachDemo (IDS); para (visitante visitante: ls) {system.out.println (visitante); }} /** Consulta dinámica donde si instancia* / public static void getListwhereCondition (int id, name de cadena, fecha createTime) {name = name == ""? NULL: Nombre; Sqlsession session = mybatisutils.getSqlSession (); BasicQueryargs args = new BasicQueryargs (id, nombre, createTime); Ivisitoreperation voperation = session.getMapper (ivisitoreperation.class); List <Sisitor> ls = voperation.getListwheredemo (args); if (ls.size () == 0) System.out.println ("¡Compruebe sin coincidencia!"); else {for (visitante visitante: ls) {system.out.println (visitante); }}} /** Consulta dinámica Elija cuando instancia* / public static void getListChooseWhendemo (int id, string name, date createTime) {name == ""? NULL: Nombre; Sqlsession session = mybatisutils.getSqlSession (); BasicQueryargs args = new BasicQueryargs (id, nombre, createTime); Ivisitoreperation voperation = session.getMapper (ivisitoreperation.class); Lista <Sisitor> ls = voperation.getListChooseWhendemo (args); if (ls.size () == 0) System.out.println ("¡Compruebe sin coincidencia!"); else {for (visitante visitante: ls) {system.out.println (visitante); }}}
PD: Acerca de OGNL
OGNL es la abreviatura del lenguaje de navegación de gráfico de objetos. Desde una perspectiva del lenguaje: es un poderoso lenguaje de expresión utilizado para obtener y establecer las propiedades de los objetos Java. Su objetivo es proporcionar una sintaxis de abstracción más alta para navegar en los gráficos de objetos Java. OGNL tiene aplicaciones en muchos lugares, como:
Lenguaje vinculante como elementos GUI (Textfield, Combobox, etc.) para modelar objetos.
Tabla de base de datos para el lenguaje de fuente de datos de Tablemodel de Swing.
El lenguaje vinculante para componentes web y objetos de modelo de fondo (webognl, tapestry, webwork, webobjects).
Como una alternativa más expresiva a Jakarata Commons Beanutils o Jstl Expression Language.
Además, hay muchas cosas que se pueden hacer en Java, que también se pueden hacer usando OGNL, como el mapeo y la selección de listas. Para los desarrolladores, utilizando OGNL, puede usar la sintaxis concisa para completar la navegación de los objetos Java. En términos generales, la navegación de la información del objeto se completa a través de una "ruta". Esta "ruta" puede ser un atributo a un Java Bean, un objeto indexado en una colección, etc., en lugar de usar directamente el método GET o SET.