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

OSCHINA-MIRROR/zycgit-dbvisitor

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

Введение

DbVisitor — это инструмент объектно-реляционного отображения (ORM). Он предоставляет функции отображения объектов, обработки типов, динамического SQL, хранимых процедур, встроенного механизма разбиения на страницы и более 20 диалектов баз данных. DbVisitor поддерживает вложенные транзакции, несколько источников данных, условные конструкторы, стратегии INSERT и многострочные/многорезультатные запросы. Он совместим с Spring и MyBatis.

Особенности

— Знакомые способы работы:

  • JdbcTemplate через интерфейс (высокая совместимость с Spring JDBC);
  • Файлы Mapper (высокая совместимость с MyBatis);
  • LambdaTemplate (близок к MyBatis Plus, jOOQ и BeetlSQL);
  • Аннотации @Insert, @Update, @Delete, @Query, @Callable (аналогично JPA).

— Поддержка транзакций:

  • 5 уровней изоляции транзакций и 7 вариантов поведения при распространении транзакций (как в Spring tx);
  • Интерфейс TransactionTemplate и TransactionManager для декларативного управления транзакциями (аналогично Spring).

— Дополнительные преимущества:

  • Поддержка постраничного запроса и множества диалектов баз данных (более 20);
  • Стратегии INSERT (INTO, UPDATE, IGNORE);
  • Более богатая обработка типов (MyBatis 40+, dbVisitor 60+);
  • Многострочные и многорезультатные файлы Mapper XML;
  • Уникальный механизм расширения правил @{xxx, expr , xxxxx }, упрощающий динамический SQL;
  • Хранимые процедуры;
  • Совместимость с JDBC 4.2 и Java8 для типов времени;
  • Несколько источников данных.

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

Зависимости

<dependency>
  <groupId>net.hasor</groupId>
  <artifactId>dbvisitor</artifactId>
  <version>5.4.1</version><!-- 查看最新版本:https://mvnrepository.com/artifact/net.hasor/dbvisitor -->
</dependency>

Добавьте зависимость от драйвера базы данных, например MySQL.

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.22</version>
</dependency>

Вы можете использовать dbVisitor без пула соединений с базой данных, но большинство проектов используют пул соединений. Здесь используется HikariCP.

<dependency>
  <groupId>com.zaxxer</groupId>
  <artifactId>HikariCP</artifactId>
  <version>4.0.3</version>
</dependency>

Наконец, подготовьте таблицу базы данных и инициализируйте некоторые данные (CreateDB.sql файл).

drop table if exists `test_user`;
create table `test_user` (
    `id`          int(11) auto_increment,
    `name`        varchar(255),
    `age`         int,
    `create_time` datetime,
    primary key (`id`)
);

insert into `test_user` values (1, 'mali', 26, now());
insert into `test_user` values (2, 'dative', 32, now());
insert into `test_user` values (3, 'jon wes', 41, now());
insert into `test_user` values (4, 'mary', 66, now());
insert into `test_user` values (5, 'matt', 25, now());

Пример использования SQL

Создайте источник данных:

// 创建数据源
DataSource dataSource = DsUtils.dsMySql();

Создайте объект JdbcTemplate:

// 创建 JdbcTemplate 对象
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

Загрузите тестовые данные:

// 加载测试数据脚本
jdbcTemplate.loadSQL("CreateDB.sql");

Выполните запрос и верните результат в виде списка карт:

List<Map<String, Object>> mapList = jdbcTemplate.queryForList("select * from test_user");

Распечатайте mapList в консоли, чтобы получить следующий результат:

| id | name | age | create_time | |--------------------------------------------| | 1 | mali | 26 | 2021-11-12 19:14:06.0 | | 2 | dative | 32 | 2021-11-12 19:14:06.0 | | 3 | jon wes | 41 | 2021-11-12 19:14:06.0 | | 4 | mary | 66 | 2021-11-12 19:14:06.0 | | 5 | matt | 25 | 2021-11-12 19:14:06.0 |

Если вы хотите получить данные в формате DTO, создайте класс DTO:

// 通过 @Table 注解声明一下
//  - `test_user` 通过驼峰转换后可以得到类名 `TestUser`
@Table(mapUnderscoreToCamelCase = true)
public class TestUser {
private Integer id;
private String  name;
private Integer age;
private Date    createTime;

// getters and setters omitted
}

Затем выполните запрос:

List<TestUser> dtoList = jdbcTemplate.queryForList("select * from test_user", TestUser.class);

Однотабличные операции CURD

Для однотабличных операций CURD можно использовать подкласс JdbcTemplate — LambdaTemplate. Общий Mapper

Интерфейс общего Mapper используется для выполнения некоторых основных операций. В качестве примера рассмотрим операции CRUD с одной таблицей.

// Создание источника данных
DataSource dataSource = DsUtils.dsMySql();

// Создание общего Mapper
DalSession session = new DalSession(dataSource);
BaseMapper<TestUser> baseMapper = session.createBaseMapper(TestUser.class);

// Запрос данных
List<TestUser> dtoList = baseMapper.query().queryForList();

// Вставка новых данных
TestUser newUser = new TestUser();
newUser.setName("new User");
newUser.setAge(33);
newUser.setCreateTime(new Date());

int result = baseMapper.insert(newUser);

// Обновление, изменение имени с mali на mala
TestUser sample = baseMapper.queryById(1);
sample.setName("mala");

int result = baseMapper.updateById(sample);

// Удаление данных с ID равным 2
int result = baseMapperMapper.deleteById(2);

Аннотированный Mapper

В качестве Mapper можно определить собственные методы и выполнить конкретные SQL-операторы через аннотации.

@SimpleMapper
public interface TestUserMapper extends BaseMapper<TestUser> {
  @Insert("insert into `test_user` (name,age,create_time) values (#{name}, #{age}, now())")
  int insertUser(@Param("name") String name, @Param("age") int age);
  
  @Update("update `test_user` set age = #{age} where id = #{id}")
  int updateAge(@Param("id") int userId, @Param("age") int newAge);
  
  @Delete("delete from `test_user` where age > #{age}")
  int deleteByAge(@Param("age") int age);
  
  @Query(value = "select * from `test_user` where  #{beginAge} < age and age < #{endAge}", resultType = TestUser.class)
  List<TestUser> queryByAge(@Param("beginAge") int beginAge, @Param="endAge" int endAge);
}
Создание Session
DalSession session = new DalSession(dataSource);

// Создание Mapper интерфейса
TestUserMapper userMapper = session.createMapper(TestUserMapper.class);

Использование XML для управления SQL

Оптимальное место для централизованного управления SQL — это файлы Mapper. dbVisitor Mapper файлы также хорошо совместимы с MyBatis.

// Использование @RefMapper для связывания Mapper файла и интерфейса класса (наследование BaseMapper необязательно)
@RefMapper("/mapper/quick_dao3/TestUserMapper.xml")
public interface TestUserDAO {
    int insertUser(@Param("name") String name, @Param("age") int age);

    int updateAge(@Param("id") int userId, @Param("age") int newAge);

    int deleteByAge(@Param("age") int age);

    List<TestUser> queryByAge(@Param("beginAge") int beginAge, @Param("endAge") int endAge);
}

Для лучшего понимания и использования файлов Mapper рекомендуется добавить проверку DTD. Также dbVisitor совместим с DTD MyBatis3 для большинства проектов MyBatis. ### Использование правил для упрощения XML-конфигурации

Пример 1:

<select id="queryUser">
    select * from `test_user`
    where 1 = 1
    <if test="age != null">
        and age = #{age}
    </if>
    and id in <foreach item="item" index="index" collection="list"
             open="(" separator="," close=")">
      #{item}
    </foreach>
  #{item}
</select>

Пример 2:

<select id="queryUser">
    select * from `test_user`
    @{and, age = :age}
    @{and, id in (:list)}
</select>

Пагинация запросов

Использование LambdaTemplate для пагинации запросов

// Создание LambdaTemplate и инициализация некоторых данных
DataSource dataSource = ...
LambdaTemplate lambdaTemplate = new LambdaTemplate(dataSource);

// Построение объекта пагинации, по 3 записи на страницу (по умолчанию первая страница имеет номер 0)
Page pageInfo = new PageObject();
pageInfo.setPageSize(3);

// Пагинационный запрос данных
List<TestUser> pageData1 = lambdaTemplate.lambdaQuery(TestUser.class)
    .usePage(pageInfo)
    .queryForList();

// Пагинационный запрос следующих данных
pageInfo.nextPage();
List<TestUser> pageData2 = lambdaTemplate.lambdaQuery(TestUser.class)
    .usePage(pageInfo)
    .queryForList();

Использование BaseMapper для пагинации запросов

BaseMapper<TestUser> baseMapper = ...

// Построение объекта пагинации, по 3 записи на страницу (по умолчанию первая страница имеет номер 0)
Page pageInfo = new PageObject();
pageInfo.setPageSize(3);

// Пагинационный запрос данных
PageResult<TestUser> pageData1 = baseMapper.queryByPage(pageInfo);

// Пагинационный запрос следующих данных
pageInfo.nextPage();
PageResult<TestUser> pageData2 = baseMapper.queryByPage(pageInfo);

Для пагинационного запроса в Mapper-файле достаточно добавить параметр Page в соответствующий метод интерфейса Mapper.

@RefMapper("/mapper/quick_page3/TestUserMapper.xml")
public interface TestUserMapper extends BaseMapper<TestUser> {
    // Можно напрямую вернуть данные после пагинации
    List<TestUser> queryByAge(
              @Param("beginAge") int beginAge, 
              @Param("endAge") int endAge, 
              Page pageInfo);
    
    // Или можно вернуть результат пагинации
    PageResult<TestUser> queryByAge2(
              @Param("beginAge") int beginAge, 
              @Param="endAge" int endAge, 
              Page pageInfo);
}

Использование транзакций

Запуск и фиксация транзакции, также можно последовательно активировать несколько транзакций, например:

DataSource dataSource = DsUtils.dsMySql();
TransactionManager manager = DataSourceManager.getManager(dataSource);

TransactionStatus tranA = manager.begin();
...
manager.commit(tranA);
DataSource dataSource = DsUtils.dsMySql();
TransactionManager manager = DataSourceManager.getManager(dataSource);

TransactionStatus tranA = manager.begin();
TransactionStatus tranB = manager.begin();
TransactionStatus tranC = manager.begin();

...

manager.commit(tranC);
manager.commit(tranB);
manager.commit(tranA);

С помощью параметра метода begin можно установить атрибуты распространения и уровень изоляции транзакции.

TransactionStatus tranA = manager.begin(
        Propagation.REQUIRES_NEW, // Propagation
        Isolation.READ_COMMITTED  // Уровень изоляции
);

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

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

1
https://api.gitlife.ru/oschina-mirror/zycgit-dbvisitor.git
git@api.gitlife.ru:oschina-mirror/zycgit-dbvisitor.git
oschina-mirror
zycgit-dbvisitor
zycgit-dbvisitor
main