Просто, удобно, расширяемо, производительность не уступает 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.
По умолчанию отображение между столбцами таблицы и свойствами класса осуществляется следующим образом:
Также можно изменить эти правила по умолчанию с помощью аннотации 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 можно задать собственное имя поля.
Если уровень журнала установлен на debug или trace, то выполнение метода handleWarnings может занять больше времени. Это старые тестовые данные, которые можно игнорировать. Однако если вы обнаружите проблемы с производительностью, стоит обратить внимание на этот момент.
В случае, если запрос не возвращает данные, возможны следующие ситуации:
Не рекомендуется использовать базовые типы для объектов предметной области, так как при добавлении или изменении данных обычно проверяется, является ли свойство объекта нулевым.
Инструмент демонстрирует производительность, сопоставимую с другими популярными инструментами.
Существуют классы тестирования производительности:
Сравнение производительности (тестовый код представляет собой проект 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 )