Введение
Firechill — это ORM-фреймворк, разработанный командой qiubrobro. Цель создания фреймворка — поиск более эффективных решений для разработчиков. Большинство Java-разработчиков мечтают создать фреймворк, который мог бы заменить Spring. Firechill является отправной точкой в этом направлении.
На данный момент реализованы операции CRUD на основе сущностей и динамический прокси-сервер для работы с интерфейсами.
Проведено сравнение с MyBatis-Plus, и обнаружено, что у него нет функции объединения таблиц по сущностям. Поэтому команда разработчиков добавила эту функцию в Firechill.
Архитектура программного обеспечения
Фреймворк основан на Java Native JDBC и пока поддерживает только MySQL. Однако планируется добавить поддержку других баз данных через пул соединений.
ORM позволяет работать с базами данных на уровне сущностей, а также предоставляет возможность писать собственные SQL-запросы. В будущем планируется добавить автоматическое создание кода, учитывая различия в структуре каталогов разных проектов.
Изначально планировалось использовать JavaAssist для реализации динамического прокси-сервера, но из-за сложности определения формата кода было решено использовать JDK Dynamic Proxy.
Структура проекта представлена на схеме.
Важно отметить, что тестовая среда фреймворка будет находиться в пакете devtest, где также будут располагаться примеры использования.
Руководство по использованию
В пакете devtest есть несколько подпакетов, которые используются для различных целей.
public class MyDataSourceConfig implements DataSourceInfoConfig {
private static ConnectBean config;
public ConnectBean config() throws Exception {
if (config == null) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("url", "jdbc:mysql://xxx.xxx.xxx.xxx:pppp/firechildren?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true");
map.put("username", "root");
map.put("password", "123456");
map.put("initialSize", "5");
map.put("maxActive", "10");
map.put("maxWait", "3000");
map.put("driverClassName", "com.mysql.jdbc.Driver");
DataSource ds = DruidDataSourceFactory.createDataSource(map);
ConnectBean connectBean = new ConnectBean();
// Установка пула подключений
connectBean.setDataSource(ds);
// Сканирование файлов мапперов (не используется)
connectBean.setMapperScan("com.qiu.firechill.devtest.mapper");
config = connectBean;
return config;
} else {
return config;
}
}
}
Автор проекта предпочитает избегать XML-конфигурации, поэтому он реализовал конфигурацию в коде Java. Однако при интеграции с Spring всё равно придётся использовать XML.
Для работы с пулом подключений достаточно вернуть класс DataSource. Таким образом, можно использовать любой пул подключений, который возвращает этот класс.
@TableName("qiu_user")
public class QiuUser {
@ColumnName("id")
private Integer id;
@ColumnName("uname")
private String uname;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
@Override
public String toString() {
return "QiuUser{" +
"id=" + id +
", uname='" + uname + '\'' +
'}';
}
}
Аннотации TableName и ColumnName используются для указания имени таблицы и имён столбцов соответственно. Как и в большинстве традиционных ORM-систем, работа с базой данных осуществляется через сущности.
public class AfterDBCMain {
public static void main(String[] args) throws Exception {
SqlAction<QiuUser> action = new CommonDBConnectFactory().getAction(QiuUser.class);
List<QiuUser> list = action.selectAll();
System.out.println(list);
}
}
Результаты показывают, что можно выполнять запросы без написания SQL.
Методы работают аналогично.
@SqlMapper
public interface TestMapper {
@Select(sql = "select * from qiu_user",result = QiuUser.class)
List<QiuUser> findAll();
@Select(sql = "select * from qiu_user where id=?",result = QiuUser.class)
QiuUser findOne(@SqlParam(index = "1") Integer id);
}
Аннотация SqlMapper указывает, что интерфейс может быть использован для динамического проксирования.
Select-аннотация определяет пользовательский SQL-запрос, а result указывает тип возвращаемых данных. Несмотря на то что метод уже имеет возвращаемый тип, использование аннотации result упрощает рефлексию.
SqlParam-аннотация указывает, в каком месте SQL-запроса должен быть размещён параметр. В дальнейшем планируется добавить возможность передачи сущностей в качестве параметров для более сложных запросов.
Пример использования в main-методе:
public class AfterDBCMain {
public static void main(String[] args) throws Exception {
SqlAction<QiuUser> action = new CommonDBConnectFactory().getAction(QiuUser.class);
// Использование интерфейса маппера
TestMapper interFace = action.getInterFace(TestMapper.class);
QiuUser one = interFace.findOne(1);
``` **Результаты скриншота следующие:**
Результат:

**Тогда операции вставки, удаления и изменения также похожи.**
4. Операции соединения таблиц, пример следующий:
Подготовьте два класса сущностей, User и Role. В настоящее время предполагается, что отношения между User и Role — один к одному.
Результат:

Код класса сущности User: по сравнению с предыдущим классом QiuUser этот класс имеет дополнительную аннотацию @OneToOne. pkey — это поле, которое должно быть связано с текущим классом сущности, а skey — поле, связанное с таблицей, которая должна быть связана.
@TableName("qiu_user") public class User {
@ColumnName("id")
private Integer id;
@ColumnName("uname")
private String uname;
@ColumnName("rid")
private Integer rid;
// Связанная дочерняя таблица
@OneToOne(pkey = "rid",skey = "id")
private Role role;
}
Код класса сущности Role: очень обычный, нужно только определить аннотации для основной таблицы.
@TableName("qiu_role") public class Role {
@ColumnName("id")
private int id;
@ColumnName("rname")
private String rname;
}
Тестирование основного метода:
public class AfterDBCMain {
public static void main(String[] args) throws Exception {
SqlAction<User> action = new CommonDBConnectFactory().getAction(User.class);
User user = action.selectById(1);
System.out.println(user);
}
}
Результат:

Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )