предисловие
Большинство разработчиков, использующих 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...
}
инструкция:
- В имени таблицы по умолчанию используется имя класса, а верблюжий регистр превращается в подчеркивание (обрабатываются только прописные буквы), например
UserInfo
Соответствующее имя таблицы по умолчаниюuser_info
. - можно использовать имя таблицы
@Table(name = "tableName")
Укажите, для тех, которые не соответствуют первому правилу по умолчанию, вы можете указать имя таблицы таким образом. - Поле по умолчанию и
@Column
Точно так же оно будет использоваться в качестве поля таблицы.По умолчанию в поле таблицы используется верблюжий регистр имени поля объекта Java и символы подчеркивания. - можно использовать
@Column(name = "fieldName")
Укажите имена полей, которые не соответствуют правилу 3 - использовать
@Transient
Аннотации могут игнорировать поля, и поля, добавленные с этой аннотацией, не будут использоваться в качестве полей таблицы. - Предложите, что должен быть один
@Id
Аннотация используется как поле первичного ключа, их может быть несколько@Id
Аннотированные поля используются в качестве первичных ключей объединения. - Если это поле автоинкремента 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