Легко добавляйте, удаляйте и изменяйте - Введение и использование MyBatis Universal Mapper

задняя часть база данных MyBatis SQL

предисловие

Большинство разработчиков, использующих MyBatis, столкнутся с проблемой, т. е. им приходится записывать в xml файл большое количество SQL.Помимо специальной бизнес-логики SQL, имеется также большое количество добавлений, удалений, модификаций. и запросить SQL с аналогичной структурой. Более того, при изменении структуры таблицы базы данных необходимо изменить все соответствующие классы SQL и сущностей. Влияние этой рабочей нагрузки и эффективности может быть барьером, который отличает программистов CRUD от настоящих программистов. В это время появился Universal Mapper...

Что такое универсальный картограф

Universal Mapper — это подключаемый модуль, основанный на Mybatis, для добавления, удаления и изменения отдельных таблиц. Разработчикам не нужно писать SQL или добавлять методы в DAO, пока они пишут классы сущностей, они могут поддерживать соответствующие методы добавления, удаления, модификации и запросов.

как пользоваться

Возьмем MySQL в качестве примера, предположим, что есть такая таблица:

CREATE TABLE `test_table` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT '',
  `create_time` datetime DEFAULT NULL,
  `create_user_id` varchar(32) DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  `update_user_id` varchar(32) DEFAULT NULL,
  `is_delete` int(8) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

первичный ключid, самовозрастающая. Далее эта таблица используется в качестве примера для ознакомления с тем, как использовать общий преобразователь.

Зависимости Maven

<!-- 通用Mapper -->
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper</artifactId>
    <version>3.3.9</version>
</dependency>

Конфигурация SpringMVC

<!-- 通用 Mapper -->
<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="cn.com.bluemoon.bd.service.spider.dao"/>
    <property name="properties">
        <value>
            mappers=tk.mybatis.mapper.common.Mapper
        </value>
    </property>
</bean>

Обратите внимание на использованиеtk.mybatis.spring.mapper.MapperScannerConfigureЗамените оригинальный Mybatisorg.mybatis.spring.mapper.MapperScannerConfigurer.

Введение настраиваемых параметров:

  • UUID: Установить метод генерации UUID, который нужно настроить в режиме OGNL, не ограничивает возвращаемое значение, но должен соответствовать типу поля
  • IDENTITY: получить первичный ключ, содержимое может настроить внешний вид презентации о том, как использовать
  • ORDER:<seletKey>Атрибут порядка в , необязательные значения: ДО и ПОСЛЕ
  • catalog: Каталог базы данных. Если установлено это значение, имя таблицы будет иметь префикс с параметром каталога при запросе.
  • schema: То же, что и каталог, каталог имеет приоритет над схемой.
  • seqFormat: Правило получения последовательности, используйте параметр формата {num}, значение по умолчанию — {0}.nextval, для Oracle всего имеется 4 необязательных параметра, соответствующих 0, 1, 2, 3: SequenceName, ColumnName , PropertyName, TableName соответственно
  • notEmpty: При вставке и обновлении, будет ли использоваться тип строки!='', будет использоваться несколько методов.
  • style: Правила преобразования сущностей и таблиц, верблюжий регистр по умолчанию для подчеркивания, необязательное значение нормальное с именем объекта и именем поля; верблюжий горб является значением по умолчанию, верблюжий регистр для подчеркивания; верхний регистр преобразуется в верхний; нижний регистр преобразуется в нижний регистр.
  • enableMethodAnnotation: можно контролировать, поддерживать ли аннотации JPA в методе, по умолчанию — false.

Эти параметры в большинстве случаев не используются, а есть частные случаи, которые можно изучить самостоятельно.

Написание класса сущностей

Помните принцип: количество полей в классе сущностей >= количеству полей в таблице базы данных, которыми необходимо управлять. По умолчанию все поля в классе сущностей будут работать как поля в таблице, если есть дополнительные поля, их необходимо добавить@Transientаннотация.

@Table(name = "test_table")
public class TestTableVO implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(generator = "JDBC")
    private Long id;

    @Transient
    private String userId;

    private String name;

    private Timestamp createTime;

    private String createUserId;

    private Timestamp updateTime;

    private String updateUserId;

    private Integer isDelete;
    
    // 省略get、set...
    
}

инструкция:

  1. В имени таблицы по умолчанию используется имя класса, а верблюжий регистр превращается в подчеркивание (обрабатываются только прописные буквы), напримерUserInfoСоответствующее имя таблицы по умолчаниюuser_info.
  2. можно использовать имя таблицы@Table(name = "tableName")Укажите, для тех, которые не соответствуют первому правилу по умолчанию, вы можете указать имя таблицы таким образом.
  3. Поле по умолчанию и@ColumnТочно так же оно будет использоваться в качестве поля таблицы.По умолчанию в поле таблицы используется верблюжий регистр имени поля объекта Java и символы подчеркивания.
  4. можно использовать@Column(name = "fieldName")Укажите имена полей, которые не соответствуют правилу 3
  5. использовать@TransientАннотации могут игнорировать поля, и поля, добавленные с этой аннотацией, не будут использоваться в качестве полей таблицы.
  6. Предложите, что должен быть один@IdАннотация используется как поле первичного ключа, их может быть несколько@IdАннотированные поля используются в качестве первичных ключей объединения.
  7. Если это поле автоинкремента MySQL, добавьте@GeneratedValue(generator = "JDBC")Вот и все. Для других баз данных вы можете обратиться кОфициальная документация сайта.

DAOнаписание

В традиционном письме Mybatis,DAOинтерфейс должен бытьMapperассоциация файлов, т.е. нужно написатьSQLреализоватьDAOметоды в интерфейсе. И в общем Mapper,DAOВам нужно только наследовать общий интерфейс, чтобы иметь богатые методы:

Наследовать универсальный Mapper, необходимо указать универсальный

public interface TestTableDao extends Mapper<TestTableVO> {
}

Как только Mapper унаследован, унаследованный Mapper владеет Mapper. Все общие методы:

Select
метод:List<T> select(T record);
Описание: запрос в соответствии со значением атрибута в сущности, в условии запроса используется знак равенства

метод:T selectByPrimaryKey(Object key);
Примечание. Для запроса на основе поля первичного ключа параметры метода должны содержать полный атрибут первичного ключа, а в условии запроса используется знак равенства.

метод:List<T> selectAll();
Описание: Чтобы запросить все результаты, метод select(null) может достичь того же эффекта.

метод:T selectOne(T record);
Описание: При запросе в соответствии с атрибутами в объекте может быть только одно возвращаемое значение. Если есть несколько результатов, будет выдано исключение. В условии запроса используется знак равенства

метод:int selectCount(T record);
Описание: Запросите общее число в соответствии с атрибутами в сущности, и в условии запроса используется знак равенства.

Insert
метод:int insert(T record);
Описание: Сохраните объект, свойства null также будут сохранены, и значение базы данных по умолчанию не будет использоваться.

метод:int insertSelective(T record);
Описание: Сохраните объект, пустые свойства не будут сохранены, будет использоваться значение базы данных по умолчанию.

Update
метод:int updateByPrimaryKey(T record);
Описание: обновите все поля объекта в соответствии с первичным ключом, и нулевое значение будет обновлено.

метод:int updateByPrimaryKeySelective(T record);
Описание: обновить значение свойства, которое не равно нулю, на основе первичного ключа.

Delete
метод:int delete(T record);
Описание: Удалить в соответствии с атрибутом объекта в качестве условия и использовать знак равенства для условия запроса.

метод:int deleteByPrimaryKey(Object key);
Описание: для удаления на основе поля первичного ключа параметр метода должен содержать полный атрибут первичного ключа.

Пример метода
метод:List<T> selectByExample(Object example);
Описание: Запрос на основе условий примера
Важно: этот запрос поддерживает черезExampleКласс определяет столбцы запроса черезselectPropertiesметод для указания столбцов запроса

метод:int selectCountByExample(Object example);
Описание: общее количество запросов на основе условий Примера.

метод:int updateByExample(@Param("record") T record, @Param("example") Object example);
Описание: Обновить объект на основе примера условияrecordВсе свойства включены, нулевые значения будут обновлены

метод:int updateByExampleSelective(@Param("record") T record, @Param("example") Object example);
Описание: Обновить объект на основе примера условияrecordсодержит значение свойства, которое не равно нулю

метод:int deleteByExample(Object example);
Описание: Удалить данные в соответствии с примерными условиями

используется в коде

существуетserviceинъекцияdao, готовые к использованию.

@Autowired
private TestTableDao testTableDao;

Ниже показано черновое написание:

новый

TestTableVO vo = new TestTableVO();
// 省略为vo设置属性...
int row = testTableDao.insertSelective(vo);

Исправлять

TestTableVO vo = new TestTableVO();
// 省略为vo设置属性...
int row = testTableDao.updateByPrimaryKeySelective(vo);

запросить один

TestTableVO vo = new TestTableVO();
vo.setId(123L);
TestTableVO result = testTableDao.selectOne(vo);

Условный запрос

// 创建Example
Example example = new Example(TestTableVO.class);
// 创建Criteria
Example.Criteria criteria = example.createCriteria();
// 添加条件
criteria.andEqualTo("isDelete", 0);
criteria.andLike("name", "%abc123%");
List<TestTableVO> list = testTableDao.selectByExample(example);

Суммировать

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

С конфигурацией Spring Boot

Maven

<!--mybatis-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.1</version>
</dependency>
<!--mapper-->
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>1.1.4</version>
</dependency>

конфигурация application.properties

#mapper
#mappers 多个接口时逗号隔开
mapper.mappers=tk.mybatis.mapper.common.Mapper
mapper.not-empty=false
mapper.identity=MYSQL

Ссылаться на