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

OSCHINA-MIRROR/eric_ds-jfire-sql

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
ReadMe.md

Jfire-Sql 框架

Описание фреймворка

Jfire-sql — это фреймворк для отображения SQL, который позволяет связать интерфейс метода с SQL-запросом и выполнить метод для отправки SQL-запроса. Фреймворк обеспечивает прозрачное автоматическое преобразование результатов в объекты, коллекции объектов, автоматическую поддержку SQL, динамические имена таблиц и полей. Он полностью освобождает программиста от необходимости писать код на JDBC и позволяет ему сосредоточиться на бизнес-логике.

Преимущества фреймворка

  1. Быстрая работа с одной таблицей CURD: фреймворк использует классы для сопоставления с таблицами базы данных. Операции CURD (создание, чтение, обновление и удаление) для одной строки данных могут быть выполнены быстро с помощью кода, подобного session.save(entity), session.delete(entity), session.get(entityClass, id).
  2. Удобное использование заполнителей в SQL-запросах: можно написать SQL-запросы, подобные @Query(sql = "select * from User where code=$code,name=$user.name", paramNames = "code", "user") public List<User> find(String code, User user);, что улучшает читаемость кода. Позиция и информация параметров очевидны.
  3. Прозрачное преобразование объектов: после запроса фреймворк автоматически преобразует одну строку данных в экземпляр объекта. Если данных несколько, возвращается список объектов типа List<T>. Человеческое вмешательство не требуется.
  4. Поддержка динамического SQL: в JDBC часто встречаются запросы с несколькими условиями, которые требуют ручного объединения SQL-строк в зависимости от условий. Jfire-sql предлагает решение для динамических SQL-запросов. Можно использовать код, подобный select * from user where 1=1 [name] and name=$name # [id] and id=$id #, чтобы автоматически объединять SQL-запрос. Когда условие не существует или ложно, содержимое между [ ] и # игнорируется, и SQL-запрос автоматически объединяется.
  5. Динамические имена таблиц и поля: в JDBC иногда требуется поддержка динамических имён таблиц. Раньше это делалось путём ручного объединения строк SQL. Теперь фреймворк может автоматически выполнять эту задачу. Можно использовать { } для окружения содержимого, которое будет автоматически объединено с SQL.

Пример: @Query(sql = "select * from user{userno}", paramNames = "userno") public List<User> find(int userno); В этом примере можно использовать параметры метода для автоматического предоставления поддержки динамических имён таблиц.

Быстрый старт

Давайте рассмотрим пример кода для начала работы:

// Сначала нужен класс сущности
@tableEntity(name = "db_user")
package com.jfire.test;

public class User {
    private Integer id;
    private String name;
    private int age;
    private Date birthday;
}

// Затем интерфейс класса
public interface UserOp {
    @Query(sql = "select * from User", paramNames = {})
    public List<User> list();

    @Query(sql = "select name from User where id=$id", paramNames = "id")
    public String getName(int id);

    @Query(sql = "select * from User where name=$user.name and age=$user.age", paramNames = "user")
    public User get(User user);

    @Update(sql = "update User set name=name where id=$id", paramNames = "id,name")
    public void update(int id, String name);
}

// Теперь можно начать использовать
public static void main(String args[]) {
    DataSource ds = new MysqlDataSource("jdbcurl", "username", "password");
    SessionFactory sf = new SessionFactoryImpl(ds);
    sf.setScanPackage("com.jfire.orm");
    sf.init();
    // Хорошо, теперь можно начать операции CURD
    // Добавить строку данных
    User user = new User();
    user.setName("test");
    user.setAge(20);
    user.setBirthday(new Date());
    Sqlsession session = sf.openSession();
    session.save(User);// Сохранить объект в базу данных, эквивалентно вставке строки данных
    session.close();
    // Получить строку данных
    Sqlsession session = sf.openSession();
    User user = session.get(User.class, 1);
    session.close();
    // Использовать интерфейс для запроса
    Sqlsession session = sf.openSession();
    UserOp op = session.getMapper(UserOp.Class);
    List<User> list = op.list();
    op.update("test2", 1);
    session.close();
}

Основные настройки

В Jfire-Orm фреймворке используется SqlSession для представления соединения с базой данных, а SqlSession создаётся SessionFactory. Поэтому первым шагом является инициализация SessionFactory.

SessionFactory

Реализация класса SessionFactory — SessionFactoryImpl. При инициализации требуется предоставить объект пула соединений. Код выглядит следующим образом:

DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUsername("root");
dataSource.setPassword("centerm");
sessionFactory = new SessionFactoryImpl(dataSource);
sessionFactory.setScanPackage("com.jfire.sql");// Установить путь для сканирования, классы с аннотациями в этом пути будут автоматически обнаружены. Пути можно разделить с помощью;
sessionFactory.init(); Инициализировать с заданными параметрами

SqlSession

SqlSession представляет соединение с базой данных. Он содержит большинство функций SQL. Это легко понять, посмотрев на код. В интерфейсе запросов, предоставляемом SqlSession, фреймворк способен автоматически преобразовывать результаты запросов в экземпляры соответствующих классов отображения. Таким образом, работа с результатами запросов становится автоматической и прозрачной.

SqlSession предоставляет функции, аналогичные Hibernate, для операций CURD над классами. Работа с классами для операций CURD аналогична работе с таблицами. Например, вставка строки данных выполняется с помощью session.save(entity).

Существует два способа получения сеанса:

  • sessionFactory.openSession() создаст новый сеанс.
  • sessionFactory.getCurrentSession() получит текущий сеанс, хранящийся в ThreadLocal. Если в текущем потоке нет открытого сеанса, он вернёт null. Между содержимым в SQL-выражении ничего не появится.

В приведённом примере, если значение переменной name равно null, то итоговый SQL будет выглядеть как:

select * from User

Иначе он будет таким:

select * from User where name = $name

В квадратных скобках [$] символ $ используется для обозначения начала имени переменной, где принцип поиска значения и заполнители в SQL схожи. Если в квадратных скобках есть только одна переменная и не задано условие, то выполняется проверка на непустое значение, иначе выполняется пользовательская проверка условия.

Рассмотрим следующий код:

@Query(sql = "select * from User [$age >20 && $age <25] where age=$age #", paramNames = "age") public List<User> find(int age);

Здесь будет выполняться пользовательская проверка условий. Если выражение age>20 && age<25 истинно, то SQL-выражение будет выглядеть так:

select * from User where age =$age

В квадратных скобках помимо символа $ для обозначения начала имени переменной, остальная запись аналогична записи в Java-коде. Символ $ также поддерживает не только прямые методы ввода параметров, но и получение значений атрибутов параметров, когда параметр является классом, например, $user.age получает значение атрибута age объекта User.

Поддержка неопределённого количества параметров

При выполнении запросов в диапазоне можно столкнуться с такими SQL-запросами, как select * from User where id in (?,?). В этом случае часто необходимо определить количество вопросительных знаков (?) в зависимости от параметров, переданных с переднего плана. Jfire-orm предоставляет встроенную поддержку неопределённому количеству параметров. Перед заполнителем добавляется символ ~ для указания на необходимость специальной обработки содержимого внутри заполнителя.

Поддержка строк

Можно использовать SQL-запрос select * from User where ^id in $~ids, где ids — это строка, содержимое которой разделено запятыми. Фреймворк автоматически использует запятые для разделения содержимого ids, и преобразует SQL в select * from User where id in (?,?,?), где количество вопросительных знаков соответствует количеству элементов в массиве, полученном после разделения. Затем каждый элемент массива последовательно заполняется.

Поддержка массивов

Можно использовать SQL-запрос select * from User where id in $~ids, где ids представляет собой массив. Фреймворк преобразует SQL в select * from User where id in (?,?,?), где вопросительные знаки соответствуют длине массива. Затем каждый элемент массива последовательно заполняется.

Поддержка списков

Можно использовать SQL-запрос select * from User where id in $~ids, где ids является списком. Фреймворк преобразует SQL в select * from User where id in (?,?,?), где вопросительные знаки соответствуют количеству элементов списка. Затем каждый элемент списка последовательно заполняется.

Динамическая поддержка имён таблиц и полей

Из-за существования ситуаций с разделением баз данных и таблиц, иногда имя таблицы становится известно только во время выполнения запроса. Это также включает динамическую поддержку имён таблиц и столбцов. По сути, это динамическое добавление строк. Для таких случаев jfire-sql также предоставляет поддержку. Например:

@Query(sql = "select * from user{userno}", paramNames = "userno") public List<User> find(int userno);

Если userno равен 1, то окончательный SQL-запрос будет выглядеть следующим образом:

select * from user1

Как видно, для динамических имён таблиц и столбцов достаточно понимать их как обычную конкатенацию строк.

Комментарии ( 0 )

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

Введение

Описание недоступно Развернуть Свернуть
Отмена

Обновления (1)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/eric_ds-jfire-sql.git
git@api.gitlife.ru:oschina-mirror/eric_ds-jfire-sql.git
oschina-mirror
eric_ds-jfire-sql
eric_ds-jfire-sql
master