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

OSCHINA-MIRROR/nway-Nway-JDBC

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 16 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 01.12.2024 23:39 6e69b1f

Просто, удобно, расширяемо, производительность не уступает mybatis, явно выше mybatis-plus

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

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

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

Поддерживает jdk8, 11, 17, 21

Основные методы использования

maven

<dependency>
    <groupId>com.github.zdtjss</groupId>
    <artifactId>nway-jdbc</artifactId>
    <version>1.7.6</version>
</dependency>

На основе конфигурации bean-компонента xml:

<bean id="sqlExecutor" class="com.nway.spring.jdbc.SqlExecutor">
    <property name="dataSource" ref="dataSource"/>
</bean>

Spring Boot:

@Autowired
private DataSource dataSource;

@Bean
public SqlExecutor createSqlExecutor() {
    return new SqlExecutor(dataSource);
}

Добавление, изменение, удаление:

QueryBuilder builder = SQL.insert(Class beanClass);
DeleteBuilder builder = SQL.delete(Class beanClass);
UpdateBuilder builder = SQL.update(Class beanClass);

int effectCount = sqlExecutor.update(builder);

Условия запроса автоматически проверяются на пустоту, исключая ненужный код проверки, например:

if(StringUtils.isNotBlank(user.getName)) {
    sqlBuilder.like(User::getName, user.getName());
}

Вышеупомянутый код можно записать напрямую:

sqlBuilder.ignoreInvalidDeep(true)
    .like(User::getName, user.getName()); 

Внутренняя логика инструмента проверяет, является ли значение user.getName() допустимым, и только если оно допустимо, оно будет использоваться в качестве условия запроса. null, пустые коллекции и пустые строки считаются недопустимыми значениями. Значения по умолчанию для основных типов являются допустимыми значениями
(если вам нужно игнорировать только null или коллекции, вы можете использовать метод ignoreInvalid(true)).
Конечно, вы также можете отключить автоматическую проверку. Просто вызовите sqlBuilder.ignoreInvalidDeep(false). Чтобы восстановить автоматическую проверку, вызовите sqlBuilder.ignoreInvalidDeep(true).
Следует использовать ignoreInvalidDeep(true), только когда значение не должно быть условием запроса, в противном случае это может привести к превышению прав доступа, по умолчанию используется false.
Обратите внимание, что and(Consumer<X> whereBuilder) или or(Consumer<X> whereBuilder), использующие эту функцию, должны быть явно указаны,
например: and((sql) -> sql.ignoreInvalidDeep(true).like(User::getName, user.getName()))

Запрос одного объекта:

QueryBuilder builder = SQL.query(User.class).eq(usrQuery::getStatus).like(usrQuery::getName);
User user = sqlExecutor.queryBean(builder);
User user = sqlExecutor.queryById(100, User.class);

или

User usr = sqlExecutor.queryForBean("select * from t_user where user_name like ? and status = ?", User.class, "abc", 1);

Запрос списка объектов:

QueryBuilder builder = SQL.query(User.class).eq(usrQuery::getStatus).like(usrQuery::getName);
List<User> users = sqlExecutor.queryList(builder);
List<User> users = sqlExecutor.queryList(Arrays.asList(100), User.class);
Map<String, User> userMap = queryListMap(builder, User::getId)
Map<String, User> userMap = queryListMap(Arrays.asList(100), User.class, User::getId)

или

List<User> users = sqlExecutor.queryList("select * from t_user where user_name like ? and status = ?", User.class, 10000);

Разбиение на страницы списка объектов:

QueryBuilder builder = SQL.query(User.class).eq(usrQuery::getStatus).like(usrQuery::getName).orderBy(usrQuery::getId);
Page<User> users = sqlExecutor.queryPage(builder, 1, 10);

или

Page<User> users = sqlExecutor.queryPage("select * from t_user where user_name like ? and status = ? order by id", new Object[]{ "abc", 1 }, 1, 10, User.class);

//страница данных List<T>
users.getPageData();
//количество элементов на странице
users.getPageSize();
//общее количество элементов
users.getTotalCount()
//размер страницы
users.getPageSize();
//номер страницы
users.getCurrentPage();

Разбивка на страницы объектов карты:

Page<Map<String, Object>> users = sqlExecutor.queryPage("select * from user_name where id <> ? order by id", new Object[]{ "abc", 1 }, 1, 10);
Разбиение по страницам поддерживает Oracle, Mysql, MariaDB. Для других баз данных разбиение по страницам может быть реализовано путём реализации интерфейса com.nway.spring.jdbc.pagination.PaginationSupport и внедрения его через метод com.nway.spring.jdbc.SqlExecutor.setPaginationSupport.

Автоматическое заполнение данных и поддержка управления доступом к данным

Сценарии применения: 
    1、Управление доступом к данным может использоваться для ограничения данных, которые могут быть возвращены при запросе данных.
    2、Функция автоматического заполнения может применяться к унифицированной обработке данных «создатель», «редактор», «дата создания» и «дата редактирования».
Способ использования:
    Добавьте аннотацию @Column(fillStrategy = TestFillStrategy.class, permissionStrategy = TestPermissionStrategy.class) к свойствам соответствующего объекта запроса. 

LogicFieldStrategy:Реализует мягкое удаление на основе fillStrategy и permissionStrategy. Эти два свойства имеют большой потенциал для воображения. LogicFieldIntStrategy — это реализация типа int.

О глубокой настройке

1、Если вам необходимо глубоко вмешаться в выполнение SQL и параметров, вы можете интегрировать Spring JdbcTemplate для покрытия соответствующих методов, а затем заменить значения по умолчанию с помощью SqlExecutor.setJdbcTemplate. # Отображение между таблицами базы данных и классами Java

Отображение между полями таблиц по умолчанию и свойствами классов реализуется через рефлексию, но также предоставляется реализация с использованием ASM (AsmBeanProcessor). Если есть более эффективные решения, можно реализовать интерфейс BeanProcessor и заменить значение по умолчанию через SqlExecutor.setBeanProcessor.

Теоретически, производительность ASM должна быть выше, чем у рефлексии, однако результаты самопроверки показывают, что разница не столь очевидна. Требуется дальнейшее исследование для определения конкретных причин.

Правила отображения между таблицами и классами

Таблицы

Имя таблицы формируется следующим образом:

  • имя начинается со строчной буквы;
  • остальные буквы имени преобразуются в строчные;
  • перед именем добавляется символ подчёркивания.

Например, таблица UserRole будет называться user_role.

Поля

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

  • из имени столбца удаляется символ подчёркивания;
  • первый символ имени столбца преобразуется в верхний регистр. Столбец user_name будет соответствовать свойству userName, которое будет задаваться через метод setUserName.

Также можно изменить эти правила по умолчанию с помощью аннотации com.nway.spring.jdbc.annotation.Column.

Пример:

import com.nway.spring.jdbc.annotation.Table;
import com.nway.spring.jdbc.annotation.Column;

@Table("t_user")
public class User {
    @Column(type = ColumnType.ID)
    private Integer id;
    @Column("user_name")
    private String name;
    private int status;
    @Column(name = "power", sub = @MultiColumn(XXX))
    private List<String> powerList;
}

Для полей типа ColumnType.MULTI_VALUE данные автоматически считываются и записываются из таблицы, имя которой состоит из имени класса и имени поля. Например, для поля powerList данные будут считываться и записываться из таблицы t_user_power. Структура этой таблицы:

CREATE TABLE `t_computer_user` ( `id` bigint NOT NULL, --固定字段,主键 `fk` int DEFAULT NULL, --固定字段,主表主键 类型可根据主表主键类型定义 `power` varchar(255) DEFAULT NULL, --固定字段,@Column配置的字段名(遵从默认下划线命名规则) `idx` int DEFAULT NULL, --固定字段,排序用 PRIMARY KEY (`id`) );

С помощью аннотации @MultiColumn можно задать собственное имя поля.

JdbcTemplate.handleWarnings()

Если уровень журнала установлен на debug или trace, то выполнение метода handleWarnings может занять больше времени. Это старые тестовые данные, которые можно игнорировать. Однако если вы обнаружите проблемы с производительностью, стоит обратить внимание на этот момент.

Обработка ситуаций, когда данные не найдены

В случае, если запрос не возвращает данные, возможны следующие ситуации:

  1. query возвращает null;
  2. queryList возвращает список, размер которого равен нулю;
  3. queryPage возвращает значение getTotal(), равное нулю.

Не рекомендуется использовать базовые типы для объектов предметной области, так как при добавлении или изменении данных обычно проверяется, является ли свойство объекта нулевым.

Тестирование производительности

Инструмент демонстрирует производительность, сопоставимую с другими популярными инструментами.

Существуют классы тестирования производительности:

  • OrderPerformanceTest — для последовательного выполнения запросов;
  • ConcurrentPerformanceTest — для параллельного выполнения запросов.

Сравнение производительности (тестовый код представляет собой проект vs-java, а инструмент тестирования — JMeter):

Последовательное выполнение Параллельное выполнение
Разбиение на страницы TPS инструмента выше примерно в 1 раз, чем у mybatis-plus, и примерно на 20% выше, чем у MyBatis TPS инструмента примерно в 60% выше, чем у mybatis-plus, и примерно в 40% выше, чем у MyBatis
Список TPS инструмента примерно на 60% выше, чем у mybatis-plus, и на 40% выше, чем у MyBatis

Результаты тестирования могут различаться в зависимости от среды, но в целом производительность инструмента превосходит mybatis-plus и MyBatis. Инструмент не предназначен для сравнения с MyBatis, но его производительность при работе с одной таблицей сопоставима с mybatis-plus.

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

Опубликовать ( 0 )

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

1
https://api.gitlife.ru/oschina-mirror/nway-Nway-JDBC.git
git@api.gitlife.ru:oschina-mirror/nway-Nway-JDBC.git
oschina-mirror
nway-Nway-JDBC
nway-Nway-JDBC
dev