MyBatis или JPA? Наконец-то получил ответ!

Java

Оригинал: Ape Logic, добро пожаловать, пожалуйста, сохраните источник для перепечатки.

Программист, работающий с базами данных, вскоре может оказаться перед трудным выбором. Это выборMyBatisвсе ещеJPAШерстяная ткань?

Многие говорят, что выбор техники должен основываться на спросе, и это правда. Однако помимо востребованности есть еще очень важное звено — уровень товарищей по команде. Если вы выберете какую-то более продвинутую технологию, то закопаете дыру для всей команды.

JPA имеет более высокий уровень абстракции, и код писать проще, но совсем не просто. Несмотря на много тренировок, несколько команд, в которых я был, все еще используют его как дерьмо.

Я выбросил JPA

Я тщательно все обдумал, есть следующие причины, из-за которых JPA вообще не могла играть во многих командах.

  1. JPA подходит для сценариев с фиксированными бизнес-моделями и относительно стабильными требованиями. Тем не менее, стиль внутреннего спроса в три раза и четыре раза, а также дизайн типа микрофона менеджера по продукту вызвали поток спроса и неопределенности. JPA в этом режиме шлак.
  2. Технические требования JPA относительно высоки. Не сомневайтесь, вам может показаться, что это очень просто, когда вы впервые начнете его использовать. Но по мере дальнейшего использования вы обнаружите, что это катастрофа. Различные преобразования и кэши внутри вызовут у людей головокружение. И большинство программистов быстрого питания не хотят этого знать.
  3. Многие программисты очень хорошо умеют писать SQL, поэтому многие операторы SQL очень толстые и длинные. Бизнес хаотичен, несколько таблиц связаны, и я даже видел сложные бизнесы, связанные с сотнями бизнес-таблиц. В отчаянии администраторы баз данных обычно проводят аудиты sql. JPA занимается аудитом sql? Еще чуть слабее.

Поэтому дело не в том, что JPA плохая, а в том, что она не соответствует национальным условиям. Если вы хотите внедрить JPA в компании, вам нужно дать мне стабильную продуктовую команду и отличную техническую команду.

Поэтому большинство компаний скорее предпочтут написать кучу повторяющегося и запутанного кода Mybaits, чем легко попробовать JPA, что логично и соответствует закону развития.

Поэтому в нашей следующей статье мы обсудим MyBatis и посмотрим, как элегантно написать Mybaits.

Почему не работает MyBatis?

Хорошие программисты ленивы. Так много людей не хотят разрабатывать sql для сущностей. JPA может напрямую генерировать таблицу библиотеки sql на основе кода объекта Java, что очень завидно тем, кто использует Mybatis.

С MyBatis сделайте это вверх ногами. Сначала вам нужно спроектировать библиотечную таблицу, а затем обратно сгенерировать кучу кода Java и файлов конфигурации в соответствии с библиотечной таблицей.

Этот генератор кодаmybatis-generator.

Однако будьте осторожны. Код, сгенерированный этим генератором, имеет四种модель! ! ! Это самое неудобное место для новичков. Если вы новичок в MyBatis, настоятельно рекомендуется сосредоточиться только на первом режиме ниже.

  • MyBatis3Этот режим является нашим часто используемым методом, который будет генерировать классы предметной области, классы примеров, файлы отображения карт и т. д. Генерируемая им информация является многословной, а ее содержание почти невозможно изменить. Для sql, написанного вами в проекте, он вообще пишется вручную вместо изменения исходного файла.
  • MyBatis3SimpleВ простом шаблоне генерации кода из приведенного выше шаблона чего-то не хватает, но он очень лаконичен. Нет опыта работы с MyBatis и его использование не рекомендуется.
  • MyBatis3DynamicSqlЭто функция динамического SQL, реализованная в режиме Builder, и вам также необходимо добавить дополнительные пакеты jar. После его добавления он фактически чем-то похож на JPA. В таком случае, почему бы просто не использовать JPA напрямую? Поэтому, несмотря на то, что этот DSQL является поведением генерации по умолчанию, крайне не рекомендуется.
  • MyBatis3KotlinЭто не чепуха. Это нужно для создания некоторой информации о конфигурации и коде для версии Kotlin.

Поэтому нижеследующее только вводитMyBatis3Генерация кода для схемы.

Чтобы использовать его, вам нужно добавить его зависимости в pom.xml.

<dependency>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-core</artifactId>
    <optional>true</optional>
    <scope>test</scope>
    <version>1.4.0</version>
</dependency>

Лично мне нравится использовать код Java для управления процессом генерации кода, поэтому вот код, который генерирует код.

public class MBGTool {
    public static void main(String[] args) throws Exception {
        List<String> warnings = new ArrayList<>();
        boolean overwrite = true;
        InputStream configFile = MBGTool.class.getResourceAsStream("/generator/generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }
}

Из кода видно, что нам нужно настроитьgeneratorConfig.xmlфайл, который указывает, как создавать файлы кода.

<!DOCTYPE generatorConfiguration PUBLIC
        "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
    <context id="simple" targetRuntime="MyBatis3">
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/mbye"
                        userId="root"
                        password="root"
        />
        <javaModelGenerator targetPackage="com.github.javarunfast.mbye.domain" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <sqlMapGenerator targetPackage="com.github.javarunfast.mbye.mapper" targetProject="src/main/resources"/>
        <javaClientGenerator  type="XMLMAPPER"  targetPackage="com.github.javarunfast.mbye.mapper" targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <table tableName="test"/>
    </context>
</generatorConfiguration>

управлять нашимMBGToolПосле файла вы можете сгенерировать код MyBatis.

Как написать самый элегантный код

Однако я здесь не для того, чтобы рекомендовать вам использовать этот режим. Потому что он генерирует кучу бесполезных файлов. Если в вашем проекте используется инструмент проверки качества кода, такой как сонар, вы обнаружите много красных пятен и ужасную проблему покрытия.

что делать?

После многих лет нащупывания я теперь рекомендую очень полезный способ письма. Он не изменился с тех пор, как я принял его таким образом.

Во-первых, не нужен генератор кода

Дизайн таблицы данных, а также написание домена — все вручную. Таким образом, наш код при необходимости можно будет перенести на JPA. В этом режиме также можно узнать, как типы данных в Java однозначно соответствуют типам данных в SQL. Между прочим, занимаясь дизайном стола, вы можете понять некоторые принципы, лежащие в его основе.

Во-вторых, нет необходимости писать файл сопоставления

Вещи, сгенерированные генератором, действительно представляют собой кучу бесполезной логики. Например, для определенной моей таблицы данных не нужно предоставлять такие действия, как запросить все и удалить, она по-прежнему предоставляется по умолчанию.

В этом простом режиме мы напрямую пишем файл Mapper, а затем только объявляем необходимые методы интерфейса.

@Mapper
public interface AccountBasicMapper {
    @Insert("AccountBasicMapper/insert.sql")
    void insert(@Param("r") AccountBasic record);
}

Как видите, в нем есть аннотация Insert, мы переходим в конкретный домен, и тогда мы можемAccountBasicMapperв каталогеinsert.sqlВ файле напишите конкретные операторы sql.

Пример инструкции sql выглядит следующим образом:

INSERT INTO account_basic(
    account_id,
    nick_name,
    password,
    sex,
    state,
    photo_url,
    created,
    modified,
    version
)VALUES (
    <@p name="r.accountId"/>,
    <@p name="r.nickName"/>,
    <@p name="r.password"/>,
    <@p name="r.sex"/>,
    <@p name="r.state"/>,
    <@p name="r.photoUrl"/>,
    <@p name="r.created"/>,
    <@p name="r.modified"/>,
    <@p name="r.version"/>
)

Итак, что это за синтаксис? Откуда он знает, что он настроен таким образом? Это требует введения функции конфигурации языка сценариев MyBatis. Здесь мы используемfreemarkшаблон.

Не забудьте добавить его зависимости.

<dependency>
	<groupId>org.mybatis.scripting</groupId>
	<artifactId>mybatis-freemarker</artifactId>
    <version>1.2.2</version>
</dependency>

Затем сделайте соответствующую настройку в файле yaml, и все в порядке.

mybatis:
  check_config_location: false
  scripting-language-driver:
    freemarker:
      template-file:
        base-dir: mappers/
      path-provider:
        includes-package-path: false
        separate-directory-per-mapper: false

Плюсы и минусы этого подхода

Мне лично эта модель очень нравится. Потому что он имеет следующие преимущества:

  1. Чем писать, меньше кода, лаконично и элегантно.
  2. SQL централизован, а не разбросан по коду, XML или аннотациям. Администратору баз данных удобно проводить аудит SQL. Поскольку XML не мешает, SQL более лаконичен.
  3. Один метод DAO, один файл sql и один управляемый режим.
  4. Функциональные преимущества MyBatis могут быть полностью использованы и легко интегрированы.

Конечно, недостатки тоже очевидны.

  1. Даже если параметр изменен, многие файлы sql должны быть изменены.
  2. Вам нужен файл sql для каждого метода, даже если это умственно отсталый метод запроса на вставку.

Однако я не думаю, что это проблема. Каждый метод снабжен sql-файлом, что упрощает написание кода. При возникновении проблемы нет необходимости отслеживать и находить объединенный оператор SQL в соответствии с логикой. Теперь мне нужно только получить файл SQL соответствующего метода, я могу изменить его и выполнить отладку прямо в терминале sql. Таким образом, оптимизация sql также стала простой.

Конечно, это привычка каждого человека. Мне лично нравится эта модель, я применил ее в своей команде и обнаружил, что она хорошо работает. Кроме того, чтобы писать менее повторяющийся код SQL, программисты более серьезно подходят к разработке интерфейса Dao.

Это может быть дополнительным бонусом.