Bee: часто задаваемые вопросы
Bee поддерживает множество баз данных, таких как MySQL, MariaDB, Oracle, H2, SQLite, PostgreSQL, SQL Server, Access, «Золотой запас», Dream и другие. Также поддерживаются NoSQL базы данных Cassandra и MongoDB.
Теоретически, все базы данных, совместимые с JDBC, могут быть использованы с Bee. Кроме того, поддерживается работа с базами данных Android и Harmony.
Существует возможность одновременного использования нескольких баз данных, например, MySQL, Oracle и SQL Server.
В Bee используется подход, основанный на соглашениях, который позволяет автоматически сопоставлять таблицы и объекты JavaBean. По умолчанию существует четыре способа сопоставления, и также поддерживается возможность расширения пользовательских правил сопоставления.
Для переключения между способами сопоставления необходимо настроить свойство bee.osql.naming.translateType в файле bee.properties. Обычно для MySQL устанавливается значение 1, а для Oracle — 2.
Версия V1.8 поддерживает разделение чтения и записи для одного основного и нескольких подчинённых серверов. В распределённой среде генерируются непрерывные монотонно возрастающие уникальные идентификаторы (в пределах одного workerid).
Начиная с версии 2.0, Bee предоставляет полноценную поддержку функции Sharding, включая разделение баз данных и таблиц, разделение только баз данных, разделение только таблиц в одной базе данных и разделение чтения и записи.
V1.8 поддерживает разделение таблиц в одной базе данных. Динамическое сопоставление имён таблиц также поддерживается.
Рекомендуется обратиться к вики-сайту исходного кода Bee или статье «JavaWeb разработка — инструмент для активного использования». Примеры тестов можно найти по ссылкам:
Также можно обратиться к разделу «Другие связанные ресурсы» в конце статьи.
Bee ближе к использованию нативных SQL-запросов, позволяя выполнять запросы с разбиением на страницы без необходимости получения всех данных. Bee также не требует многократных запросов, как это происходит при использовании MyBatis.
С помощью Bee можно перейти от написания SQL-запросов напрямую через JDBC к работе с операциями над объектами, подобно старым версиям Hibernate. Затем можно отказаться от написания интерфейсов DAO и сосредоточиться на общих операциях.
Развитие инструментов ORM представляет собой процесс упрощения и оптимизации операций. Если использовать искусственный интеллект для изучения и эволюции, то написание пустых интерфейсов может показаться излишним, поскольку каждая таблица базы данных представляет собой просто имя таблицы и набор столбцов. Почему нельзя применить аналогичный подход к обработке данных?
Кроме того, слой DAO можно полностью исключить и интегрировать в структуру ORM. Именно для достижения этих целей был разработан Bee.
Ранее сложность кодирования была O(n), теперь она стала O(1), независимо от количества таблиц. Можно использовать временную и пространственную сложность для понимания изменения сложности кодирования.
Оба варианта возможны. В интерфейсе GenId класса org.teasoft.bee.distribution представлены три реализации.
Hibernate имеет сложную концепцию, высокую стоимость обучения, и его обновления требуют предварительного запроса и последующего обновления. Mybatis также требует ручного написания SQL или создания SQL-файлов, что приводит к необходимости поддерживать большое количество SQL-кода. Интеграция сторонних плагинов для упрощения работы с одной таблицей может привести к высокой стоимости.
Дополнительные сравнения можно найти в статье: https://blog.csdn.net/abckingaa/article/details/84557336.
Hibernate/MyBatis + Sharding JDBC + JPA + Spring data + GraphQL + App ORM (Android, Harmony) = Bee. Вместо интеграции множества инструментов, лучше использовать один компактный и мощный инструмент. Это аналогично Hikari, пулу соединений с данными в мире Java, который мал по размеру, но функционально силён!
Bee версии 2.1 LTS предлагает улучшенную функцию Sharding для разделения данных и улучшенную поддержку MongoDB ORM.
Помимо возможности избежать написания кода DAO (сложность кодирования равна O(1)), Bee также предоставляет инструменты для автоматического создания JavaBeans, соответствующих таблицам, и контроллеров Spring MVC Rest.
Проект bee-exam содержит следующие файлы в пакете org.teasoft.exam.bee.osql.autogen:
Да, Bee поддерживает кэширование. Можно настроить как временное, так и постоянное кэширование, а также синхронизированное обновление постоянного кэша.
#cache=======================start
#缓存类型
#bee.osql.cache.type=FIFO
#缓存集数据量数目
bee.osql.cache.mapSize=10
#resultset超过一定的值将不会放缘存
bee.osql.cache.workResultSetSize=300
#缓存保存时间(毫秒 ms)
bee.osql.cache.timeout=3000
#检测到超时,超过这个使用比例则顺便起线程清除缓存
bee.osql.cache.startDeleteRate=0.6
#缓存容量使用率;添加缓存,检测达到该使用率则清除一定比例缓存
bee.osql.cache.fullUsedRate=0.8
#添加缓存,检测到缓存容量快满时,删除缓存数的比例
bee.osql.cache.fullClearRate=0.2
#仅分库时(bee.dosql.multiDS.type=2),可用格式: dsName.tableName
#use table name, not entity name
#不缓存表的列表, 表名不区分大小写.视图强烈建议不放缓存,因会产生脏数据.
#bee.osql.cache.never=user
#永久缓存表的列表, 表名不区分大小写
#bee.osql.cache.forever=constant
#只有更改时才会清除缓存,以便同步新的值到缓存. 表名不区分大小写
#bee.osql.cache.modifySyn=para
# since v1.7.2. default value is: false (use cache)。为true时,可关闭缓存
#bee.osql.cache.nocache=false
#since 1.8.99
``` **Q: Bee.osql.cache.keyUseMD5=true**
В запросе представлен фрагмент кода, в котором устанавливается значение параметра keyUseMD5 в true. Это может быть связано с настройкой кеширования в системе Bee.
**Q: Bee дизайн принципа?**
Bee — это интерфейс, а Honey — его реализация. Bee использует подход разделения интерфейса и реализации.
**Q: Bee запрос как писать фильтрующие условия (не равнозначные)?**
Для написания фильтрующих условий, отличных от равенства, используется класс ConditionImpl. Пример:
Condition condition = new ConditionImpl();
condition.op("status", Op.gt, 2);
Это условие будет преобразовано в SQL-запрос с условием «where status > 2».
**Q: SuidRich интерфейс, update метод, как различить SQL set часть и where часть?**
При обновлении сущности на основе идентификатора используется метод SuidRich.update(T entity). Этот метод использует идентификатор как условие where, а остальные непустые поля преобразуются в значения для обновления.
Если необходимо изменить значение поля на основе существующего значения, можно использовать класс Condition. Например:
condition.setAdd("price", 2);
Этот код добавит 2 к текущему значению поля price.
Также можно использовать методы update и updateBy для указания полей, которые будут использоваться в частях SET и WHERE SQL-запроса.
**Q: Bee и Honey — что это?**
ORM Bee — это фреймворк, который использует разделение интерфейса и реализации. Bee является интерфейсом, а Honey — реализацией.
**Q: Bee код открытый — только интерфейс или есть реализация?**
Интерфейс и реализация разделены. Можно использовать API и сосредоточиться только на интерфейсе. Bee — интерфейс, Honey — реализация, Bee-ext — расширение для работы с третьими сторонами.
**Q: Bee удобен, код писать мало, но как насчёт производительности?**
Производительность Bee сравнима с JDBC. В README есть таблица сравнения данных. Также существует проект для сравнения производительности с другими ORM для мобильных устройств.
**Q: Подходит ли Bee для разработки мобильных приложений?**
Размер файлов Bee небольшой. V1.8 jar файлы занимают всего 217 КБ. Производительность также сравнима с JDBC, и есть оптимизация для H2 и SQLite. С версии 1.17 добавлены функции для Android и HarmonyOS.
**Q: Как автоматически заполнять поля даты?**
По умолчанию Bee не анализирует пустые или нулевые поля. Если поле даты в Javabean пустое, Bee не будет его анализировать.
С версии 1.11 добавлены аннотации Datetime, Createtime и Updatetime.
**Q: Есть ли поддержка импорта из Excel? Можно ли упростить процесс?**
Можно легко использовать ORM Bee для преобразования данных из Excel в List<String[]> и импорта их в базу данных. Чтение данных из файла Excel занимает всего одну строку кода.
**Q: Нет соответствия между таблицей и сущностью Javabean — как работать с данными?**
Используйте map для преобразования информации о сущности и выполнения операций с данными в базе данных, таких как запрос, удаление и т. д. ```
mapSuid.select(mapSql);
Map map = mapSuid.selectOne(mapSql);
if (ObjectUtils.isNotEmpty(map)) {
Logger.info(map.get("name").toString());
Logger.info(map.get("password").toString());
}
mapSuid.selectOne(mapSql);
Q: 表对应的实体Javabean有些字段不想解析,如何实现?
A: Ignore注解,忽略Javabean字段,不进行转换.
Но подобную возможность следует использовать как можно реже.
Чистые Javabean, когда DB имеет изменения, могут быть легко изменены, автоматически сгенерированные чистые Javabean более удобны и безопасны.
Bee по умолчанию не обрабатывает поля, которые являются пустыми или пустыми символами, поэтому перед операцией с БД их следует очистить.
Condition condition=new ConditionImpl();
condition
.selectField("classno,term,examno,subject")
.selectFun(FunctionType.MAX, "score","maxScore")
.selectFun(FunctionType.AVG, "score","avgScore")
.selectFun(FunctionType.MIN, "score","minScore");
condition.op("status", Op.nq, "FIN");
condition
.groupBy("term,examno,subjectno,subject")
.orderBy("classno,term,examno,subjectno")
;
Scores scores=new Scores();
String r=suidRich.selectJson(scores, condition); // json result
System.out.println(r);
List<String[]> listString=suidRich.selectString(scores, condition); // string array result
String str[];
for (int i = 0; i < listString.size(); i++) {
str=listString.get(i);
for (int j = 0; j < str.length; j++) {
System.out.print(str[j]+" ");
}
System.out.println();
}
V1.11 можно использовать JustFetch на полях Javabean для обозначения только для получения данных. Для получения дополнительной информации см. JustFetch.
Вопрос: Bee почему нет метода findAll(), deleteAll()?
Ответ: В одной системе почти никогда не бывает сценария удаления всех данных из таблицы. Даже если вы пишете демонстрационный пример, это редко встречается. Поэтому Bee специально добавил переключатель обнаружения, чтобы предотвратить случайное удаление всех данных в таблице. Если вам нужно мягкое удаление (просто пометить поле состояния, чтобы указать, что данные больше не используются), вы можете просто использовать update. Сценарии использования findAll() также очень ограничены, за исключением конфигурации таблиц, содержащих небольшое количество записей, которые будут запрашивать все данные; такие как пользовательские таблицы, таблицы заказов и т. д., невозможно запросить все данные, обычно они разбиты на страницы (кроме того, функция разбиения на страницы Bee лучше, чем у других инструментов, и производительность также высока). В Bee запрос всех данных аналогичен использованию: suid.select(new ConstValue());//запрос всех констант, предположим, что имя таблицы соответствует имени сущности: ConstValue.
Вопрос: Почему у Bee нет метода save?
Ответ: Другие ORM-фреймворки объединяют insert и update в один метод save, каждый раз перед операцией необходимо запрашивать данные, чтобы определить, существует ли запись, чтобы решить, использовать ли insert или update. При обновлении операции объект должен установить идентификатор, чтобы запрос мог определить, существует ли объект. По сути, обновление операции может обновлять только одну строку за раз (если требуется обновить несколько строк, этот подход неэффективен). Когда используется база данных mysql и JPA использует стратегию первичного ключа @GeneratedValue(strategy = GenerationType.IDENTITY), глобальное обновление без данных версии, операция обновления станет операцией сохранения. Однако во многих бизнес-сценариях insert и update можно чётко различить, особенно в интернет-приложениях. Использование save может снизить производительность системы.
V1.9.8 SuidRich предоставляет метод save. Если возможно, рекомендуется явно вызывать insert(entity) или update(entity), что более безопасно и эффективно.
Вопрос: Зачем Bee не нужно писать mapper, dao?
Ответ: Это большое преимущество Bee, сложность кодирования Bee равна O(1). Bee прост в концепции, прост в использовании и требует небольшого количества кода. Bee использует принцип «соглашение лучше конфигурации», инкапсулируя и упрощая разработку. Можно упростить, сэкономить время и усилия, повысить эффективность разработки, а также сэкономить затраты на разработку, так зачем же не делать этого? Важность сложности кодирования не уступает сложности времени и пространства; программное обеспечение с низкой сложностью кодирования также помогает оптимизировать сложность времени и пространства.
Вопрос: Запрос «один ко многим» в Bee?
Ответ: Bee не требует List для запроса «один ко многим». Формат отображения такой же, как при запросе данных с помощью клиента базы данных, результатом является двумерная таблица. Bee упаковывает каждую строку двумерной таблицы в основной объект, и каждый основной объект будет иметь вспомогательный объект для хранения данных вспомогательной таблицы. Подробные примеры см.:
https://gitee.com/automvc/bee/wikis/(%E5%85%AD):%20%E5%A4%9A%E8%A1%A8%E6%9F%A5%E8%AF%A2(%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E6%96%B9%E5%BC%8F)?sort_id=2309685
Вопрос: Когда есть связь между несколькими таблицами, запрос «один ко многим», тип поля использует List?
Ответ: Когда для целей отображения переднего плана требуется, чтобы данные из вспомогательной таблицы были представлены в виде списка свойств основного объекта, можно использовать эту функцию. V1.9.8 поддерживает эту функцию, см. пример: https://gitee.com/automvc/bee-exam/blob/master/src/main/java/org/teasoft/exam/bee/osql/ListEntityTest.java
Вопрос: Как запросить или обновить записи с использованием составного первичного ключа?
Ответ: Bee использует соглашение лучше конфигурации, соглашение о том, что первичный ключ называется id, что делает переменные проблем проще и повышает эффективность обработки. Для некоторых старых систем с составными первичными ключами, если они обрабатываются как обычные запросы, то есть два поля используются в качестве первичных ключей, тогда необходимо установить значения двух свойств, и структура будет отвечать за анализ (метод обновления Suid, метод selectById SuidRich и т.д.). Начиная с V1.11, вы можете использовать аннотацию PrimaryKey.
Вопрос: Имя первичного ключа таблицы не является id или тип id является String, как обрабатывать?
Ответ: Метод обновления Suid и метод selectById в SuidRich по умолчанию используют поле id в качестве условия where для определения обновляемой записи. Если имя поля не id, укажите поле в качестве условия where. Например: suidRich.updateBy(noid, «uuid»); noid — это объект сущности, а «uuid» — поле для фильтрации. Ниже приведены подробные примеры.
//Noid всего имеет следующие 4 поля.
// private String uuid;
// private String name;
// private Integer num;
// private String remark;
public static void testNoId() {
Noid noid=new Noid();
noid.setUuid("aaaaaa-no-id");
noid.setName("test no id");
``` 1. **suid.insert(noid);**
*List<Noid> list = suid.select(noid);*
Printer.printList(list);
noid.setUuid("aaaaaa-no-id");
noid.setName("new name3");
// suid.update(noid); //默认id作为where条件里的表达式,用于确定需要更新的记录
suidRich.updateBy(noid, "uuid"); //没有id字段,则指定作为where的字段即可.
List<Noid> list2 = suid.select(noid);
Printer.printList(list2);
}
2. Начиная с версии V1.11 можно использовать PrimaryKey аннотацию. С версии 1.17 также можно использовать JAP Id аннотацию.
3. Q: Таблицы имён и имена сущностей, имена полей и имена атрибутов сопоставляются по умолчанию с использованием различных реализаций, а также поддерживается пользовательское сопоставление правил расширения. Как это настроить?
A: Реализовать интерфейс NameTranslate и установить setNameTranslat(NameTranslate nameTranslat) в классе NameTranslateHandle. Обратитесь к пункту 41 для настройки текущего объекта.
4. Q: При множественных связях между таблицами, как добавить выражение в часть SQL on для фильтрации данных?
A: Использовать метод opOn интерфейса Condition.
public Condition opOn(String field, Op Op, Object value);
5. Q: Как обрабатываются массовые обновления в Bee?
A: Обновление не похоже на вставку, и нет массового интерфейса. Поскольку одна и та же инструкция может обновлять несколько записей, использование SuidRich интерфейса и связанных методов обновления является предпочтительным. Если действительно необходимо выполнить несколько обновлений, можно написать собственный цикл, а затем использовать одно и то же соединение для повышения эффективности.
beginSameConnection();
//несколько update-инструкций
endSameConnection();
6. Q: Как использовать or в условиях where?
A: Пример:
```java
condition
.lParentheses() // (
.op("classno", Op.eq, "201")
.or()
.op("classno", Op.eq, "202")
.rParentheses() // )
;
Будет преобразовано в: (classno="201" or classno="202").
A: Обратитесь к: https://blog.csdn.net/abckingaa/article/details/119859192 @JoinTable(mainField="table_id", subField="table_id",subClass="Columns", joinType=JoinType.JOIN) private Columns columns; // private List<Columns> list;
//В аннотации subClass свойство, когда две сущности находятся в одном пакете, пакетное имя можно опустить. Начиная с V1.11 рекомендуется использовать subClazz; свойство subClass устарело.
A: //Однократная операция, автоматическая фиксация транзакции по умолчанию
Для множественных операций требуется один раз зафиксировать транзакцию, можно использовать:
try {
Transaction transaction = SessionFactory.getTransaction();
transaction.begin(); //начало транзакции
//...несколько операций здесь
transaction.commit();//фиксация транзакции, завершение транзакции
} catch (BeeException e) {
Logger.error(e.getMessage());
}finally {
transaction.rollback();
}
Конкретный пример:
Transaction transaction = SessionFactory.getTransaction();
try {
transaction.begin();
Suid suid = BeeFactory.getHoneyFactory().getSuid();
User user = new User();
user.setUsername("testuser");
user.setPassword("bee-user");
suid.insert(user);//insert 1
Orders orders = new Orders();
orders.setUserid("bee");
orders.setName("Bee(ORM Framework)");
orders.setTotal(new BigDecimal("91.99"));
orders.setRemark("test transaction");
orders.setSequence("");//empty String test
suid.insert(orders); //insert 2
transaction.commit();
List<Orders> list = suid.select(orders); //можно комбинировать условия запроса произвольно
for (int i = 0; i < list.size(); i++) {
Logger.info(list.get(i).toString());
}
} catch (BeeException e) {
// e.printStackTrace();
Logger.error(e.getMessage());
} finally {
transaction.rollback();
}
Помимо декларативных транзакций, также можно использовать транзакционные аннотации @Tran (начиная с 1.17). Реализация транзакционных аннотаций зависит от aspectj, не требует spring; необходимо добавить bee-ext аннотацию.
A: Разбиение на страницы (в сочетании с springMVC):
Разбиение на страницы связано только с передачей номера страницы page и количества данных на страницу size; после обработки возвращается одна страница данных.
@RequestMapping("/list")
public Result list(Orderhistory orderhistory,
@RequestParam(value = "page", defaultValue = "1", required = false) int page,
@RequestParam(value = "size", defaultValue = "20", required = false) int size) {
Result result =new Result();
int total = objSQLRichService.count(orderhistory); //можно использовать кэширование, чтобы повысить эффективность
List<Orderhistory> list=objSQLRichService.select(orderhistory, (page-1)*size, size);
result.setRows(list);
result.setTotal(total);//возвращаемое общее количество строк данных, требуется для некоторых фреймворков переднего плана.
return result;
}
Начиная с версии 2.1, предоставляется определение структуры результата возврата Result (org.teasoft.bee.mvc.Result) по умолчанию. Генерация Javabean может столкнуться с неизвестным типом, что указывает на невозможность идентификации типа. В соответствующем файле можно настроить параметры. Например, для Oracle в файле jdbcTypeToFieldType-Oracle.properties можно задать преобразование DATE в Timestamp.
В проекте Honey предварительно настроены некоторые файлы, начиная с версии 1.17. Эти файлы не включены в jar-файлы, но доступны для скачивания из исходного кода проекта. Пользователи также могут создавать собственные связанные файлы.
Файлы jdbcTypeToFieldType-{DbName}.properties будут перекрывать значения в jdbcTypeToFieldType.properties. Можно ограничиться использованием только jdbcTypeToFieldType.properties без указания имени базы данных.
Вопрос: Как выполнить запрос к полю, значение которого пустое?
Ответ: Например, чтобы получить информацию о пользователях с пустым полем email, можно использовать следующий код:
Condition condition10 = BeeFactoryHelper.getCondition();
condition10.op("email", Op.eq, null);
List<TestUser> list10 = suid.select(new TestUser(), condition10);
Это преобразуется в SQL-запрос:
SELECT id, email, last_name, name, password, username, createtime FROM test_user WHERE email IS NULL
Вместо Op.eq
можно использовать Op.nq
или Op.notEqual
.
Maven загружает только jar-пакеты, а не исходные файлы. Чтобы получить доступ к документации Javadoc API, необходимо загрузить исходные коды в среде IDE. Например, в Eclipse можно щёлкнуть правой кнопкой мыши по проекту и выбрать Maven → Download Sources. Затем следует проверить наличие файла bee-2.1-sources.jar в локальном репозитории Maven.
Вопрос: Поддерживает ли PreparedSql работу с несколькими источниками данных?
Ответ: Методы PreparedSql, которые содержат дженерики T, поддерживают работу с несколькими источниками данных. Если дженериков нет, то будет использоваться только один источник данных по умолчанию.
С версии V1.17 можно использовать метод setDataSourceName("имя настроенного ds") для установки текущего объекта источника данных.
V1.11 позволяет настраивать диалекты баз данных через DbFeatureRegistry.
Вопрос: Как настроить собственный диалект базы данных, например DB2?
Ответ: С версии V1.11 это можно сделать через DbFeatureRegistry, что является простым и удобным способом.
Для настройки собственного именования конвертера глобально можно обратиться к разделу 29. Начиная с V1.11, поддерживается установка именования конвертеров через методы setNameTranslate в Suid и других объектах. С версии V2.1 можно использовать setNameTranslateOneTime для временного применения именования конвертера. Это полезно в случаях, когда требуется временное использование другого конвертера.
Bee предоставляет интерфейсы SetParaTypeConvert и TypeHandler для определения пользовательских параметров и обработки результатов запросов соответственно.
SetParaTypeConvert используется для преобразования типов свойств Javabean при установке параметров для PreparedStatement. TypeHandler обрабатывает результаты ResultSet, сопоставляя их с типами Javabean.
Настройка нескольких источников данных требует изучения конкретных примеров использования. Для ознакомления можно обратиться к следующим ресурсам:
Также доступны другие ресурсы, такие как gitee issue, gitee wiki, github issue и github wiki.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )