Básicamente, todos saben cómo usar MyBatis para ejecutar SQL arbitrario. El método de uso es muy simple, por ejemplo, en un xxmapper.xml:
<select id = "ejecutesql" resultType = "map"> $ {_ parámetro} </select>Puedes llamarlo de la siguiente manera:
sqlsession.selectList ("ejecutesql", "seleccione * de sysuser donde habilitado = 1");O puede definir el siguiente método en la interfaz xxmapper.java:
List <Map> Executesql (String SQL);
Luego use la interfaz para llamar al método:
xxmapper.executesql ("Seleccionar * de Sysuser donde habilitado = 1");Todos los contenidos anteriores pueden ser, y lo siguiente es un poco más complicado según esto.
Si desea pasar el valor usando el método de parámetro en SQL anterior, es decir, escríbelo como habilitado = #{habilitado}, si no ha encontrado tales necesidades, es posible que no entienda por qué debe escribirlo así. Por ejemplo, para implementar una consulta dinámica, puede configurar SQL en primer plano y proporcionar algunas condiciones de consulta para realizar la función de una consulta (por seguridad, estas configuraciones deben desarrollarse o implementarse, y es imposible que los usuarios operen la base de datos directamente).
Para esta característica, es bastante fácil de implementar con MyBatis. La configuración de SQL debe ejecutarse. SQL se puede ejecutar en el método mencionado anteriormente. ¿Cómo proporcionar parámetros? El parámetro es la parte #{habilitado} en habilitado = #{habilitado}. Si hay más condiciones, un SQL configurado es el siguiente:
Seleccione * de Sysuser donde habilitado = #{habilitado} y nombre de usuario como concat ('%', #{username}, '%')En este caso, ¿cómo puedo usar MyBatis para implementarlo?
Primero, el XML se modifica de la siguiente manera:
<select id = "ejecutesql" resultType = "map"> $ {sql} </select>Los métodos en la interfaz se modifican a:
List <Map> Executesql (mapa de mapa);
Luego llame al método:
Map map = new HashMap (); // El SQL aquí corresponde a $ {SQL} map.put ("SQL", "Seleccione * de SysUser"+ "Where Enabled =#{Endabled}"+ "y UserName Like Concat ('%',#{UserNeNeMeName}, '%')"); //# {Enable} MAP.PUT ("ENLEADA", "ENLEADA", "ENLAVIS 1); //#{username} map.put ("username", "admin"); // inserta la lista de llamadas <Map> list = xxmapper.executesql (map); // El método sqlsession llama sqlsession.selectlist ("ejecutesql", map);Con este SQL, puede proporcionar el nombre de usuario habilitado y habilitado como condiciones para el usuario. Obviamente, estas dos condiciones son necesarias. Si es opcional, ¿cómo debo escribirlo?
¿Quizás alguien ha pensado si es posible usar SQL dinámico en mybatis, usar <f> etiquetas, etc.?
Antes de responder a esta pregunta, veamos el código en DynamicsqlSource que maneja Dynamic SQL:
@Override public BoundSQL getBoundSQL (object ParameterObject) {DynamicContext context = new DynamicContext (Configuration, ParameterObject); RootsqlNode.apply (context); SqlSourceBuilder sqlSourceParser = new sqlSourceBuilder (configuración); classeMeMetertypeType = parametreetObject? Object.Class: ParameterObject.getClass (); SQLSource SQLSource = SqlSourceParser.Parse (context.getSql (), Parametertype, context.getBindings ()); BoundSQL Boundsql = SqlSource.getBoundSql (ParameterObject); for (map.entry <string, object> Entry: context.getBindings (). EntrySet ()) {BoundSQL.SetDitionAlParameter (Entry.getKey (), Entry.getValue ());} return BoundSQL;}Cuando MyBatis maneja SQL dinámico, todas las etiquetas SQL dinámicas se procesarán como objetos SQLNode (RootsQLNode aquí), y las que contengan $ {} también se procesarán como objetos TextSQLNode. En las dos primeras líneas del método anterior, es donde MyBatis maneja SQL dinámico.
Por lo tanto, si nuestro contenido en $ {SQL} contiene etiquetas anidadas como $ {} y <if>, <where> y otras etiquetas, cuando myBatis analiza xml a los objetos sqlnode, el elemento xml <select> contiene solo $ {sql}, y solo $ {sql} se parselas. En tiempo de ejecución, esta cadena de parámetros puede contener etiquetas como $ {} y <if>, <where>, etc., pero esto sucede después del análisis de mybatis. Por lo tanto, cuando estos contenidos aparecen como parte de la cadena, no se procesarán especialmente. Son solo parte de SQL, y solo se emiten como es (porque la base de datos no lo reconoce, informará un error) y no se puede procesar. Por lo tanto, no puede escribir SQL dinámico a través del método que viene con MyBatis.
pista
En el código anterior:
SQLSourceParser.Parse (context.getSql (), parametertype, context.getBindings ());
Esta pieza de código maneja los parámetros dinámicos (#{}) después del procesamiento dinámico de SQL, por lo que este tipo de parámetros se puede usar en SQL.
Dado que no puede usar el método SQL dinámico mybatis, ¿cómo implementar SQL dinámico?
Aquí hay una idea simple. Use el lenguaje de marcado de plantilla en SQL para implementar SQL dinámico (como Freemarker). Antes de que SQL se entregue a MyBatis para su ejecución, use plantillas para procesar SQL para generar el SQL ejecutado final (debe evitar el procesamiento de parámetros #{}) y entregar este SQL a MyBatis para su ejecución.
Tome un ejemplo de una plantilla de marca libre, y aún así el SQL anterior se basa en:
Seleccione * de Sysuser donde 1 = 1 <#if habilitado? && username! = ''> y nombre de usuario como concat ('%',#{username}, '%') </#if>Tenga en cuenta que <#if> Aquí es el elemento de Freemarker. Sin considerar la inyección SQL, el SQL anterior también se puede escribir como:
Seleccione * de Sysuser donde 1 = 1 <#if habilitado? && username! = ''> y nombre de usuario como '%$ {username}%' </#if>La diferencia es '%$ {nombre de usuario}%', porque Freemarker también procesará $ {nombre de usuario} y también reemplazará los parámetros aquí con el valor real.
En el código llamado anteriormente, la modificación es la siguiente:
//# ]Enabled ,Map.put("enabled ", 1); //#{username} map.put (" username "," admin "); // El sql aquí corresponde a $ {sql} cadena en xml sql =" uno de los dos sqls complejos arriba "; // usa freemarker para procesar sqlsql = processsqlyfrefrefrefrefre (sqls arriba"; MAP); // Ponga el SQL procesado en el mapa map.put ("sql", "seleccione * de sysuser"+ "donde habilitado = #{habilitado}"+ "y userName Like concat ('%', #{username}, '%')"); // ejecutar métodos list <s map> list = xxmapper.Executesql (map);Nota: El método ProcessSqlByFreemarker es procesar las cadenas SQL en función de los datos en el mapa, y el método de implementación puede ser buscado por usted mismo.
En este punto, se implementa una función dinámica de SQL que no es muy complicada.
Me pregunto si hay más personas codiciosas. ¿Crees que los valores devueltos anteriores son todos los tipos de lista <s map>? ¿Puedes devolver una clase de entidad que especifiqué?
Por ejemplo en el mapa:
map.put ("class", "tk.mybatis.model.sysuser");¿Puedo hacer que el valor de retorno se convierta en tipo sysuser de esta manera? Dado que este artículo ha tomado demasiado tiempo, proporcionaré una solución aquí, no en profundidad.
Puede usar un interceptor para implementarlo. Después de obtener el MappedStatement, copie una copia y luego modifique el atributo de tipo de ResultMap en ResultMaps para especificar el tipo de clase para usted. Es fácil de decir, pero en la operación real, puede tener aproximadamente 1/10 del complemento PageHelper Paging.
Debido a que este artículo fue escrito a pedido de mi esposa, si mi esposa tiene esta última necesidad, ayudaré a mi esposa a implementar este complemento y luego compartirlo.
Nota: Si se trata de una declaración dinámica de actualización, insertar, eliminar, puede cambiar el anterior <select> a actualizar (no es necesario usar <Elelete> y <sert>), y usar int para el valor de retorno, que es mucho más fácil que seleccionar.
Lo anterior es una explicación detallada de la declaración SQL dinámica de ejecución de MyBatis presentada por el editor. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!