1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/openter-custom-data

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Custom-springboot-starter

Введение

Простой ORM-инструмент, основанный на JDBC и Druid от Alibaba. Включает в себя конструктор условий и прост в использовании. Позволяет легко выполнять операции создания, чтения, обновления и удаления данных (CRUD), поддерживает ActiveRecord и цепные запросы.

Описание:

  • com.custom.action.core.JdbcDao: класс предоставляет различные методы для создания, чтения, изменения и удаления данных, которые пользователь может настроить по своему усмотрению. Для использования достаточно внедрить этот объект в сервис или контроллер. Требуется написать только часть SQL-запроса для выполнения операций над одной таблицей.

  • Достаточно создать сущность и добавить несколько пользовательских аннотаций, чтобы сгенерировать соответствующую структуру таблицы.

  • В настоящее время поддерживается только MySQL.

  • Поддерживает настраиваемые связанные запросы и логическое удаление. Выводит SQL-запросы, преобразует подчёркивания в регистр верблюда и другие функции.

  • Инструмент автоматически настраивается для SpringBoot. В проекте 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. Инструмент предоставляет множество API методов для операций создания, чтения, изменения и удаления.

— Общие запросы


    Запрос нескольких записей: пример 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 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/openter-custom-data.git
git@api.gitlife.ru:oschina-mirror/openter-custom-data.git
oschina-mirror
openter-custom-data
openter-custom-data
master