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

OSCHINA-MIRROR/automvc-bee

Клонировать/Скачать
FAQ_CN.md 39 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 22:58 1b71ede

Bee: часто задаваемые вопросы

  1. Какие базы данных поддерживает Bee?

Bee поддерживает множество баз данных, таких как MySQL, MariaDB, Oracle, H2, SQLite, PostgreSQL, SQL Server, Access, «Золотой запас», Dream и другие. Также поддерживаются NoSQL базы данных Cassandra и MongoDB.

Теоретически, все базы данных, совместимые с JDBC, могут быть использованы с Bee. Кроме того, поддерживается работа с базами данных Android и Harmony.

Существует возможность одновременного использования нескольких баз данных, например, MySQL, Oracle и SQL Server.

  1. Может ли Bee автоматически сопоставлять таблицы с объектами JavaBean?

В Bee используется подход, основанный на соглашениях, который позволяет автоматически сопоставлять таблицы и объекты JavaBean. По умолчанию существует четыре способа сопоставления, и также поддерживается возможность расширения пользовательских правил сопоставления.

Для переключения между способами сопоставления необходимо настроить свойство bee.osql.naming.translateType в файле bee.properties. Обычно для MySQL устанавливается значение 1, а для Oracle — 2.

  1. Поддерживает ли Bee разделение чтения и записи и несколько источников данных?

Версия V1.8 поддерживает разделение чтения и записи для одного основного и нескольких подчинённых серверов. В распределённой среде генерируются непрерывные монотонно возрастающие уникальные идентификаторы (в пределах одного workerid).

Начиная с версии 2.0, Bee предоставляет полноценную поддержку функции Sharding, включая разделение баз данных и таблиц, разделение только баз данных, разделение только таблиц в одной базе данных и разделение чтения и записи.

  1. Как использовать один и тот же объект JavaBean для одновременного отображения нескольких таблиц данных в одной базе данных?

V1.8 поддерживает разделение таблиц в одной базе данных. Динамическое сопоставление имён таблиц также поддерживается.

  1. Есть ли у Bee документация и примеры тестов? Как такой удобный ORM может не иметь документации?

Рекомендуется обратиться к вики-сайту исходного кода Bee или статье «JavaWeb разработка — инструмент для активного использования». Примеры тестов можно найти по ссылкам:

Также можно обратиться к разделу «Другие связанные ресурсы» в конце статьи.

  1. Как работает много-ко-многим сопоставление в Bee? Это похоже на MyBatis, где можно получить все данные и затем сопоставить их, или это больше похоже на Hibernate, где требуется несколько запросов?

Bee ближе к использованию нативных SQL-запросов, позволяя выполнять запросы с разбиением на страницы без необходимости получения всех данных. Bee также не требует многократных запросов, как это происходит при использовании MyBatis.

  1. Каким образом Bee обладает функциями искусственного интеллекта?

С помощью Bee можно перейти от написания SQL-запросов напрямую через JDBC к работе с операциями над объектами, подобно старым версиям Hibernate. Затем можно отказаться от написания интерфейсов DAO и сосредоточиться на общих операциях.

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

Кроме того, слой DAO можно полностью исключить и интегрировать в структуру ORM. Именно для достижения этих целей был разработан Bee.

Ранее сложность кодирования была O(n), теперь она стала O(1), независимо от количества таблиц. Можно использовать временную и пространственную сложность для понимания изменения сложности кодирования.

  1. Решает ли распределённый ORM проблему поиска метода, который не зависит от базы данных и времени генерации идентификаторов? Действительно ли невозможно использовать автоинкрементные идентификаторы в распределённых сценариях?

Оба варианта возможны. В интерфейсе GenId класса org.teasoft.bee.distribution представлены три реализации.

  1. Сравнение с традиционными инструментами ORM.

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.

  1. Как Bee повышает эффективность разработки Java web-приложений? Автоматическое создание экземпляров JavaBeans и контроллеров классов.

Помимо возможности избежать написания кода DAO (сложность кодирования равна O(1)), Bee также предоставляет инструменты для автоматического создания JavaBeans, соответствующих таблицам, и контроллеров Spring MVC Rest.

Проект bee-exam содержит следующие файлы в пакете org.teasoft.exam.bee.osql.autogen:

  • GenBeanExam.java — для создания экземпляров JavaBeans;
  • GenFilesExam.java — для создания экземпляров контроллеров SpringMVC Rest.
  1. Поддерживает ли Bee кэширование? Как настроить кэширование?

Да, 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&lt;Noid&gt; 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&lt;Noid&gt; 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").

  1. Q: В чём разница между использованием List и его отсутствием при множественных связях в Bee?

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 устарело.

  1. Q: Как используется транзакция в Java ORM фреймворке Bee?

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&lt;Orders&gt; list = suid.select(orders); //можно комбинировать условия запроса произвольно
  for (int i = 0; i &lt; 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 аннотацию.

  1. Q: Примеры использования разбиения на страницы в Java ORM framework Bee?

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&lt;Orderhistory&gt; 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 )

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

1
https://api.gitlife.ru/oschina-mirror/automvc-bee.git
git@api.gitlife.ru:oschina-mirror/automvc-bee.git
oschina-mirror
automvc-bee
automvc-bee
master