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.*
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )