DB数据源
DataSource — это абстрактный интерфейс для операций на уровне данных, который используется не только для реляционных баз данных, но и поддерживает такие источники данных, как память, Mongodb и ElasticSearch. Redkale имеет встроенную версию DataSource для работы с памятью, а официальная библиотека расширений «redkale-plugins» предоставляет реализации для Mongodb и ElasticSearch.
Почти все операции DataSource предоставляют синхронные и асинхронные методы. Асинхронный метод подходит для высокопроизводительных систем, например, с использованием DataSqlSource на основе vertx.
Комментарии
Комментарий | Описание функции |
---|---|
@Column | Помечает поле, соответствует использованию JPA |
@Entity | Помечает класс сущности, соответствует использованию JPA |
@Id | Помечает первичный ключ поля, соответствует использованию JPA |
@Table | Помечает псевдоним таблицы, соответствует использованию JPA |
@Transient | Помечает, является ли поле таблицей соответствия, соответствует использованию JPA |
@VirtualEntity | Используется для классов сущностей, которые не соответствуют таблицам базы данных, и применяется только в режиме кэширования DataSource |
@DistributeTable | Помечает таблицу для разделения таблиц и разделения библиотек, используется в сочетании с интерфейсом DistributeTableStrategy |
@FilterColumn | Используется для настройки полей класса FilterBean |
@FilterJoinColumn | Используется для настройки связанных полей таблицы класса FilterBean |
@FilterGroup | Используется для установки условий группировки фильтров класса FilterBean |
@FilterOrs | Используется для определения отношений между полями класса FilterBean с помощью «или» |
Методы операций
Серия методов | Описание функций |
---|---|
insert | Вставляет сущность |
delete | Удаляет сущность |
update | Обновляет сущность |
updateColumn | Обновляет часть полей данных |
find | Находит отдельный объект |
queryList | Запрашивает коллекцию объектов List |
querySheet | Запрашивает набор объектов Sheet |
getNumberXXX | Запрос статистики, используемый для запроса суммы, максимального значения, среднего значения и других данных поля |
queryColumnXXX | Запрос данных отдельного поля и статистический запрос поля |
nativeXXX | Выполняет прямой SQL-запрос, используемый для сложных запросов соединения и обновления (ограничено DataSqlSource) |
Конфигурация источника данных
redkale.datasource.platf.url = jdbc:mysql://127.0.0.1:3306/platf?serverTimezone=UTC&characterEncoding=utf8
redkale.datasource.platf.user = root
redkale.datasource.platf.password = pwd123
Зависимости pom
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.2.0</version>
</dependency>
<dependency>
<groupId>org.redkalex</groupId>
<artifactId>redkale-plugins</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-mysql-client</artifactId>
<version>4.5.1</version>
</dependency>
Вставка, удаление, изменение и запрос
@Data
@Table(name = "t_account")
public class Account {
//男
public static final short GENDER_MALE = 1;
//女
public static final short GENDER_FEMALE = 2;
@Id
@Column(name = "account_id")
private String accountid;
@Column(name = "account_name")
private String accountName;
private int age;
private short gender;
private String remark;
@Column(name = "create_time", updatable = false)
private long createTime;
}
Вставка нового объекта сущности:
@Resource(name = "platf")
private DataSource source;
public void insertTest() {
//Вставляем один объект
Account account = new Account();
account.setAccountid("account1");
account.setAccountName("Hello");
account.setCreateTime(System.currentTimeMillis());
source.insert(account);
//Асинхронно вставляем несколько объектов
Account a1 = new Account();
a1.setAccountid("account1");
a1.setAccountName("Hello1");
a1.setCreateTime(System.currentTimeMillis());
Account a2 = new Account();
a2.setAccountid("account2");
a2.setAccountName("Hello2");
a2.setCreateTime(System.currentTimeMillis());
source.insertAsync(a1, a2);
}
Удаление сущности:
//Удаляем по первичному ключу
Account account = new Account();
account.setAccountid("account1");
source.delete(account);
//Фильтруем и удаляем, удаляем мужчин младше 16 лет
//Эквивалентный SQL: DELETE FROM t_account WHERE age < 16 AND gender = 1;
source.delete(Account.class, FilterNodes.lt(Account::getAge, 16).and("gender", GENDER_MALE));
Изменение объекта сущности:
//Способ Lambda, обновляем одно поле по первичному ключу
source.updateColumn(Account.class, "account1", Account::getRemark, "Новая заметка");
//Способ Lambda, обновляем несколько полей по первичному ключу
//Эквивалентный SQL: UPDATE t_account SET account_name='Новое имя', remark='Новая заметка', age=age+2 WHERE account_id='account1';
source.updateColumn(Account.class, "account1",
ColumnValue.set(Account::getAccountName, "Новое имя"),
ColumnValue.set(Account::getRemark, "Новая заметка"),
ColumnValue.inc(Account::getAge, 2)); //Возраст + 2
//Обновляем несколько полей по первичному ключу
Account account = new Account();
account.setAccountid("account1");
account.setAccountName("Новое имя"); ```
account.setRemark("新备注");
source.updateColumn(account, "accountName", "remark");
//或者
//等价sql: UPDATE t_account SET account_name='新名称', remark='新备注' WHERE account_id='account1';
source.updateColumn(account, Account::getAccountName, Account::getRemark);
//根据主键更新整个对象
Account one = new Account();
one.setAccountid("account1");
one.setAccountName("Hello1");
one.setCreateTime(System.currentTimeMillis());
source.update(one); //createTime不会被更新,因字段设置了@Column(updatable=false)
//过滤更新
//等价sql: UPDATE t_account SET remark = '不满16岁是青少年' WHERE age < 16;
source.updateColumn(Account.class, FilterNodes.lt(Account::getAge, 16),
ColumnValue.set(Account::getRemark, "不满16岁是青少年"));
批量操作:
Account a1 = new Account();
a1.setAccountid("account1");
a1.setAccountName("Hello1");
a1.setCreateTime(System.currentTimeMillis());
//事务性批量操作
DataBatch batch = DataBatch.create()
.insert(a1)
.updateColumn(Account.class, "account1", ColumnValue.set(Account::getRemark, "不满16岁是青少年"))
.delete(Account.class, FilterNodes.lt(Account::getAge, 16).and("gender", GENDER_MALE));
source.batch(batch);
查询实体对象:
//主键查询
//等价sql: SELECT * FROM t_account WHERE account_id = 'account1';
Account account = source.find(Account.class, "account1");
//等价sql: SELECT * FROM t_account WHERE account_name = 'Hello' AND age = 18 LIMIT 1;
Account one = source.find(Account.class, FilterNodes.eq(Account::getAccountName, "Hello").and(Account::getAge, 18));
//等价sql: SELECT * FROM t_account WHERE account_name = 'Hello' OR age = 18;
FilterNode filter = FilterNodes.eq(Account::getAccountName, "Hello").or(Account::getAge, 18);
List<Account> list = source.queryList(Account.class, filter);
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )