MyBatis es un marco de capa duradero muy popular en la industria. Es liviano y fácil de usar. Está completamente liderando en el campo financiero de TI. Es más popular que Hibernate, con muchas ventajas y también vale la pena aprender. Pero MyBatis no es perfecto, y su propio diseño y codificación todavía tienen muchas deficiencias, incluso defectos. Este artículo analiza brevemente estos defectos:
1.Mybatis usa DTD como archivo de verificación para archivos de configuración XML, pero es obvio que DTD es casi una tecnología borrada. Tiene funciones muy limitadas, muy pobre escalabilidad, muy pobre escalabilidad, muy pobre escalabilidad y mala legibilidad. La primavera puede pasar magníficamente de DTD a XSD, pero MyBatis nunca ha tenido este coraje.
2. Si la compatibilidad de la versión no se hace bien, tome 3.3.0‐> 3.4.0 como ejemplo. De acuerdo con las especificaciones generales de la industria, el número de versión de segundo nivel se puede actualizar y se pueden agregar funciones, pero se debe garantizar la compatibilidad con atraso. Sin embargo, el enfoque de MyBatis no es exactamente así. Eche un vistazo al método clave de DeclaryHandler para preparar:
// 3.3.0statement Prepare (conexión de conexión) arroja SQLException; // 3.4.0Statement Prepare (conexión de conexión, Integer TransactionTimeOut) arroja SQLException;
No hay ningún método agregado aquí, ¡pero se agrega un parámetro directamente al método original! Hay muchos ejemplos similares, por lo que no los enumeraré uno por uno.
3. El complemento MyBatis utiliza una interfaz de interceptor general, acompañado de anotaciones como @Intercepts y @Signature para implementar múltiples métodos de intercepción de múltiples componentes. Parece muy flexible. En mi opinión, la estructura en realidad no es lo suficientemente clara. Durante el desarrollo real, ¿colocará la mejora de la intercepción de DeclaryHandler y los resultados de los resultados en una clase? ¿No es correcto (sí? ¿Eres el principio de responsabilidad única y el principio de apertura y cierre de mierda?), Entonces, ¿por qué es necesario forzar la misma interfaz?
Además, use la anotación @Signature para especificar los métodos de componentes que deben interceptarse. Si la anotación es incorrecta, la compilación no informará un error. Solo puedes esperar hasta que se ejecute para descubrirlo. Echemos un vistazo al ejemplo anterior:
Supongamos que implementé un complemento para la versión 3.3.0:
@Intercepts ({@Signature (type = DeclaryHandler.class, método = "Preparar", args = {Connection.Class})}) Class pública DeclarationLerInterceptore implementa el interceptor {@OverridePublic Intercept (Invocation Invocation) lanza Showable {return Invocation.ProEcE ();}@ovúblo de objeto de objeto (objetivo de objeto) {Target de retorno pliegue de retorno esto);}@overridePublic void setProperties (propiedades de propiedades) {}}Luego, se actualizó a 3.4.0. Como resultado, la compilación fue normal, pero cuando se ejecutó, se lanzó una excepción.
4. El caché de MyBatis es simplemente inútil, e independientemente de si hay una configuración, es necesario usar el caché o actualizar el caché, es necesario calcular la CacheKey. Si no hay caché o actualización del caché, este cálculo es un desperdicio.
5. Para la ejecución por lotes de MyBatis, vea el siguiente ejemplo de JDBC:
public void testjdbcbatch (conexión conn) lanza la excepción {try {conn.setAutOcommit (false); batchUpdate (conn); clearTestData (conn); conn.commit (); conn.setAutOcommit (true);} Catch (Exception e) {conn.rollback (); showe e; {Preparado Ps = null; try {ps = conn.prepareStatement ("Eliminar table_name1 donde field_name1 =?"); Ps.setString (1, "test"); int d = ps.ExecuteUpDate (); system.out.println ("delete counts:" + d); e) {}}} private void batchUpdate (Connection Conn) lanza SQLException {PrepareStatement ps = null; try {string sql = "insertar en table_name2 (field_name1, field_name2, field_name2) valores (?,?,?)"; ps = conn.preparestatemement (sql); for (int (int i = 0; i = 0; i) Random = RandomStringUtils.Randomalphabetic (8); Ps.SetString (1, "Test"); // field_name1ps.setString (2, "Data" + Random); // field_name2ps.setstring (3, "Parámetro" + aleatorio); // field_name3ps.addbatch ();} int [] rs = ps.exeC Finalmente {try {ps.close ();} capt (excepción e) {}}}El código no tiene sentido de incongruencia, puede ejecutarse normalmente y también puede retroceder como se esperaba. Es decir, la misma conexión en la misma transacción puede ejecutar SQL y lotes ordinarios al mismo tiempo, pero lo intenta en la SQLSession de la misma transacción, y lo que le responde es que no puede cambiar el método de ejecución en la misma transacción.
6. Compatibilidad de los productos de la base de datos: MyBatis entregó el control de SQL a los desarrolladores, por lo que ocupó moralmente las alturas dominantes: lo que escribió es incompatible, ¡ese es su propio nivel! ¿Pero es esta la pose correcta para un marco realmente bueno? ¿Por qué no se puede proporcionar alguna implementación compatible auxiliar? Por ejemplo, si la función de decodificación, que se considera un dios en Oracle, ¿se puede proporcionar con una etiqueta <secode> en SQLMapper y modificada silenciosamente en caso cuando más tarde? En otras palabras, no importa si el funcionario no lo proporciona, pero debe proporcionar un método de expansión, por lo que vuelvo a: la escalabilidad es muy pobre, la escalabilidad es muy pobre y la escalabilidad es muy pobre. Dije las cosas importantes tres veces, pero las he dicho seis veces.
Lo anterior son los defectos de MyBatis presentados por el editor. ¡Espero que te sea útil!