jSqlBox — это полнофункциональный открытый Java-инструмент для работы с базами данных, который не уступает другим инструментам в плане архитектуры, функциональности и простоты использования.
jSqlBox включает все функции, связанные с работой с базой данных, такие как DDL, пагинация, разделение на несколько баз данных или таблиц, декларативные транзакции, распределённые транзакции и связанные отображения запросов. Все эти функции включены в JAR-файл размером 1 МБ, который не зависит от сторонних библиотек.
Документация
Сравнение jSqlBox с другими инструментами для работы с данными (DAO)
См.: https://gitee.com/drinkjava2/jsqlbox/wikis/pages?sort_id=1010925&doc_id=92178, чтобы получить общее представление о функциях и особенностях jSqlBox.
Основные особенности
В файле pom.xml добавьте следующую зависимость:
<dependency>
<groupId>com.github.drinkjava2</groupId>
<artifactId>jsqlbox</artifactId>
<version>5.0.15.jre8</version> <!-- Или последняя версия -->
</dependency>
Самая большая особенность jSqlBox заключается в том, что он позволяет писать SQL прямо в коде Java. Вся его архитектура основана на этом принципе, что отличает его от других инструментов DAO. Преимущество написания SQL в Java заключается в низкой стоимости обучения: достаточно знать SQL, чтобы сразу начать использовать инструмент, что снижает сложность изучения. Использование jSqlBox не означает использование всех его функций. Во многих случаях SQL может решить бизнес-задачи, и нет необходимости внедрять сложные ORM.
DbContext db= new DbContext(dataSource);
db.exe("insert into users (", //
" name ,", par("Sam"), //один параметр записывается в одну строку для удобства обслуживания
notNull("address,", user.getAddress()), //проверка на пустые значения
when(age>10, "age,", par(user.getAge())), //динамическое добавление фрагмента SQL на основе условия
" address ", par("Canada"), //
") ", valuesQuestions()); //автоматическое добавление фрагментов values(?,?...?) в соответствии с количеством параметров
Хотя написание SQL в Java является распространённым подходом, существует не так много инструментов DAO, которые доводят эту концепцию до совершенства. Автор считает, что jSqlBox предлагает наиболее эффективный способ использования возможностей SQL, а также обеспечивает простоту изучения, гибкость и расширяемость при написании SQL.
QTbPriceSetting p=QTbPriceSetting.instance;
DB.exe("insert into ",p," (", //
p.id, ",", par(1200), //
p.price, ",", par(80), //
p.currency, ",", par("USD"), //
p.created_at, par("2019-09-17 04:07:55"), //
")", valuesQuestions());
Q-классы или классы, содержащие строковые константы, могут быть созданы с использованием исходного кода jSqlBox. Кроме того, jSqlBox поддерживает экспорт структуры таблицы базы данных в формате Excel из базы данных или сущностей. См.: https://gitee.com/drinkjava2/jdialects/wikis/%E7%94%A8%E6%88%B7%E6%89%8B%E5%86%8C/5.4%20%E5%AE%9E%E4%BD%93%E6%88%96%E6%95%B0%E6%8D%AE%E5%BA%93%E7%BB%93%E6%9E%84%E5%AF%BC%E5%87%BAExcel.
jSqlBox имеет модульную архитектуру, которая разделяет функции на отдельные модули (jBeanBox, jDbPro, jDialects, jTransaction). Эти модули можно использовать отдельно от jSqlBox. Цель модульной архитектуры — изолировать функции и сделать их доступными для повторного использования в других инструментах. Например, если вы хотите использовать только модуль jDialect для работы с диалектами баз данных, добавьте следующее в файл pom.xml вашего проекта:
<dependency>
<groupId>com.github.drinkjava2</groupId>
<artifactId>jdialects</artifactId>
<version>5.0.13.jre8</version> <!--или последняя версия-->
</dependency>
Модуль jDialects поддерживает более 80 различных баз данных и предоставляет функции, такие как генерация скриптов DDL для создания таблиц, генерация кода сущностей из структуры базы данных, преобразование функций в зависимости от диалекта, генерация первичных ключей и т. д. Пример: следующий SQL-запрос может использоваться в различных базах данных без необходимости изменения исходного кода. Модуль jDialects автоматически обрабатывает генерацию DDL и перевод функций в зависимости от используемого диалекта.
DB.exe(DB.gctx().toCreateDDL(HelloWorld.class)); //создание DDL на основе сущности для создания таблицы
String sql=DB.trans("select concat('a','b','c'), current_time() from user_tb where age>0"); //перевод функций SQL в зависимости от диалекта
DB.qryString(sql, " and price>100", pagin(1, 10)); //разбиение на страницы для любой базы данных путём передачи объекта pagin
Наследование класса ActiveRRecord или реализация интерфейса ActiveEntity позволяют реализовать шаблон ActiveRecord:
public class User implements ActiveEntity{
@UUID
private String id;
private String name;
//геттеры и сеттеры ...
}
//ActiveRecord
new User().loadById("张三").setUserAge(13).update();
Перехватчики, разбиение на страницы, шаблоны, кэширование, сопоставление сущностей и другие функции могут быть добавлены в качестве параметров к методам SQL. Например, механизм шаблонов SQL можно передать в качестве параметра методу SQL для поддержки различных шаблонов SQL:
SqlTemplateEngine TEMPLATE = BasicSqlTemplate.instance()
ctx2.exe(TEMPLATE, "update users set name=#{user.name}, address=:user.address",
``` **Совместимость с основными JPA аннотациями, поддержка динамического изменения конфигурации в процессе выполнения**
Для удобства изучения jSqlBox совместим с основными аннотациями JPA для сущностных классов: @Entity, @Transient, @UniqueConstraint, @GenerationType, @Id, @Index, @SequenceGenerator, @GeneratedValue, @Table, @Column, @TableGenerator, @Version, @Enumerated, @Convert, @Temporal.
jSql также имеет несколько специальных аннотаций для сущностей, таких как CreatedBy, LastModifiedBy, ShardTable, ShardDatabase и Snowflake.
В jSqlBox можно динамически изменять конфигурацию связей сущностей во время выполнения. Например, можно настроить UUID32 первичный ключ для класса PojoDemo и изменить отображение поля name на поле address:
TableModel m = TableModelUtils.entity2Model(PojoDemo.class); m.column("id").pkey().uuid32(); m.column("name").setColumnName("address"); TableModelUtils.bindGlobalModel(PojoDemo.class, m);
**Поддержка мультиарендности, репликации главный-подчиненный, разделения базы данных и таблиц**
jSqlBox поддерживает мультиарендность, репликацию главный-подчинённый и разделение базы данных и таблиц. Помимо использования аннотации Sharding для сущностей, jSqlBox также позволяет передавать методы разделения базы данных и таблиц непосредственно в SQL для точного контроля над разделением каждой строки SQL.
Пример разделения сущностей:
for (i:=0;i<100;i++) new TheUser().put("databaseId", i).insert();
//SQL中的分库分表
db[2].exe(User.class, "insert into ", shardTB(tbID), shardDB(dbID)," (id, name, databaseId)
values(?,?,?)", par(tbID, "u1", dbID), USE_BOTH);
Мультиарендность может быть реализована на основе IP-адреса или другого поля сущности. Для этого необходимо настроить экземпляр TenantGetter:
public static class CustomTenantGetter implements TenantGetter { @Override public ImprovedQueryRunner getTenant() { return DB.gctx(); //обычно это экземпляр DbContext, полученный из threadlocal: } } //запуск ctx = new DbContext(); ctx.setTenantGetter(new CustomTenantGetter());
**Встроенная декларативная транзакция, поддержка транзакций Spring**
jSqlBox имеет встроенный инструмент IOC/AOP и функцию декларативной транзакции. Если вы используете Spring, то можете легко настроить транзакцию, например:
DbContext ctx = new DbContext(ds); ctx.setConnectionManager(SpringTxConnectionManager.instance()); DbContext.setGlobalDbBoxContext(ctx);// 设定静态全局上下文
**Встроенная функция распределённой транзакции**
Принцип работы распределённых транзакций в jSqlBox похож на Seata. Он может автоматически генерировать откатные SQL-запросы, но исходный код jSqlBox проще, чем у Seata, поскольку jSqlBox генерирует откатные SQL на основе сущностного CRUD, что устраняет необходимость учитывать проблемы совместимости SQL.
**Избегание повторной разработки, отказ от антипаттернов**
jSqlBox не изобретает велосипед и использует DbUtils в качестве ядра. DbUtils — зрелый, лаконичный и эффективный JDBC-инструмент.
jSqlBox старается избегать антипаттернов. Антипаттерн — это когда тратится много времени на действия, которые не имеют смысла. В jSqlBox, например, не поддерживается конфигурация ассоциаций один-ко-многим и многие-к-одному. Это связано с тем, что такие ассоциации могут привести к проблемам с производительностью, обучением и обслуживанием, которые могут перевесить преимущества их использования.
Также в jSqlBox нет методов, заменяющих ключевые слова SQL. Такие методы считаются антипаттерном, так как они могут усложнить чтение и поддержку кода, а также сделать его менее эффективным по сравнению с использованием SQL напрямую.
**Пример начала работы**
Следующий пример демонстрирует базовую настройку и использование jSqlBox:
Добавьте зависимость в файл pom.xml:
Введите следующий исходный код в IDE:
import javax.sql.DataSource;
import org.h2.jdbcx.JdbcConnectionPool;
import static com.github.drinkjava2.jsqlbox.DB.*;
import com.github.drinkjava2.jdialects.annotation.jdia.UUID25;
import com.github.drinkjava2.jdialects.annotation.jpa.Id;
import com.github.drinkjava2.jsqlbox.ActiveEntity;
import com.github.drinkjava2.jsqlbox.DB;
import com.github.drinkjava2.jsqlbox.DbContext;
public class HelloWorld implements ActiveEntity<HelloWorld> {
@Id
@UUID25
private String id;
private String name;
public String getId() {return id;}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )