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

OSCHINA-MIRROR/firechildren-firechill

Клонировать/Скачать
README.md 10 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 02.12.2024 11:40 ab4f00c

Введение

Firechill — это ORM-фреймворк, разработанный командой qiubrobro. Цель создания фреймворка — поиск более эффективных решений для разработчиков. Большинство Java-разработчиков мечтают создать фреймворк, который мог бы заменить Spring. Firechill является отправной точкой в этом направлении.

На данный момент реализованы операции CRUD на основе сущностей и динамический прокси-сервер для работы с интерфейсами.

Проведено сравнение с MyBatis-Plus, и обнаружено, что у него нет функции объединения таблиц по сущностям. Поэтому команда разработчиков добавила эту функцию в Firechill.

Архитектура программного обеспечения

Фреймворк основан на Java Native JDBC и пока поддерживает только MySQL. Однако планируется добавить поддержку других баз данных через пул соединений.

ORM позволяет работать с базами данных на уровне сущностей, а также предоставляет возможность писать собственные SQL-запросы. В будущем планируется добавить автоматическое создание кода, учитывая различия в структуре каталогов разных проектов.

Изначально планировалось использовать JavaAssist для реализации динамического прокси-сервера, но из-за сложности определения формата кода было решено использовать JDK Dynamic Proxy.

Структура проекта представлена на схеме.

Важно отметить, что тестовая среда фреймворка будет находиться в пакете devtest, где также будут располагаться примеры использования.

Руководство по использованию

В пакете devtest есть несколько подпакетов, которые используются для различных целей.

  1. Конфигурация пула подключений к базе данных. Пример конфигурации:
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. Таким образом, можно использовать любой пул подключений, который возвращает этот класс.

  1. Аннотации для сущностей. Пример:
@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-систем, работа с базой данных осуществляется через сущности.

  1. Тестирование с помощью main-метода. Пример:
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.

Методы работают аналогично.

  1. Динамический прокси для запросов. Пример интерфейса маппера:
@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);
``` **Результаты скриншота следующие:**

Результат:

![введите сюда описание изображения](https://images.gitee.com/uploads/images/2020/1001/100642_6987b777_5118695.png "屏幕截图.png")

**Тогда операции вставки, удаления и изменения также похожи.**

4. Операции соединения таблиц, пример следующий:

Подготовьте два класса сущностей, User и Role. В настоящее время предполагается, что отношения между User и Role — один к одному.

Результат:

![введите сюда описание изображения](https://images.gitee.com/uploads/images/2020/1010/112623_27415668_5118695.png "введите сюда название изображения")

Код класса сущности 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);
}

}


Результат:

![введите сюда описание изображения](https://images.gitee.com/uploads/images/2020/1010/112945_142fdf6a_5118695.png "введите сюда название изображения")

Опубликовать ( 0 )

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

1
https://api.gitlife.ru/oschina-mirror/firechildren-firechill.git
git@api.gitlife.ru:oschina-mirror/firechildren-firechill.git
oschina-mirror
firechildren-firechill
firechildren-firechill
master