Tinysql
Введение
Tinysql — это расширение Spring jdbcTemplate, которое наследует идеи Mybatis и в то же время отказывается от его сложности, создавая простую в использовании ORM-систему.
Предлагаются три способа использования ORM:
Использование
Maven и Tinysql.
<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.
<dependency>
:
<groupId>org.springframework.boot</groupId>
;<artifactId>spring-boot-starter-jdbc</artifactId>
.<dependency>
:
<groupId>org.springframework</groupId>
;<artifactId>spring-jdbc</artifactId>
.Spring Redis.
<dependency>
:
<groupId>org.springframework.boot</groupId>
;<artifactId>spring-boot-starter-data-redis</artifactId>
.<dependency>
:
<groupId>org.springframework</groupId>
;<artifactId>spring-data-redis</artifactId>
.Bean-зависимости Spring.
@Bean("namedParameterJdbcTemplate")
,@DependsOn("datasource")
,public NamedParameterJdbcTemplate namedParameterJdbcTemplate() throws PropertyVetoException, SQLException{
NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(getBean("datasource",DataSource.class));
,return namedParameterJdbcTemplate;
}
.@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:
Использование тегов.
<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 секунд.
Время истечения срока действия можно настроить тремя способами:
Если у аннотации @TinySecondCache установлено время истечения срока действия, оно будет использоваться. Если время истечения срока действия в аннотации <= 0, будет использовано глобальное/по умолчанию время истечения срока действия.
Если в аннотации @TinySecondCache не установлено время истечения срока действия или <= 0, используется глобальное время истечения срока действия из файла application.yml.
Если ни в аннотации @TinySecondCache, ни в файле application.yml не установлено время истечения срока действия, по умолчанию используется 3600 секунд.
@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.*
You can comment after Login
Inappropriate content may be displayed here and will not be shown on the page. You can check and modify it through the relevant editing function
If you confirm that the content does not involve inappropriate language/advertisement redirection/violence/vulgar pornography/infringement/piracy/false/insignificant or illegal content related to national laws and regulations, you can click submit to make an appeal, and we will handle it as soon as possible.
Comments ( 0 )