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

OSCHINA-MIRROR/ministor2004-tinysql

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

Tinysql

Введение

Tinysql — это расширение Spring jdbcTemplate, которое наследует идеи Mybatis и в то же время отказывается от его сложности, создавая простую в использовании ORM-систему.

Предлагаются три способа использования ORM:

  1. XML с JAVA Interface;
  2. универсальные методы работы с БД для одной таблицы;
  3. работа с одной таблицей через цепное программирование.

Использование

  • Maven и Tinysql.

    • Добавьте в pom.xml следующие настройки:
      • <properties>:
        • <tinysql.version>X.X.X</tinysql.version>.
      • <dependencies>:
        • <dependency>:
          • <groupId>com.wdy.golden</groupId>;
          • <artifactId>tinysql</artifactId>;
          • <version>${tinysql.version}</version>.
  • Сканирование Tinysql spring component:

    • @Configuration;
    • @ComponentScans:
      • @ComponentScan:
        • value = "com.wdy.golden".
  • Зависимости Spring JDBC.

    • Поскольку Tiny является расширением Spring Jdbc, в проекте необходимо использовать Spring Jdbc.
    • Для проекта Springboot требуется добавить зависимость spring boot jdbc:
      • <dependency>:
        • <groupId>org.springframework.boot</groupId>;
        • <artifactId>spring-boot-starter-jdbc</artifactId>.
    • Для обычного проекта Spring требуется добавить зависимость Spring jdbc:
      • <dependency>:
        • <groupId>org.springframework</groupId>;
        • <artifactId>spring-jdbc</artifactId>.
  • Spring Redis.

    • Если используется вторичное кэширование Tinysql, то для проекта Springboot потребуется добавить зависимость spring boot redis:
      • <dependency>:
        • <groupId>org.springframework.boot</groupId>;
        • <artifactId>spring-boot-starter-data-redis</artifactId>.
    • Для обычного проекта Spring потребуется добавить зависимость Spring data redis:
      • <dependency>:
        • <groupId>org.springframework</groupId>;
        • <artifactId>spring-data-redis</artifactId>.
  • Bean-зависимости Spring.

    • Требуется зависимость от Bean namedParameterJdbcTemplate. В проекте можно объявить Bean следующим образом и инициализировать его в контейнере Spring:
      • @Bean("namedParameterJdbcTemplate"),
      • @DependsOn("datasource"),
      • public NamedParameterJdbcTemplate namedParameterJdbcTemplate() throws PropertyVetoException, SQLException{
        • NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(getBean("datasource",DataSource.class));,
        • return namedParameterJdbcTemplate;
      • }.
    • Если используется вторичный кэш Tinysql, требуется зависимость от Bean stringRedisTemplate. В проекте можно объявить Bean следующим образом, а затем инициализировать в контейнере Spring:
      • @Bean("stringRedisTemplate"),
      • public StringRedisTemplate stringRedisTemplate() {,
      • StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();,
      • stringRedisTemplate.setConnectionFactory(redisConnectionFactory());,
      • stringRedisTemplate.setKeySerializer(new StringRedisSerializer());,
      • stringRedisTemplate.setValueSerializer(new StringRedisSerializer());,
      • stringRedisTemplate.afterPropertiesSet();,
      • return stringRedisTemplate;
      • }.
  • Конфигурация Tinysql:

    • application.yml:
      • tinysql: mappingFilePath: classpath:com/wdy/golden/zoo/tinysqlMapping/**/*.xml, mappingInterfacePackage: com.wdy.golden.zoo.dao.tinysqlInterface, namedParameterJdbcTemplateBeanName: namedParameterJdbcTemplate, secondCache: enable: true, redisTemplateBeanName: stringRedisTemplate, globalExprie: 3600, redisPath: 'tinycache:abc:'
    • tinysql.mappingFilePath — путь к файлам сопоставления Tinysql xml, обязательная настройка.
    • tinysql.mappingInterfacePackage — путь интерфейса Java Tinysql, обязательная настройка.
    • tinyssql.namedParameterJdbcTemplateBeanName — имя bean-компонента, зависящего от NamedParameterJdbcTemplate (по умолчанию namedParameterJdbcTemplate).
    • tinysql.secondCache — конфигурация вторичного кэша Tinysql. Если вторичный кэш не используется, настройку можно пропустить.
    • tinysql.secondCache.enable — включение вторичного кэширования. Для использования вторичного кэширования необходимо применять аннотацию @TinySecondCache. По умолчанию значение равно false.
    • tinysql.secondCache.redisTemplateBeanName — имя bean-компонента, зависящего от StringRedisTemplate (по умолчанию stringRedisTemplate).
    • tinysql.secondCache.globalExprie — глобальное время истечения срока действия вторичного кэша. Если аннотация @TinySecondCache не указывает конкретное время истечения, используется глобальное время. Значение по умолчанию — 3600 секунд.
    • tinysql.secondCache.redisPath — путь ключа вторичного кэша в Redis. Если настройка отсутствует, по умолчанию используется tinycache:default:.
  • Использование тегов.

    • 1. Tinysql — корневой тег файлов сопоставления. Каждый файл сопоставления должен иметь один тег tinysql:
      • <tinysql
      • xmlns="http://www.wdy.com/golden/tinysql"
      • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      • xsi:schemaLocation="http://www.wdy.com/golden/tinysql http://www.wdy.com/golden/tinysql/tinysql-v0_0_1.xsd">
      • ......
      • </tinysql>. 2. interface

tinysql标签内有且 есть один interface, который связывает с java interface и определяет, что при вызове какого-либо interface будет анализироваться и выполняться соответствующий sql в данном mapping файле.

<interface name="NoticeInterface"/>

Это означает, что данный mapping файл связан с NoticeInterface.java, и при вызове методов в NoticeInterface будет выполняться соответствующий скрипт в этом файле.

3. resultMap (Deprecated)

Этот дочерний тег tinysql используется для привязки результатов запроса к объектам Java, используя table поля. Он работает совместно с result.

<resultMap name="noticeResultMap">
    <result property="noticeTitle" column="notice_title" separator="COMMA">
</resultMap>

4. script

Используется для определения sql-операторов.

Метод attribute связывается с именем метода интерфейса.

Запрос:

resultMapRef связывается с resultMap (Deprecated).

<script method="listNotice">
    <pagination rowStartParam="po.rowStart" rowEndParam="po.rowEnd"/>
    select 
        id,NOTICE_TITLE as noticeTitle,NOTICE_CONTENT as noticeContent,
        CREATE_TIME as createTime,CREATE_BY as createBy,MODIFY_TIME as modifyTime,MODIFY_BY as modifyBy
    from zoo_notice
    <where/>
        and DELETE_FLAG='NO'
        <like separate="and" param="po.noticeTitle" type="bothLike">
        notice_title like :po.noticeTitle
        </like>
    <orderBy param="po.sortParams"/>
</script>

Выполнение:

<script method="addNotice">
    <![CDATA[
    insert into zoo_notice
    (
        ID,
        NOTICE_TITLE,
        NOTICE_CONTENT,
        DELETE_FLAG,
        CREATE_TIME,
        CREATE_BY
    )
    values
    (
        zoo_seq_id.nextval,
        :po.noticeTitle,
        :po.noticeContent,
        :po.deleteFlag,
        sysdate,
        :po.createBy
    )
    ]]>
</script>

4.1. nvlIgnore

Присутствует в script.

Определяет, является ли параметр в методе интерфейса null. Если да, то игнорирует фрагмент sql, иначе — добавляет его.

params: список свойств, которые нужно проверить на null, разделенных запятой.

separate: определяет, как будет добавлен фрагмент sql. Возможные значения: comma, and, or, none.

<nvlIgnore separate="comma" params="po.noticeTitle">
NOTICE_TITLE=:po.noticeTitle
</nvlIgnore>

4.2. where

Также присутствует в script.

Добавляет фрагмент «where 1=1» в sql.

4.3. condition

В script.

Проверяет, равно ли значение свойства po.pagination значению pagination. Можно проверять несколько значений, разделяя их запятой. Если условие истинно, добавляется фрагмент sql.

4.4. orderBy

Тоже в script.

Используется для добавления фрагмента order by. Параметр param считывает свойство po.sortParams и добавляет соответствующие поля и порядок сортировки в order by.

4.5. like

Снова в script.

Создает фрагмент like. Значение type может быть bothLike (для % с обеих сторон), leftLike (только справа) или rightLike (только слева). Параметр param указывает на свойство, которое нужно сравнить. Значение separate определяет, какой оператор будет использоваться для соединения условий. Возможные значения: and, or, none.

<like separate="and" param="po.noticeTitle" type="bothLike">
notice_title like :po.noticeTitle
</like>

4.6. pagination

Опять же в script.

Применяется для разбиения на страницы. Параметры rowStartParam и rowEndParam указывают на атрибуты, используемые для начала и конца страницы соответственно.

4.7. superPagination

Также в script.

superPagination — это улучшенная версия pagination. После использования superPagination не нужно настраивать count sql в mapping xml.

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

xxMapping.xml

<script method="listDemoForSuperPagination">
    <superPagination rowStartParam="po.rowStart" rowEndParam="po.rowEnd"/>
    select * 
    from zoo_menu
    <where/>
    <orderBy param="po.sortParams"/>
</script>

xxInterface.java. Тип возвращаемого значения метода суперпагинации должен быть ResultColumnArrayList.

@TinySecondCache(1800)
@TinyMethod(name = "listDemoForSuperPagination")
public ResultColumnArrayList<MenuPo> listDemoForSuperPagination(MenuPo po);

Вызов метода:

@Test
public void testlistDemoForSuperPagination() {
    //request
    CommonRequest req = new CommonRequest();
    req.setRequestJson("{}");
    req.setOffset(0);
    req.setPageSize(15);
    
    //po
    MenuPo po = PaginationUtil.getPaginationObject(req, MenuPo.class);
    
    //order by
    Map<String,String> sortParamMap = new HashMap<String,String>();         
    sortParamMap.put("id", SqlFeature.ASC.name); **4.8. paramIn**

Существует в теге script, используется для указания вызываемого процесса/функции и значения соответствующего аргумента.

<paramIn name="param1" param="po.param1"/>

name: аргумент процесса/функции;

param: значение аргумента, берётся из метода интерфейса xxInterface.java.

4.9. batchParams

Используется в теге script для определения параметров пакетной операции.

params: параметры пакетной операции;

4.10. nvlListIgnore

Применяется в теге script. Определяет, является ли атрибут List метода интерфейса нулевым или пустым списком. Если да, то фрагмент SQL внутри тега игнорируется. В противном случае фрагмент SQL собирается.

params: атрибут, который нужно проверить на null или пустой список. Можно указать несколько атрибутов через запятую;

separate: используется при сборке SQL. Может принимать одно из четырёх значений: comma, and, or, none (соответственно «запятая», «и», «или», «пустая строка»).

<nvlListIgnore separate="none" params="po.dateList">
and date in (:po.dateList)
</nvlListIgnore>

4.11. nvlListExec

Определяет, является ли атрибут List метода интерфейса нулевым или пустым списком. Если да, то собирается фрагмент SQL внутри тега. В противном случае SQL игнорируется.

params: атрибут, который нужно проверить на null или пустой список. Можно указать несколько атрибутов через запятую;

separate: используется при сборке SQL. Может принимать одно из четырёх значений: comma, and, or, none (соответственно «запятая», «и», «или», «пустая строка»).

<nvlListExec separate="none" params="po.dateList">
and date in (:po.dateList)
</nvlListExec>

4.12. nvlExec

Определяет, равен ли атрибут метода интерфейса нулю. Если да, то собирается фрагмент SQL внутри тега. В противном случае SQL игнорируется.

params: атрибут, который нужно проверить на нулевое значение. Можно указать несколько атрибутов через запятую;

separate: используется при сборке SQL. Может принимать одно из четырёх значений: comma, and, or, none (соответственно «запятая», «и», «или», «пустая строка»).

<nvlExec separate="none" params="po.noticeTitle">
AND NOTICE_TITLE=:po.noticeTitle
</nvlExec>

Использование второго уровня кэша

Если в файле application.yml настроено tinysql.secondCache.enable = true, то активируется функция второго уровня кэширования tinysql.

В интерфейсе Java для методов запроса после использования аннотации @TinySecondCache результаты запроса будут кэшироваться в Redis после первого вызова.

Пример 1: тип возвращаемого значения — List.

@TinySecondCache(1800)
@TinyMethod(name = "listNoticePersonal")
public List<NoticePo> listNoticePersonal(NoticePo po);

Пример 2: тип возвращаемого значения — базовый тип данных.

@TinySecondCache(1800)
@TinyMethod(name = "countNoticePersonal")
public int countNoticePersonal(NoticePo po);

Пример 3: тип возвращаемого значения — пользовательский List с полями результата.

@TinySecondCache(1800)
@TinyMethod(name = "listDemoForResultColumns")
public ResultColumnArrayList<DemoPo> listDemoForResultColumns(DemoPo po);

Также поддерживаются методы запроса, которые возвращают пользовательские объекты или типы Map.

У аннотации @TinySecondCache есть только один атрибут времени истечения срока действия, который измеряется в секундах. Например, @TinySecondCache (1800) означает, что срок действия этого метода составляет 1800 секунд.

Время истечения срока действия можно настроить тремя способами:

  1. Если у аннотации @TinySecondCache установлено время истечения срока действия, оно будет использоваться. Если время истечения срока действия в аннотации <= 0, будет использовано глобальное/по умолчанию время истечения срока действия.

  2. Если в аннотации @TinySecondCache не установлено время истечения срока действия или <= 0, используется глобальное время истечения срока действия из файла application.yml.

  3. Если ни в аннотации @TinySecondCache, ни в файле application.yml не установлено время истечения срока действия, по умолчанию используется 3600 секунд.


Применение аннотаций Tinysql

@TinyInterface: связывает файл сопоставления с интерфейсом, применяется к интерфейсу.

@TinyMethod: связывает тег скрипта с файлом сопоставления, применяется к методу интерфейса.

@TinySecondCache: второй уровень кэширования, применим только к методам запросов.

— Старая версия Tinysql определяла, был ли это запрос или операция вставки/обновления/удаления, основываясь на начале DQL/DML-оператора, чтобы выбрать соответствующий метод выполнения jdbcTemplate. Теперь это можно сделать более явно с помощью аннотаций (рекомендуется). Старый способ всё ещё поддерживается.

@TinySelect: определяет метод интерфейса как метод запроса.

@TinyInsert: определяет метод интерфейса как операцию вставки.

@TinyUpdate: определяет метод интерфейса как операцию обновления.

@TinyDelete: определяет метод интерфейса как операцию удаления.

@TinyCall: определяет метод интерфейса как вызов процедуры хранения, должен использоваться для методов интерфейса, вызывающих процедуры хранения.

@TinyFunc: определяет метод интерфейса как вызов функции, должен использоваться для методов интерфейса, вызывающих функции.

@TinyBatch: определяет метод интерфейса как пакетную операцию, пакетные операции вставки/обновления/удаления. Атрибут batchSize указывает размер пакета операции, по умолчанию равен 5000.


Вызов процедур хранения и функций

Процедура хранения без аргументов и результатов.

create or replace procedure testproc1
as
begin
    insert into testproc (name,param1,param2,num,dt)
    select 'testproc1',null,null,trunc(dbms_random.value(1,55555)),sysdate from dual
    ;
end
;

Процедура хранения с аргументами и результатами.

create or replace procedure testproc2 (
    param1 in varchar2,
    param2 in number,
    param3 out varchar2,
    param4 out number
)
is
begin
    insert into testproc (name,param1,param2,num,dt)
    select 'testproc2',param1,param2,trunc(dbms_random.value(1,55555)),sysdate from dual
    ;    
    select 'hello proc' 
    into param3 
    from dual
    ;
    select count(*) 
    into param4 
    from testproc
    ;
end
;

Процедура хранения только с аргументами.

create or replace procedure testproc3 (
    param1 in varchar2,
    param2 in number
)
is
begin
    insert into testproc (name,param1,param2,num,dt)
    select

Конец перевода. ``` po.setDt(new Date()); list.add(po); po = new TestBatchPo(); po.setId(6L); po.setName("name6"); po.setNume(new Random(1).nextLong()); po.setDt(new Date()); list.add(po);

int updateQty = demoInterface.insertTestBatch(list); log.info("batch insert qty: {}", updateQty);

list = new ArrayList(); po = new TestBatchPo(); po.setId(1L); po.setNume(new Random(1).nextLong()); list.add(po); po = new TestBatchPo(); po.setId(2L); po.setNume(new Random(1).nextLong()); list.add(po);

updateQty = demoInterface.updateTestBatch(list); log.info("batch update qty: {}", updateQty);

list = new ArrayList(); po = new TestBatchPo(); po.setId(1L); list.add(po); po = new TestBatchPo(); po.setId(2L); list.add(po);

updateQty = demoInterface.deleteTestBatch(list); log.info("batch delete qty: {}", updateQty);


*Примечание: в ответе сохранены оригинальное форматирование и спецсимволы.* **3. Цепочка операций с базой данных в программировании (рекомендуется)**

В Java interface расширяется предоставленный интерфейс ITinySqlBuilder, что позволяет выполнять более богатые однотабличные запросы и в основном удовлетворяет всем распространённым способам работы с одной таблицей.

TestCase:

    @Test
    void testBuilder() {
        MailRecipientPo insertPo = new MailRecipientPo();
        insertPo.setRecipientGroupId(268978769371151L);
        insertPo.setRecipientType("TO");
        insertPo.setMailRecipient("E050478");
        insertPo.setDeleteFlag("NO");
        insertPo.setCreateBy("E052535");
        insertPo.setCreateTime(new Date());
        
        //insert -> 自定义 id
        insertPo.setId(15L);
        SqlBuilder<MailRecipientPo> insertSqlBuilder1 = new SqlBuilder<MailRecipientPo>(insertPo)
                                    .insert();
        int rsInsert1 = mailRecipientInterface.exec(insertSqlBuilder1);
        log.info("insert -> 自定义id : {}", rsInsert1);
        
        //insert -> sequence id
        SqlBuilder<MailRecipientPo> insertSqlBuilder2 = new SqlBuilder<MailRecipientPo>(insertPo)
                                    .insert("zoo_seq_id.nextval");
        int rsInsert2 = mailRecipientInterface.exec(insertSqlBuilder2);
        log.info("insert -> sequence id : {}", rsInsert2);
        
        //select one -> 查询 одной строки
        MailRecipientPo selectOnePo = new MailRecipientPo();
        List<String> selectOneRecipientTypes = new ArrayList<String>();
        selectOneRecipientTypes.add("TO");
        selectOneRecipientTypes.add("CC");
        selectOneRecipientTypes.add("BCC");
        selectOnePo.setRecipientTypes(selectOneRecipientTypes);
        selectOnePo.setDeleteFlag("YES");
        SqlBuilder<MailRecipientPo> selectOneSqlBuilder = new SqlBuilder<MailRecipientPo>(selectOnePo)
                                    .selectAll().from().where()
                                    .condition(MailRecipientPo.Fields.recipientType, ConditionSymbol.IN, MailRecipientPo.Fields.recipientTypes)
                                    .condition(MailRecipientPo.Fields.deleteFlag, ConditionSymbol.EQ)
                                    .condition(MailRecipientPo.Fields.modifyBy, ConditionSymbol.ISNOTNULL);
        MailRecipientPo selectOneRsPo = mailRecipientInterface.selectOne(selectOneSqlBuilder);
        log.info("select one -> 查询 одной строки  : {}", selectOneRsPo);
        
        //select count -> 查询 количества строк
        MailRecipientPo selectCountPo = new MailRecipientPo();
        selectCountPo.setRecipientType("CC");
        selectCountPo.setDeleteFlag("YES");
        SqlBuilder<MailRecipientPo> selectCountSqlBuilder = new SqlBuilder<MailRecipientPo>(selectCountPo)
                                    .selectCount().from().where();

*Примечание: В запросе присутствуют фрагменты кода на языке Java, но они не были переведены, так как не являются частью исходного текста запроса.* **Условие (MailRecipientPo.Fields.recipientType, ConditionSymbol.EQ)**

**Условие (MailRecipientPo.Fields.deleteFlag, ConditionSymbol.EQ);**

Long selectCountRsPo = mailRecipientInterface.selectCount(selectCountSqlBuilder);
log.info("select count -> количество запросов: {}", selectCountRsPo);

// Выбрать все —> запросить все строки и столбцы, соответствующие условию
MailRecipientPo selectAllPo = new MailRecipientPo();
selectAllPo.setRecipientType("CC");
selectAllPo.setDeleteFlag("YES");
SqlBuilder<MailRecipientPo> selectAllSqlBuilder = new SqlBuilder<MailRecipientPo>(selectAllPo)
                                    .selectAll().from().where()
                                    .condition(MailRecipientPo.Fields.recipientType, ConditionSymbol.EQ)
                                    .condition(MailRecipientPo.Fields.deleteFlag, ConditionSymbol.EQ);
List<MailRecipientPo> selectAllRsPos = mailRecipientInterface.select(selectAllSqlBuilder);
log.info("выбрать все -> запрос всех строк и столбцов, соответствующих условию: {}", selectAllRsPos);

// Выбрать столбец —> запросить указанный столбец
MailRecipientPo selectColumnPo = new MailRecipientPo();
selectColumnPo.setRecipientType("CC");
SqlBuilder<MailRecipientPo> selectColumnSqlBuilder = new SqlBuilder<MailRecipientPo>(selectColumnPo)
                                    .select().queryColumn(MailRecipientPo.Fields.id).queryColumnEnd(MailRecipientPo.Fields.recipientGroupId)
                                    .from().where()
                                    .condition(MailRecipientPo.Fields.recipientType, ConditionSymbol.EQ);
List<MailRecipientPo> selectColumnRsPos = mailRecipientInterface.select(selectColumnSqlBuilder);
log.info("Выбрать столбец -> запрос указанного столбца: {}", selectColumnRsPos);

// Выбрать порядок —> запросить сортировку
MailRecipientPo selectOrderByPo = new MailRecipientPo();
selectOrderByPo.setRecipientType("CC");
SqlBuilder<MailRecipientPo> selectOrderBySqlBuilder = new SqlBuilder<MailRecipientPo>(selectOrderByPo)
                                    .select().queryColumn(MailRecipientPo.Fields.id).queryColumnEnd(MailRecipientPo.Fields.recipientGroupId)
                                    .from().where()
                                    .condition(MailRecipientPo.Fields.recipientType, ConditionSymbol.EQ)
                                    .orderBy().orderByColumn(MailRecipientPo.Fields.id, OrderBySymbol.DESC)
                                    .orderByColumnEnd(MailRecipientPo.Fields.createTime, OrderBySymbol.ASC);
List<MailRecipientPo> selectOrderByRsPos = mailRecipientInterface.select(selectOrderBySqlBuilder);
log.info("Выбрать порядок -> запрос сортировки: {}", selectOrderByRsPos);

// Выбрать группу —> запросить группировку
MailRecipientPo selectGroupByPo = new MailRecipientPo();
selectGroupByPo.setRecipientType("CC");
SqlBuilder<MailRecipientPo> selectGroupBySqlBuilder = new SqlBuilder<MailRecipientPo>(selectGroupByPo)
                .select().queryColumn(MailRecipientPo.Fields.recipientType).queryFixColumnEnd("COUNT(*) AS CNT")
                .from().where()
                .condition(MailRecipientPo.Fields.recipientType, ConditionSymbol.EQ)
                .groupBy().groupByColumnEnd(MailRecipientPo.Fields.recipientType);
List<MailRecipientPo> selectGroupByRsPos = mailRecipientInterface.select(selectGroupBySqlBuilder);
log.info("Выбрать группу -> запрос группировки: {}", selectGroupByRsPos);

// Выбрать группу с условием —> запросить группировку с условием
MailRecipientPo selectHavingPo = new MailRecipientPo();
selectHavingPo.setRecipientType("CC");
SqlBuilder<MailRecipientPo> selectHavingSqlBuilder = new SqlBuilder<MailRecipientPo>(selectHavingPo)
                .select().queryColumn(MailRecipientPo.Fields.recipientType).queryFixColumnEnd("COUNT(*) AS CNT")
                .from().where()
                .condition(MailRecipientPo.Fields.recipientType, ConditionSymbol.EQ) **Группировка и подсчёт**:

.groupBy().groupByColumnEnd(MailRecipientPo.Fields.recipientType)
                .havingColumn("COUNT(%s)", MailRecipientPo.Fields.recipientType, HavingConditionSymbol.GT, 5);
        List<MailRecipientPo> selectHavingRsPos = mailRecipientInterface.select(selectHavingSqlBuilder);
        log.info("select group by having function column -> 查询分组条件  : {}", selectHavingRsPos);

        //select group by having count(*) -> 查询分组count条件
        MailRecipientPo selectHavingCountPo = new MailRecipientPo();
        selectHavingCountPo.setRecipientType("CC");
        SqlBuilder<MailRecipientPo> selectHavingCountSqlBuilder = new SqlBuilder<MailRecipientPo>(selectHavingCountPo)
                .select().queryColumn(MailRecipientPo.Fields.recipientType).queryFixColumnEnd("COUNT(*) AS CNT")
                .from().where()
                .condition(MailRecipientPo.Fields.recipientType, ConditionSymbol.EQ)
                .groupBy().groupByColumnEnd(MailRecipientPo.Fields.recipientType)
                .havingCount(HavingConditionSymbol.GT, 5);
        List<MailRecipientPo> selectHavingCountRsPos = mailRecipientInterface.select(selectHavingCountSqlBuilder);
        log.info("select group by having count(*) -> 查询分组count条件  : {}", selectHavingCountRsPos);
**Разбиение на страницы**:

        //selectPage -> 分页查询,默认分页参数
        MailRecipientPo selectPageDefaultParamPo = new MailRecipientPo();
        selectPageDefaultParamPo.setRecipientType("CC");
        selectPageDefaultParamPo.setPageSize(5);
        selectPageDefaultParamPo.setOffset(0);
        SqlBuilder<MailRecipientPo> selectPageDefaultParamSqlBuilder = new SqlBuilder<MailRecipientPo>(selectPageDefaultParamPo)
                                    .select().queryColumn(MailRecipientPo.Fields.id).queryColumnEnd(MailRecipientPo.Fields.recipientGroupId)
                                    .from().where()
                                    .condition(MailRecipientPo.Fields.recipientType, ConditionSymbol.EQ)
                                    .paginationDefaultRowStartParam().paginationDefaultRowEndParam();
        ResultColumnArrayList<MailRecipientPo> selectPageDefaultParamRsPos = mailRecipientInterface.selectPage(selectPageDefaultParamSqlBuilder);
        log.info("selectPage -> 分页查询,默认分页参数  : {}", selectPageDefaultParamRsPos);

        //selectPage -> 分页查询,指定分页参数
        MailRecipientPo selectPagePo = new MailRecipientPo();
        selectPagePo.setRecipientType("CC");
        selectPagePo.setPageSize(5);
        selectPagePo.setOffset(0);
        SqlBuilder<MailRecipientPo> selectPageSqlBuilder = new SqlBuilder<MailRecipientPo>(selectPagePo)
                                    .select().queryColumn(MailRecipientPo.Fields.id).queryColumnEnd(MailRecipientPo.Fields.recipientGroupId)
                                    .from().where()
                                    .condition(MailRecipientPo.Fields.recipientType, ConditionSymbol.EQ)
                                    .paginationRowStartParam("rowStart").paginationRowEndParam("rowEnd");
        ResultColumnArrayList<MailRecipientPo> selectPageRsPos = mailRecipientInterface.selectPage(selectPageSqlBuilder);
        log.info("selectPage -> 分页查询,指定分页参数  : {}", selectPageRsPos);
**Кэширование**:

        //select to cache -> 将结果集进行二级缓存
        MailRecipientPo selectCachePo = new MailRecipientPo();
        selectCachePo.setRecipientType("CC");
        SqlBuilder<MailRecipientPo> selectCacheSqlBuilder = new SqlBuilder<MailRecipientPo>(selectCachePo)
                                    .selectAll()
                                    .from().where()
                                    .condition(MailRecipientPo.Fields.recipientType, ConditionSymbol.EQ)
                                    .cacheSeconds(3600);
        List<MailRecipientPo> selectCacheRsPos = mailRecipientInterface.select(selectCacheSqlBuilder);
        log.info("select to cache -> 将结果集进行二 уровня缓存  : {}", selectCacheRsPos);
**Обновление столбца**:

        //update column -> 更新指定列
        MailRecipientPo updateColumnPo = new MailRecipientPo();
        updateColumnPo.setRecipientType("TO"); ```
updateColumnPo.setModifyBy("E052535");
updateColumnPo.setModifyTime(new Date());
SqlBuilder<MailRecipientPo> updateColumnSqlBuilder = new SqlBuilder<MailRecipientPo>(updateColumnPo)
    .update()
    .set()
        .setColumn(MailRecipientPo.Fields.modifyBy)
        .setColumnEnd(MailRecipientPo.Fields.modifyTime)
    .where()
        .condition(MailRecipientPo.Fields.recipientType, ConditionSymbol.EQ);
int updateColumnRsPo = mailRecipientInterface.exec(updateColumnSqlBuilder);
log.info("update column -> 更新指定列  : {}", updateColumnRsPo);

//update all column -> 更新所有列
MailRecipientPo updateAllPo = new MailRecipientPo();
updateAllPo.setRecipientGroupId(268978769371151L);
updateAllPo.setRecipientType("TO");
updateAllPo.setMailRecipient("11111");
updateAllPo.setDeleteFlag("NO");
updateAllPo.setCreateBy("E052535");
updateAllPo.setCreateTime(new Date());
updateAllPo.setModifyBy("E052535");
updateAllPo.setModifyTime(new Date());
updateAllPo.setOperateId(1403L);
SqlBuilder<MailRecipientPo> updateAllSqlBuilder = new SqlBuilder<MailRecipientPo>(updateAllPo)
    .updateAll()
    .where()
        .condition(MailRecipientPo.Fields.id, ConditionSymbol.EQ, MailRecipientPo.Fields.operateId);
int updateAllRsPo = mailRecipientInterface.exec(updateAllSqlBuilder);
log.info("update all column -> 更新所有列  : {}", updateAllRsPo);

//delete -> 删除记录
MailRecipientPo deletePo = new MailRecipientPo();
deletePo.setOperateId(15L);
SqlBuilder<MailRecipientPo> deleteSqlBuilder = new SqlBuilder<MailRecipientPo>(deletePo)
    .delete()
    .from()
    .where()
        .condition(MailRecipientPo.Fields.id, ConditionSymbol.EQ, MailRecipientPo.Fields.operateId);
int deleteRsPo = mailRecipientInterface.exec(deleteSqlBuilder);
log.info("delete -> 删除记录  : {}", deleteRsPo);
``` *Увеличить функциональность вызовов хранимых процедур и функций.*

*Добавить новые аннотации: @TinyCall,@TinyFunc,@TinySelect,@TinyInsert,@TinyUpdate,@TinyDelete.*

*Реализовать пакетные операции вставки, обновления и удаления данных.*

*Условие в теге condition может оценивать несколько значений через запятую.*

##### 1.0.0-SNAPSHOT #####

*Улучшить Tinysql, добавив функционал, подобный mybaits-plus. Предоставить несколько универсальных методов для работы с одной таблицей и возможность цепного программирования для операций над одной таблицей.*

##### 1.1.0-SNAPSHOT */*

*Исправление ошибки: неправильный формат метода like в цепном программировании —> 2021/6/4 by wdy.*

##### 1.2.0-SNAPSHOT */*

*>???* —> *by wdy*

##### 1.2.1-SNAPSHOT */*

*Добавление тега nvlListIgnore —> 2021/12/9 by wdy.*

*Добавление тега nvlExec —> 2021/12/9 by wdy.*

*Добавление тега nvlListExec —> 2021/12/9 by wdy.*

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

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

Введение

TinySQL — это расширение Spring jdbcTemplate, которое основано на идеях Mybatis, но при этом лишено его сложности, представляя собой удобную в использовании ORM-фреймворк. Расширить Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

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

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