Mybatis - очень популярная рамка длительного уровня в отрасли. Он легкий и простой в использовании. Это полностью лидирует в финансовой сфере ИТ. Он более популярен, чем Hibernate, со многими преимуществами, а также стоит учиться. Но Mybatis не идеален, и его собственный дизайн и кодирование все еще имеют много недостатков, даже дефектов. В этой статье кратко обсуждаются эти дефекты:
1.mybatis использует DTD в качестве файла проверки для файлов конфигурации XML, но очевидно, что DTD является практически стиральной технологией. Он имеет очень ограниченные функции, очень плохая масштабируемость, очень плохая масштабируемость, очень плохая масштабируемость и плохая читаемость. Весна может великолепно превратиться от DTD до XSD, но у Mybatis никогда не было такой смелости.
2. Если совместимость версии не сделана хорошо, возьмите 3.3.0 -> 3.4.0 в качестве примера. Согласно общим спецификациям отрасли, номер версии второго уровня может быть обновлен, и функции могут быть добавлены, но должна быть обеспечена обратная совместимость. Однако подход Mybatis не совсем такой. Взгляните на ключевой метод заявления, чтобы подготовить:
// 3.3.0Statement Подготовка (подключение к соединению) Throws SQLEXCEPTION; // 3.4.0Statement Prepare (соединение соединения, целочисленное транзакция) бросает sqlexception;
Здесь нет метода, но параметр добавляется непосредственно к исходному методу! Есть много подобных примеров, поэтому я не буду перечислять их один за другим.
3. Плагин Mybatis использует общий интерфейс Interceptor, сопровождаемый такими аннотациями, как @Intercepts и @Signature, для реализации нескольких методов перехвата нескольких компонентов. Это кажется очень гибким. На мой взгляд, структура на самом деле недостаточно ясна. Во время фактической разработки вы поместите улучшение перехвата заявления и результатов и результатов в одном классе? Разве это не правильно (да? Вы единоличный принцип ответственности и принцип открытия и закрытия - все это дерьмо?), Так почему же необходимо навязать один и тот же интерфейс?
Кроме того, используйте аннотацию @Signature, чтобы указать методы компонентов, которые необходимо перехватить. Если аннотация неверна, компиляция не сообщит об ошибке. Вы можете только подождать, пока он не будет запустить, чтобы обнаружить это. Давайте посмотрим на приведенный выше пример:
Предположим, я реализовал плагин для версии 3.3.0:
@Intercepts ({@Signature (type = antachthandler.class, method = "prepare", args = {connection.class})}) public class ratement handlerinterceptor реализует Interceptor {@OverridePublic Object Intercept (vocation vocato это);}@overridepublic void setProperties (свойства свойств) {}}Затем он был обновлен до 3.4.0. В результате компиляция была нормальной, но когда он был запущен, было брошено исключение.
4. Кэш Mybatis просто бесполезен, и независимо от того, существует ли конфигурация, необходимо использовать кэш или обновить кэш, необходимо вычислить кэш -ключ. Если нет кеша или обновления кэша, этот расчет является отходом.
5. Для получения партии Mybatis см. В следующем примере JDBC:
public void testjdbcbatch (connect conn conn) throws exception {try {conn.setautocommit (false); batchupdate (conn); cleartestdata (conn); conn.commit (); conn.setautocommit (true);} catch (Exception e) {conn.rollback (); thress e;} private void void void e) {Подготовлено ps = null; try {ps = conn.prepareStatement ("delete table_name1, где field_name1 =?"); e) {}}} private void batchupdate (соединение Conn) Throws SQLexception {подготовленное значение ps = null; try {string sql = "Вставка в table_name2 (field_name1, field_name2, field_name2) значения (?,?,?)"; i ++) {string random = randomStringUtils.randomalphabetic (8); ps.setString (1, "test"); // field_name1ps.setString (2, "data" + random); // field_name2ps.setString (3, "parameter" + random); // field_name3pss.addbatch ();] randme); ps.executebatch ();} наконец {try {ps.close ();} catch (Exception e) {}}}Код не имеет чувства несоответствия, может нормально выполнять, а также может откатиться, как и ожидалось. То есть одно и то же соединение в той же транзакции может одновременно запускать обыкновенные SQL и партия, но вы пробуете его в SQLSession той же транзакции, и вы отзыв вам, что вы не можете переключить метод выполнения в той же транзакции!
6. Совместимость продуктов базы данных: Mybatis передал контроль SQL разработчикам, поэтому он морально занимал командные высоты - то, что вы написали, несовместимо, это ваш собственный уровень! Но является ли это правильной позой для действительно хорошей кадры? Почему нельзя предоставить какую -то вспомогательную совместимую реализацию? Например, если функция декодирования, которая рассматривается как бог в Oracle, может ли она быть предоставлена тегом <decode> в SQLMapper и молча модифицирован в случае, когда позже? Другими словами, не имеет значения, если чиновник не предоставляет его, но вы должны предоставить метод расширения, поэтому я возвращаюсь к: масштабируемость очень плохая, масштабируемость очень плохая, а масштабируемость очень плохая. Я говорил важные вещи три раза, но я говорил их шесть раз.
Вышеуказанное - дефекты Mybatis, представленные вам редактором. Я надеюсь, что это будет полезно для вас!