Introducción: ¿Qué es mybatis?
(Anteriormente Ibatis) mybatis es un marco de la capa de persistencia que puede personalizar SQL, procedimientos almacenados y asignaciones avanzadas. MyBatis elimina la configuración manual de casi todos los códigos y parámetros JDBC y la recuperación del conjunto de resultados. MyBatis puede usar XML o anotaciones simples para la configuración y mapeo original, mapeo de interfaces y Pojos de Java (objetos Java Old Old) en los registros en la base de datos.
1. El parámetro de la capa mapeador es MAP, y la capa de servicio es responsable de sobrecargar.
Debido a problemas de mecanismo, el mapa no se puede sobrecargar. Los parámetros generalmente se configuran para mapear, pero esto hará que los parámetros sean borrosos. Si desea que el código sea claro, puede lograr el propósito de sobrecargar a través de la capa de servicio. La capa de servicio proporcionada al exterior está sobrecargada, pero estos métodos de servicio sobrecargados son en realidad sintonizar el mismo mapeador, pero los parámetros correspondientes no son consistentes.
Tal vez algunas personas se preguntan, ¿por qué no establecerlo para mapear en la capa de servicio? Personalmente no recomiendo esto. Aunque he adoptado este método en mis proyectos anteriores por conveniencia, obviamente causará problemas para futuros trabajos de mantenimiento. Porque hacer esto hará que todo su MVC confíe en el modelo de mapa. Este modelo es en realidad muy bueno y conveniente para construir un marco, pero hay un problema: solo mirando la firma del método, no sabe el número, el tipo y el significado de cada parámetro representado por el mapa.
Imagínense, si solo cambia la capa de servicio o la capa DAO, debe estar claro sobre los parámetros pasados por el mapa en todo el proceso. A menos que comente o tenga buena documentación, debe comprender el código de cada capa claramente antes de saber qué parámetros se pasan. Para MVC simple, está bien, pero si el nivel es complejo, el código se volverá extremadamente complejo, y si agrego un parámetro, necesito agregar los comentarios para cada capa. En comparación con los comentarios, es más factible usar firmas de métodos para garantizar la capacidad de control de este código, porque los comentarios pueden estar desactualizados, pero es poco probable que las firmas de métodos estén obsesionadas.
2. Intente usar si la elección y otras declaraciones lo menos posible para reducir la dificultad de mantenimiento.
Al configurar SQL en MyBatis, intente usar menos etiquetas como si elija. Si se puede usar SQL para determinar el juicio, intente usar SQL (caso cuando, decodifique, etc.) para un mantenimiento posterior. De lo contrario, una vez que SQL se hincha, es súper náuseas. Si necesita depurar SQL en MyBatis, debe eliminar una gran cantidad de declaraciones de juicio, lo cual es muy problemático. Por otro lado, una gran cantidad de juicios si el SQL generado contiene una gran cantidad de espacios, lo que aumentará el tiempo de transmisión de la red, lo que tampoco es deseable.
Además, una gran cantidad de declaraciones si eligen, inevitablemente, el SQL generado será inconsistente cada vez, lo que conducirá a una gran cantidad de análisis duro de Oracle, lo que tampoco es aconsejable.
Echemos un vistazo a SQL como este:
<Code style = "Padding: 0.5em; Margin: 0px; Display: Block; Color: RGB (101,123,131); Overflow-X: Auto; Background: RGB (253,246,227)"> <span style = "almohadilla: 0px; margen: 0px"> <span style = "almohadilla: 0px; margen: 0px; Color: RGB (133,153,0) "> Seleccionar </span> * <span style =" relleno: 0px; style = "relleno: 0px; margen: 0px; color: rgb (42,161,152)"> 1 </span> = <span style = "relleno: 0px; margen: 0px; color: rgb (42,161,152)"> 1 </span> <<span style = "padding: 0px; margen: 0px; Color: RGB (133,153,0) "> 1 </span> <<span style =" relleno: 0px; style = "Padding: 0px; Margin: 0px; Color: RGB (42,161,152)"> "StartDate! = Null and StartDate! = '' y EndDate! = Null and Endate! = ''" </span> <span style = "remo: 0px; margen: 0px; color: rgb (133,153,15)" #{startDate} <span style = "relleno: 0px; margen: 0px; Color: RGB (133,153,0) "> y </span> publishtime <= #{enddate} </ <span style =" relleno: 0px; margen: 0px; Color: RGB (133,153,0) "> if </span> <lo contrario> <span style =" relleno: 0px; margen: 0px; Color: RGB (133,153,0) "> y </span> publishtime> = <span style =" relly: 0px; margen: 0px; Color: RGB (133,153,0) "> Sysdate </span> - <span style =" relleno: 0px; margen: 0px; Color: RGB (42,161,152) "> 7 </span> <span style =" relleno: 0px; margen: 0px; Color: RGB (133,153,0) "> y </span> publishtime <= <span style =" relly: 0px; margen: 0px; Color: RGB (133,153,0) "> Sysdate </span> </SOTRO> </<span style =" Padding: 0px; margen: 0px; Color: RGB (133,153,0) "> Sysdate </span> </SOTRO> </<span style =" Padding: 0px; margen: 0px; Color: RGB (133,153,0) "> Elija </span>> </span>Tal si el juicio es realmente completamente innecesario. Simplemente podemos usar Decode para resolver el problema de valor predeterminado:
<Code style = "Padding: 0.5em; Margin: 0px; Display: Block; Color: RGB (101,123,131); Overflow-X: Auto; Background: RGB (253,246,227)"> <span style = "almohadilla: 0px; margen: 0px"> <span style = "almohadilla: 0px; margen: 0px; Color: RGB (133,153,0) "> Seleccionar </span> * <span style =" relleno: 0px; <span style = "relled: 0px; margen: 0px; color: rgb (133,153,0)"> decode </span> (#{startDate}, <span style = "padding: 0px; margen: 0px"> null </span>, <span style = "padding: 0px; margin: 0px; Color: RGB (133,153,0) "> Sysdate </span>-<span style =" relleno: 0px; Color: RGB (133,153,0) "> y </span> publishtime <= <span style =" relleno: 0px; margin: 0px; margen: 0px "> nulo </span>, <span style =" relleno: 0px; margen: 0px; margen: 0px; Color: RGB (133,153,0) "> Sysdate </span>,#{EndDate}) </span> </code>Por supuesto, algunas personas pueden pensar que la introducción de casos cuándo y decode requerirán un análisis de la función Oracle, lo que ralentizará el tiempo de ejecución de SQL. Los estudiantes interesados pueden regresar y hacer un examen para ver si habrá un gran impacto. En lo que respecta a la experiencia personal, no encontré ninguna desaceleración en SQL debido al análisis de la función. En general, operaciones como unión, orden por, distinta, participación por, etc., que generalmente están estrechamente relacionadas con el diseño de la estructura de la tabla. En comparación con el grado de impacto de la eficiencia de estos, el impacto del análisis de la función en la velocidad de ejecución de SQL debería ser insignificante.
Otro punto es que para algunas asignaciones de valor predeterminadas, como el SQL anterior, el valor predeterminado a la fecha actual, etc., puede mencionar completamente la capa de servicio o la capa del controlador para su procesamiento. Estos juicios deben usarse menos en mybatis. Porque, en este caso, es difícil almacenar en caché el procesamiento. Si StartDate está vacío y usa un sistema dinámico en SQL, es imposible determinar cuál debería ser la clave de la fecha de inicio de la Dicatamiento de caché. Por lo tanto, es mejor manejar los parámetros antes de pasar a MyBatis, de modo que la capa mybatis también pueda reducir algunas si elige declaraciones, y también es conveniente para el procesamiento de caché.
Por supuesto, no es absoluto no usar si elige. A veces, para optimizar SQL, si tiene que resolverse, como declaraciones similares. Por supuesto, como generalmente no se recomienda. Sin embargo, si hay escenarios de uso, elimine como cuando no necesite usarlo, como consultar el título del artículo para mejorar la eficiencia de la consulta. La mejor manera es usar motores de búsqueda como Lucence para resolver este problema de indexación de texto completo.
En general, si y elegir juzgar la rama es imposible de eliminar por completo, pero se recomienda utilizar el método nativo de SQL para resolver algunos problemas dinámicos, en lugar de depender completamente de MyBatis para completar el juicio de las ramas dinámicas, porque la rama del juicio es demasiado compleja y difícil de mantener.
3. Reemplace los comentarios de SQL con comentarios XML.
Trate de no retener los comentarios de MyBatis Central SQL. Los comentarios causarán algunos problemas. Si necesita usar comentarios, puede usar <!--> en XML para anotar para asegurarse de que no habrá anotaciones SQL en el SQL generado, reduciendo así la posibilidad de problemas. Otra ventaja de hacer esto es que puede distinguir claramente las anotaciones de SQL en el IDE.
Ahora hablemos de los problemas causados por los comentarios. En un proyecto en el que estoy trabajando, el componente de paginación se basa en mybatis. Ponerá otra capa de ROWN (*) ROWNUM_ de (......) fuera del script SQL que escribió para calcular el número total de registros. Al mismo tiempo, hay otra selección anidada * de (...) donde Rownum> 10 y Ronnum <10 * 2 generan información de paginación. Si hay un comentario sobre la última línea en su guión, la parte adicional se convertirá en parte del comentario y se informará un error. Además, algunas condiciones también pueden hacer que algunas condiciones se ignoren, como las siguientes:
<código estilo = "relleno: 0.5em; margen: 0px; pantalla: bloque; color: rgb (101,123,131); overflow-x: auto; fondo: rgb (253,246,227)"> <span style = "almoh style = "relleno: 0px; margen: 0px; color: rgb (133,153,0)"> de </span> test <span style = "relly: 0px; margin: 0px; color: rgb (133,153,0)"> donde </span> col1> <span style = "padding: 0px; margen: 0px; Color: RGB (42,161,152) "> 1 </span> - Aquí está el comentario << span style =" relleno: 0px; a! = '' "</span >> <span style =" relleno: 0px; '' "</span >> <span style =" relleno: 0px; margen: 0px "> if </span >> </span> </code>
Incluso si hay parámetros correspondientes en los parámetros aprobados, no habrá ningún efecto, porque el siguiente contenido en realidad se comenta completamente. Este tipo de error es difícil de detectar sin pruebas rigurosas. En términos generales, los comentarios de XML pueden reemplazar completamente los comentarios de SQL, por lo que este comportamiento debe estar prohibido.
4. Use #{} siempre que sea posible, no $ {}.
Intenta no usar $ {} en mybatis. Es muy conveniente hacer esto. Sin embargo, existe el problema de que una gran cantidad de uso causará un análisis difícil de Oracle, ralentizando el rendimiento de la base de datos. Cuanto más tiempo será el rendimiento de la base de datos, peor será el rendimiento de la base de datos. Para el procesamiento general de múltiples string INS, puede consultar la siguiente solución: http://www.myexception.cn/sql/849573.html, que básicamente puede resolver la mayoría de los $ {}.
Con respecto a $ {}, otro uso indebido es como. Tengo otro caso aquí: por ejemplo, algunos menús de los árboles, los nodos se diseñarán como '01', '0101' y los nodos de dos bits se usan para distinguir las jerarquías. En este momento, si necesita consultar todos los nodos en el nodo 01, el SQL más simple es: Seleccionar * del árbol donde ID me gusta '01%'. Este tipo de SQL es realmente comprensible, ya que también puede usar índices, por lo que no requiere un procesamiento especial, solo úselo directamente. Pero si es el título del artículo, debe prestar atención adicional: seleccione * de t_news_text donde el título como '%OSC%', esta no es una forma de usar la indexación. Como se mencionó anteriormente, es mejor usar la búsqueda de texto completo. Pero si no puede prescindir de un gusto, debe prestar atención al método de uso: ID como #{id} || '%' en lugar de ID como '$ {id}%' para reducir la posibilidad de un análisis duro.
Algunas personas piensan que usar || Aumentará el tiempo para el procesamiento de Oracle. Creo que no tomes a Oracle demasiado estúpido. Aunque a veces es realmente estúpido, puedes resumir la estúpida y no la basura cuando tengas tiempo, pero después de una pequeña prueba, sabrás que este método de conexión debería ser muy delgado para el análisis y la ejecución de todo el SQL.
Por supuesto, hay algunos casos especiales que no se pueden manejar, como la inyección dinámica de nombres de columnas, nombres de mesa, etc. Para estas situaciones, es difícil y no se encuentran medios más convenientes. Dado que es menos probable que esta situación ocurra, usar $ {} no tendrá ningún gran impacto. Por supuesto, si tiene una morbilidad de código, puede usar el mecanismo de ejecución de SQL dinámico de Oracle, ejecute de inmediato, para que pueda evitar completamente la posibilidad de $ {}. Esto introducirá modelos más complejos, y en este momento, debe tomar decisiones.
En respuesta a los problemas causados por el SQL dinámico anterior, la forma más radical es usar procedimientos almacenados y resolverlos en una forma nativa de datos de datos para facilitar el desarrollo y la depuración. Por supuesto, también traerá problemas: habrá requisitos más altos para los desarrolladores, la gestión de los procedimientos almacenados, etc. Mi proyecto no ha adoptado este método, por lo que no me expandiré más aquí.
5. Uso simple de mybatis.
La función de MyBatis es relativamente débil, y carece de muchas bibliotecas auxiliares necesarias, procesamiento de cadenas, etc., y también es difícil de expandir, por lo que generalmente es posible procesar algunos retornos. Por lo tanto, es mejor usarlo como un archivo de configuración SQL simple y un marco ORM simple. No intentes hacer demasiado SQL dinámico en MyBatis, de lo contrario, hará que el mantenimiento posterior sea muy desagradable.
Lo anterior es el resumen de aprendizaje mybatis que el editor le presentó. 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!