Jfire-Sql 框架
Jfire-sql — это фреймворк для отображения SQL, который позволяет связать интерфейс метода с SQL-запросом и выполнить метод для отправки SQL-запроса. Фреймворк обеспечивает прозрачное автоматическое преобразование результатов в объекты, коллекции объектов, автоматическую поддержку SQL, динамические имена таблиц и полей. Он полностью освобождает программиста от необходимости писать код на JDBC и позволяет ему сосредоточиться на бизнес-логике.
session.save(entity), session.delete(entity), session.get(entityClass, id)
.@Query(sql = "select * from User where code=$code,name=$user.name", paramNames = "code", "user") public List<User> find(String code, User user);
, что улучшает читаемость кода. Позиция и информация параметров очевидны.List<T>
. Человеческое вмешательство не требуется.select * from user where 1=1 [name] and name=$name # [id] and id=$id #
, чтобы автоматически объединять SQL-запрос. Когда условие не существует или ложно, содержимое между [ ]
и #
игнорируется, и 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 — 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 представляет соединение с базой данных. Он содержит большинство функций 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 )