Custom-springboot-starter
Простой ORM-инструмент, основанный на JDBC и Druid от Alibaba. Включает в себя конструктор условий и прост в использовании. Позволяет легко выполнять операции создания, чтения, обновления и удаления данных (CRUD), поддерживает ActiveRecord и цепные запросы.
com.custom.action.core.JdbcDao: класс предоставляет различные методы для создания, чтения, изменения и удаления данных, которые пользователь может настроить по своему усмотрению. Для использования достаточно внедрить этот объект в сервис или контроллер. Требуется написать только часть SQL-запроса для выполнения операций над одной таблицей.
Достаточно создать сущность и добавить несколько пользовательских аннотаций, чтобы сгенерировать соответствующую структуру таблицы.
В настоящее время поддерживается только MySQL.
Поддерживает настраиваемые связанные запросы и логическое удаление. Выводит SQL-запросы, преобразует подчёркивания в регистр верблюда и другие функции.
Инструмент автоматически настраивается для SpringBoot. В проекте SpringBoot достаточно добавить зависимость, дополнительная настройка не требуется.
<dependency>
<groupId>com.xb-custom</groupId>
<artifactId>custom-springboot-starter</artifactId>
<version>1.0.0</version>
<!-- Или последняя версия -->
</dependency>
SpringBoot способ — конфигурация источника данных
Конфигурация источника данных в проекте SpringBoot: поскольку класс dataSource является пользовательским, в файле application.yml(properties) необходимо выполнить базовую конфигурацию, драйвер по умолчанию — mysql8.0 — com.mysql.cj.jdbc.Driver (можно не указывать в конфигурационном файле).
custom.db.datasource.url=jdbc:mysql://127.0.0.1:3306/hos?characterEncoding=utf-8&allowMultiQueries=true&autoreconnect=true&serverTimezone=UTC
custom.db.datasource.username=root
custom.db.datasource.password=123456
Чистая зависимость — ручная настройка
<dependency>
<groupId>com.xb-custom</groupId>
<artifactId>custom-db-action</artifactId>
<version>1.0.0</version>
</dependency>
Ручная настройка — конфигурация источника данных
// Конфигурация соединения с базой данных
DbDataSource dbDataSource = new DbDataSource();
dbDataSource.setUrl("jdbc:mysql://127.0.0.1:3306/hos?characterEncoding=utf-8&allowMultiQueries=true&autoreconnect=true&serverTimezone=UTC");
dbDataSource.setUsername("root");
dbDataSource.setPassword("123456");
// Driver не нужно заполнять, по умолчанию mysql8.0
// Глобальная конфигурация
DbGlobalConfig globalConfig = new DbGlobalConfig();
// Стратегическая конфигурация
DbCustomStrategy dbCustomStrategy = new DbCustomStrategy();
// Переключатель печати SQL
dbCustomStrategy.setSqlOutPrinting(true);
// При выполнении true SQL является исполняемым (параметр? уже заменён реальным значением), по умолчанию false
dbCustomStrategy.setSqlOutPrintExecute(true);
// Преобразовать подчёркивание в верблюжий регистр?
dbCustomStrategy.setUnderlineToCamel(true);
// Поле логического удаления (поле таблицы)
dbCustomStrategy.setDbFieldDeleteLogic("state");
// Значение логического удаления
dbCustomStrategy.setDeleteLogicValue(1);
// Не логическое значение удаления
dbCustomStrategy.setNotDeleteLogicValue(0);
globalConfig.setStrategy(dbCustomStrategy);
import com.custom.action.core.JdbcDao;
// Внедрение JdbcDao для использования
@Autowired
private JdbcDao jdbcDao;
— Общие запросы
Запрос нескольких записей: пример 1 (and a.name = ?, "Чжан Сань"), пример 2 (and a.name = "Чжан Сань")
public <T> List<T> selectList(Class<T> t, String condition, Object... params);
Поиск по нескольким первичным ключам и возврат нескольких записей
public <T> List<T> selectListByKeys(Class<T> t, Collection<? extends Serializable> keys);
Запросите несколько записей в соответствии с SQL: пример (выберите * из таблицы)
public <T> List<T> selectListBySql(Class<T> t, String sql, Object... params);
Разбиение на страницы и сортировка в соответствии с условиями: пример (и a.name =?, 1, 10, "Чжан Сань")
public <T> DbPageRows<T> selectPageRows(Class<T> t, String condition, int pageIndex, int pageSize, Object... params);
Найдите одну запись в соответствии с первичным ключом: пример (25)
public <T> T selectOneByKey(Class<T> t, Object key);
Чистый SQL запрос одной записи: пример (select * from table where age = ?, 25)
public <T> T selectOneBySql(Class<T> t, String sql, Object... params);
Чистый SQL-запрос одного значения: пример (выбрать имя из таблицы, где возраст =?, 25)
public Object selectObjBySql(String sql, Object... params);
Найти одну запись в соответствии с условием
public <T> T selectOneByCondition(Class<T> t, String condition, Object... params);
— Конструктор условий (аналогично MyBatis-Plus)
selectPageRows (запрос на разбиение на страницы)
selectList (запросить несколько записей)
selectCount (подсчитать количество записей)
selectOne (найти одну запись)
selectObj (запросить одно поле, и есть только одно значение, если их несколько, вернуть только первое значение, соответствующее условию)
selectObjs (то же самое, но может возвращать несколько значений)
wrapper);
public List selectObjs(ConditionWrapper wrapper);
Использование примера:
```java
1. Общее полевое построение
DefaultConditionWrapper<Student> wrapper = new DefaultConditionWrapper<>(Student.class);
wrapper.eq("name", "张三").select("id", "name", "age").pageParams(1, 10);
DbPageRows<Student> dbPageRows = jdbcDao.selectPageRows(wrapper);
2. Построение лямбда-выражения
LambdaConditionWrapper<Student> wrapper = new LambdaConditionWrapper<>(Student.class);
wrapper.eq(Student::getName, "张三")
.select(Student::getName, Student::getId, Student::getAge)
.pageParams(1, 10);
DbPageRows<Student> dbPageRows = jdbcDao.selectPageRows(wrapper);
3. Использование статического метода для создания экземпляра
DbPageRows<ChildStudent> dbPageRows = jdbcDao.selectPageRows(Conditions.lambdaQuery(Student.class)
.eq(Student::getName, "张三")
.select(Student::getName, Student::getId, Student::getAge)
.pageParams(1, 10));
Дополнительное примечание:
1. При использовании метода onlyPrimary() можно заставить этот запрос запрашивать только данные основной таблицы.
2. При использовании метода select() можно использовать некоторые функции SQL (поддерживаются только sum/max/min/ifnull/count/avg), например:
List<Student> students = jdbcDao.selectList(Conditions.lambdaQuery(Student.class)
.eq(Student::getName, "张三")
.between(Student::getAge, 20, 25)
.select(Student::getAge)
.select(x -> x.sum(Student::getAge, Student::getSumAge))
.groupBy(Student::getAge));
/**
* Синхронный запрос — запрос нескольких записей
*/
<T> List<T> selectList(SyncQueryWrapper<T> wrapper);
/**
* Синхронный запрос — запрос одной записи
*/
<T> T selectOne(SyncQueryWrapper<T> wrapper);
/**
* Синхронный запрос — разбиение на страницы
*/
<T> DbPageRows<T> selectPage(SyncQueryWrapper<T> wrapper);
Пример использования:
// Запрос одного объекта
Student student = jdbcDao.selectOne(Conditions.syncQuery(Student.class)
// объект студента для запроса (то есть основной объект)
.primaryEx(x -> x.eq(Student::getNickName, "siyecao"))
// атрибут объекта студента, который не является постоянным атрибутом (то есть один к одному или один ко многим)
// t — это объект студента после запроса, используемый в качестве предварительного суждения и заранее используемый
.property(Student::setModelList, t -> t.getModelList() == null,
Conditions.lambdaQuery(Street.class).in(Street::getId, 5012, 5013, 5014, 5015))
.property(Student::setProvince, t -> t.getProvince() == null,
t -> Conditions.lambdaQuery(Province.class).in(t.getProId() != null, Province::getId, t.getProId()))
);
Province province = student.getProvince();
// Запрос нескольких основных объектов
List<City> cityList = jdbcDao.selectList(Conditions.syncQuery(City.class)
.primaryEx(x -> x.eq(City::getProvinceId, province.getId()))
.property(City::setLocationList, t -> Conditions.lambdaQuery(Location.class).in(Location::getCityId, t.getId()))
);
province.setCityList(cityList);
Согласно первичному ключу, удаление одной записи
public <T> int deleteByKey(Class<T> t, Object key);
Согласно первичному ключу, удаление нескольких записей
public <T> int deleteBatchKeys(Class<T> t, Collection<? extends Serializable> keys);
Согласно условию, удаление записи
public <T> int deleteByCondition(Class<T> t, String condition, Object... params);
Согласно условию, удаление записи
public <T> int deleteSelective(ConditionWrapper<T> wrapper);
Согласно первичному ключу, изменение одной записи
public <T> int updateByKey(T entity);
Согласно условию, изменение одной записи (только изменение атрибутов сущности, где значение !=null)
public <T> int updateByCondition(T entity, String condition, Object... params);
Согласно sql set установщику, изменение n записей
public <T> int updateSelective(AbstractUpdateSet<T> updateSet);
Вставка одной записи
public <T> long insert(T entity);
Вставка нескольких записей
public <T> int insertBatch(List<T> entityList);
Сохранение одной записи (добавление или изменение согласно первичному ключу)
public <T> int save(T entity);
Выполнение одной строки sql (вставка, удаление, изменение)
public <T> int executeSql(String sql, Object... params);
Удаление таблицы
public void dropTables(Class<?>... arr);
Создание таблицы
public void createTables(Class<?>... arr);
Метод выполнения транзакции
public void execTrans(TransactionExecutor executor);
Пример использования:
jdbcDao.execTrans(() -> {
//
``` **Логика написана внутри:**
* Сотрудник employee = jdbcDao.selectByKey(Employee.class, 10);
* employee.setEmpName("Чжан Сань");
* jdbcDao.updateByKey(employee);
* int a = 1 / 0;
* employee.setEmpName("Ли Си");
* jdbcDao.updateByKey(employee));
**Введение в аннотации сущностей:**
Аннотация первичного ключа: **@DbKey** (может быть помечена только на свойствах Java)
| Свойство аннотации | Описание |
| :---------------- | ------------------------------------------------------------ |
| value | Поле первичного ключа таблицы, если не указано, по умолчанию совпадает с атрибутом Java. Если стратегия имеет значение true, то при преобразовании в нижний регистр будет автоматически преобразовано в нижний регистр. |
| strategy | Предлагает три стратегии первичного ключа: AUTO для автоинкремента, UUID для системного UUID, который автоматически генерируется при добавлении, INPUT требует ввода значения первичного ключа вручную, по умолчанию используется AUTO. |
| dbType | Тип поля, соответствующий базе данных: более десяти типов на выбор, атрибут перечисления, по умолчанию DbType.DbInt. |
| desc | Описание поля |
Обычная аннотация поля: **@DbField** (может быть отмечена только на свойствах Java).
| Свойство аннотации | Описание |
| :----------------- | ------------------------------------------------------------ |
| value | Поле первичного ключа таблицы, если не указано, по умолчанию совпадает с атрибутом Java. При преобразовании в нижний регистр с помощью стратегии hump-to-underline, установленной в true, будет автоматически преобразовано в нижний регистр. |
| dataType | Тип поля, соответствующий базе данных: более десяти типов на выбор, атрибут перечисления, по умолчанию DbType.DbVarchar. |
| desc | Описание поля |
| isNull | Разрешает ли поле быть пустым, используется только при создании таблицы. |
| exist | Существует ли это поле в таблице, действует так же, как и DbNotField. |
| fillStrategy | Стратегия автоматического заполнения: при вставке или обновлении (логическом удалении) сущности автоматически заполняет значение указанного поля.
Связанная таблица 1: **@DbRelated** (можно отметить только свойства Java).
| Свойство аннотации | Описание |
| :-------------------- | ------------------------------------------------- |
| joinTable | Связанная таблица, например, teacher |
| joinAlias | Псевдоним связанной таблицы, например, tea |
| condition | Условие соединения, например: a.tea_id = tea.id |
| joinStyle | Стиль соединения: inner join, left join, right join |
| field | Введенное поле, т. е. поле таблицы для запроса (teacher_name) |
Связанная таблица 2: **@DbJoinTables** (можно пометить только класс Java).
| Аннотированный объект | Описание |
| --------------------- | ------------------------------------------------------------ |
| @DbJoinTable | Внутренняя аннотация @DbJoinTables, используемая для настройки условий соединения таблиц, например: left join teacher tea on a.tea_id = tea.id |
| @DbJoinField | Используется вместе с @DbJoinTable, значение должно включать псевдоним связанной таблицы, такой как tea.teacher_name |
Таблица аннотаций: **@DbTable** (можно пометить только класс Java).
| Свойство аннотации | Описание |
| :--------------- | --------------------------------------------------------- |
| table | Имя таблицы |
| alias | Псевдоним |
| desc | Описание таблицы |
| order | Если существует динамический источник данных, укажите значение, соответствующее источнику данных order |
Аннотации неперсистентных полей: **@DbNotField** (помечаются на свойствах Java).
В сущности указывает на игнорируемые атрибуты, работает аналогично @DbField.exist = false, указывая, что атрибут не принадлежит таблице.
Если атрибут отмечен @DbField или @DbKey вместе с этой аннотацией, эта аннотация считается недействительной.
**Пример использования аннотаций:**
```java
@Data
@DbJoinTables({
@DbJoinTable("left join province pro on pro.id = a.pro_id"),
@DbJoinTable("left join city cy on cy.id = a.city_id"),
})
@DbTable(table = "student")
public class Student {
@DbKey(value = "id", strategy = KeyStrategy.AUTO, dbType = DbType.DbInt)
private Integer id;
@DbField
private String name;
@DbField("nick_code")
private String nickName;
@DbField
private Integer areaId;
@DbJoinField("pro.name")
private String province;
@DbJoinField("cy.name")
private String city;
@DbNotField
private List<String> childrenList;
Второй шаг — выполнить метод createTables:
JdbcDao.createTables(Student.class);
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )