Это небольшая библиотека DAO, предоставляющая удобный способ выполнения SQL.
Ну, на самом деле мне не нравится Mybatis, потому что мне часто приходится писать небольшие проекты, и каждый раз приходится использовать XML, что не очень приятно, поэтому я создал эту штуку.
Особенности:
Инициализация проста:
XDAO.DataSource ds = new XDAO.DataSource() {
@Override
public Connection getConnection() {
// Здесь нужно вернуть Connection, рекомендуется заменить его пулом соединений вашего проекта
try {
// Пример подключения к базе данных H2
Class.forName("org.h2.Driver");
return DriverManager.getConnection("jdbc:h2:mem:play;MODE=MYSQL", "sa", "");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
};
// Устанавливаем источник данных в XDAO
XDAO.setDataSource(ds);
Например, в проекте есть модель:
import javax.persistence.Column;
import javax.persistence.Table;
@Table(name="person") // Необязательно, это в основном используется для решения проблемы несоответствия имени класса Java и имени таблицы базы данных
public class Person {
public String id;
@Column(name="name")
public String name;
@Column(name="create_time") // Необязательно, это в основном используется для решения проблемы несоответствия имени переменной Java и имени столбца базы данных
public String createTime;
}
Создайте интерфейс PersonDAO в проекте:
@DAO // Помечаем @DAO, чтобы указать, что этот интерфейс является интерфейсом DAO, и он должен быть помечен
public interface PersonDAO {
@SQL("create table person(id varchar(255) not null, name varchar(255), create_time bigint(20) not null default 0)") // Записываем SQL-запрос, необходимо пометить
void createPersonTable();
@SQL("insert into person(id, name, create_time) values(@1, @2, #now)") // @ означает параметр, который будет заменён на? в PreparedStatement
void insertPerson(String id, String name);
@SQL("insert into person(id, name, create_time) values(@1.id, @1.name, #now)") // @1.id означает, что значение параметра равно свойству id первого параметра метода
void insertPersonObject(Person person);
@SQL("select * from person where id=@1")
Person findById(String id);
@SQL("select * from person where id=@id and name=@name") // Можно изменить имя переменной SQL с помощью @SQLParam
Person findByIdAndName(@SQLParam("id")String id, @SQLParam("name")String name);
@SQL("select * from person") // Когда метод возвращает тип List и имеет указанный универсальный тип, инструмент DAO автоматически собирает результаты запроса и возвращает их
List<Person> findAll();
@SQL("select id from person") // Если вам нужна только одна колонка, вы можете написать так
List<String> findAllId();
@SQL("select count(*) from person") // Если метод возвращает тип Long или Integer, инструмент DAO рассматривает его как запрос count
long countAll();
@SQL(value="insert into person(id, name) values(@1.id, @1.name)", isBatch=true) // Когда SQL-запрос является оператором обновления, вставки или удаления, отметьте isBatch=true, и инструмент DAO будет рассматривать его как пакетную операцию
int[] batchInsert(List<Person> persons);
@SQL("select count(*) from person where id in (:ids)") // :ids означает развертывание параметра ids
long countByUserIds(@SQLParam("ids") List<String> ids);
@SQL("select * from $1 where name = @2") // $ означает макрос, который полностью заменит оператор SQL
Person findByTableAndName(String tableName, String name);
@SQL("select * from person") //where условие динамически устанавливается cnd = Cnd.where("name", "=", "steven").or("name", "=", "steven")
Person findByCnd(Cnd cnd, PageInfo pageInfo);
@SQL("select * from person where create_time > 0") //where условие динамически устанавливается (оператор SQL уже содержит условие where) cnd = Cnd.create().and("name", "=", "steven").or("name", "=", "steven")
Person findCreateTimeNotEmptyByCnd(Cnd cnd, PageInfo pageInfo);
}
Вызов PersonDAO:
// Создаём экземпляр DAO через XDAO
PersonDAO dao = XDAO.get(PersonDAO.class);
// Вызов методов интерфейса напрямую
dao.createPersonTable();
dao.insertPerson("abc", "steven");
Person person = dao.findById("abc");
List<Person> persons = dao.findAll();
person = dao.findByCnd(Cnd.where("name", "=", "steven"), null);
person = dao.findByCnd(Cnd.where("name", "=", "steven"), Pager.get(dao.countAll())); // С разбивкой на страницы
По умолчанию используются System.out и System.err. Если в проекте есть собственная система журналов, можно использовать следующий код:
XDAO.log = new XDAO.Logger(){
//TODO Здесь реализуем несколько методов Logger
};
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0.2</version>
</dependency>
mvn package
Сгенерированный jar находится в каталоге target.
В более крупных проектах часто требуется использовать несколько баз данных для разделения чтения и записи. XDAO позволяет разработчикам устанавливать несколько источников данных и указывать источник данных на интерфейсе DAO. Ниже приведён пример распространённого разделения чтения и записи (Master, Slave).
Инициализация:
XDAO.DataSource master = new XDAO.DataSource() {
@Override
public Connection getConnection() {
//
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )