一.说明

  最近使用的项目,采用了jooq。

  通过学习api文档和自我调试,写了一些代码,在此处进行记录。

二.代码

  一切尽在代码中……

  参考文档:http://www.jooq.org/doc/3.11/manual-single-page/

package com.transsnet.sims.business;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.apache.commons.lang3.StringUtils;
import org.jooq.Condition;
import org.jooq.DSLContext;
import org.jooq.Record;
import org.jooq.Record1;
import org.jooq.Record2;
import org.jooq.Result;
import org.jooq.SelectJoinStep;
import org.jooq.UpdateSetFirstStep;
import org.jooq.UpdateSetMoreStep;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import com.transsnet.sims.common.dto.PageDto;
import com.transsnet.sims.common.dto.PosDto;
import com.transsnet.sims.common.dto.RetailerDto;
import com.transsnet.sims.common.dto.SaDto;
import com.transsnet.sims.storage.easybuy_aad.Tables;
import com.transsnet.sims.storage.easybuy_aad.tables.daos.AadSaConfigDao;
import com.transsnet.sims.storage.easybuy_aad.tables.pojos.AadSaConfig;
import com.transsnet.sims.storage.easybuy_aad.tables.records.AadSaConfigRecord; @Component
public class DemoBis { @Autowired
private AadSaConfigDao aadSaConfigDao;
@Autowired
private DSLContext dslContext; private com.transsnet.sims.storage.easybuy_aad.tables.AadSaConfig aadSaConfig = Tables.AAD_SA_CONFIG;
private com.transsnet.sims.storage.easybuy_aad.tables.AadPosConfig aadPosConfig = Tables.AAD_POS_CONFIG;
private com.transsnet.sims.storage.easybuy_aad.tables.AadRetailerConfig aadRetailerConfig = Tables.AAD_RETAILER_CONFIG;
private com.transsnet.sims.storage.easybuy_aad.tables.AadIndexTable aadIndexTable = Tables.AAD_INDEX_TABLE; /**
* 分页查询list
* @param pageNum
* @param pageSize
* @param dto
* @return
*/
public PageDto pageList(int pageNum, int pageSize, SaDto dto) {
SelectJoinStep<Record> selectRecord = dslContext.select().from(aadSaConfig);
SelectJoinStep<Record1<Integer>> selectCountRecord = dslContext.selectCount().from(aadSaConfig);
// 写一个一定成立的条件,这里写主键不为空
Condition eq = aadSaConfig.ID.isNotNull();
// 按需要拼接查询条件
if(StringUtils.isNotBlank(dto.getSaId())) {
eq = eq.and(aadSaConfig.SA_ID.like("%" + dto.getSaId() + "%"));
}
if(StringUtils.isNotBlank(dto.getStatus())) {
eq = eq.and(aadSaConfig.STATUS.eq(dto.getStatus()));
} // 查询总数
Integer count = selectCountRecord.where(eq).fetchOne().into(Integer.class); // 构造分页组件
PageDto pageDto = new PageDto(pageNum, pageSize, count); // 查询数据
List<AadSaConfig> list = selectRecord.where(eq).orderBy(aadSaConfig.ID.desc())
.limit(pageSize)
.offset(pageSize * (pageNum - 1))
.fetchInto(AadSaConfig.class);
pageDto.setList(list); return pageDto;
} /**
* 查询list
* @param dto
* @return
*/
public List<AadSaConfig> fetchList(SaDto dto) {
SelectJoinStep<Record> selectRecord = dslContext.select().from(aadSaConfig);
// 写一个一定成立的条件,这里写主键不为空
Condition eq = aadSaConfig.ID.isNotNull();
// 按需要拼接查询条件
if(StringUtils.isNotBlank(dto.getSaId())) {
eq = eq.and(aadSaConfig.SA_ID.like("%" + dto.getSaId() + "%"));
}
if(StringUtils.isNotBlank(dto.getStatus())) {
eq = eq.and(aadSaConfig.STATUS.eq(dto.getStatus()));
} // 查询数据
List<AadSaConfig> list = selectRecord.where(eq).orderBy(aadSaConfig.ID.desc())
.fetchInto(AadSaConfig.class); return list;
} /**
* 根据销售id查询详细
* @param saId
* @return
*/
public AadSaConfig detail(String saId) {
List<AadSaConfig> beans = aadSaConfigDao.fetchBySaId(saId);
if(!CollectionUtils.isEmpty(beans)) {
return beans.get(0);
}
return null;
} /**
* 新增记录
*/
@Transactional
public void create(SaDto dto) {
// 查询销售序列值,行锁select for update
Integer index = dslContext.select(aadIndexTable.INDEX).from(aadIndexTable)
.where(aadIndexTable.TABLE.eq("aad_sa_config").and(aadIndexTable.FIELD.eq("sa_id")))
.forUpdate()
.fetchOneInto(Integer.class); // 填充销售ID为定长字段,5位长度
String saId = "SA" + String.format("%05d", index); dslContext.insertInto(aadSaConfig)
.set(aadSaConfig.SA_ID, saId) // 销售Id按规则自增
.set(aadSaConfig.STATUS, dto.getStatus())
.execute(); // 添加记录成功后需要将index加1
dslContext.update(aadIndexTable).set(aadIndexTable.INDEX, ++index)
.where(aadIndexTable.TABLE.eq("aad_sa_config").and(aadIndexTable.FIELD.eq("sa_id")))
.execute();
} /**
* 更新记录
*/
public void update(SaDto dto) {
UpdateSetFirstStep<AadSaConfigRecord> updateRecord = dslContext.update(aadSaConfig);
UpdateSetMoreStep<AadSaConfigRecord> setRecord = null;
if(StringUtils.isNotBlank(dto.getSaName())) {
setRecord = updateRecord.set(aadSaConfig.SA_NAME, dto.getSaName().toUpperCase());
}
if(StringUtils.isNotBlank(dto.getStatus())) {
setRecord = updateRecord.set(aadSaConfig.STATUS, dto.getStatus());
} if(setRecord == null) {
return ;
}
setRecord.where(aadSaConfig.SA_ID.eq(dto.getSaId())).execute();
} /**
* 删除记录
*/
public void delete(String saId) {
dslContext.delete(aadSaConfig).where(aadSaConfig.SA_ID.eq(saId)).execute();
} /**
* 根据销售名称查询销售信息
* @param saName
* @return
*/
public List<Map<String, String>> fetchSaByName(String saName){
// 查询指定的字段
Result<Record2<String, String>> resultRecord = dslContext.select(aadSaConfig.SA_ID, aadSaConfig.SA_NAME)
.from(aadSaConfig)
.where(aadSaConfig.SA_NAME.like("%" + saName + "%"))
.fetch();
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
// 获取查询出来的字段值
for(Record2<String, String> record : resultRecord) {
Map<String, String> item = new HashMap<String, String>();
item.put("label", record.getValue(aadSaConfig.SA_NAME));
item.put("value", record.getValue(aadSaConfig.SA_ID));
list.add(item);
}
return list;
} /**
* 联表更新数据
* @param dto
*/
public void updatePos(PosDto dto) {
/*
* 最初是想使用insert into select,但是jooq中只能整表复制,但我们只需要某几个字段
* 尝试过先insert,然后再update,但这样比较消耗性能
* 试了几次后发现最好还是先把所需数据查出来,再进行插入
*/ // 获取商户相关信息,赋值到门店上
RetailerDto retailer = dslContext.selectFrom(aadRetailerConfig).where(aadRetailerConfig.RETAILER_ID.eq(dto.getRetailerId())).fetchOneInto(RetailerDto.class); // 新增数据
dslContext.insertInto(aadPosConfig)
.set(aadPosConfig.POS_ID, dto.getPosId())
.set(aadPosConfig.POS_NAME, dto.getPosName())
.set(aadPosConfig.RETAILER_ID, retailer.getRetailerId())
.set(aadPosConfig.RETAILER_NAME, retailer.getRetailerName())
.execute();
}
}

三.注意

  这里只是用法示例,很多字段被省略,而且现有的实体类都已经构建好了。

  Jooq搭建项目相关的分享,会逐渐补充完善。

jooq使用示例的更多相关文章

  1. jooq实践

    用法 sql语句 SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*) FROM AUTHOR JOIN BOOK ON AUTHOR.ID = B ...

  2. ORM “杀器”之 JOOQ

    ORM “杀器”之 JOOQ IN 后端编程,JAVA,敏捷开发,数据库 JOOQ是啥? JOOQ 是基于Java访问关系型数据库的工具包,轻量,简单,并且足够灵活,可以轻松的使用Java面向对象语法 ...

  3. [jOOQ中文] 七个步骤快速入门

    https://segmentfault.com/a/1190000010415384 关于jOOQ jOOQ: The easiest way to write SQL in Java jOOQ是一 ...

  4. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  5. .NET跨平台之旅:将示例站点升级至 ASP.NET Core 1.1

    微软今天在 Connect(); // 2016 上发布了 .NET Core 1.1 ,ASP.NET Core 1.1 以及 Entity Framework Core 1.1.紧跟这次发布,我们 ...

  6. 通过Jexus 部署 dotnetcore版本MusicStore 示例程序

    ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示 ...

  7. WCF学习之旅—第三个示例之四(三十)

           上接WCF学习之旅—第三个示例之一(二十七)               WCF学习之旅—第三个示例之二(二十八)              WCF学习之旅—第三个示例之三(二十九)   ...

  8. JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例

    一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...

  9. XAMARIN ANDROID 二维码扫描示例

    现在二维码的应用越来越普及,二维码扫描也成为手机应用程序的必备功能了.本文将基于 Xamarin.Android 平台使用 ZXing.Net.Mobile  做一个简单的 Android 条码扫描示 ...

随机推荐

  1. C# 事件与继承

    在窗体编程过程中,常常会封装一个基类,包含未来业务中常用的属性.方法.委托.事件等,但是事件作为一个特殊的委托,只能在声明类中调用,派生类都不可以调用,所以在基类中必须实现一个虚函数,实现事件的调用, ...

  2. BUUCTF-[网鼎杯 2018]Fakebook(SSRF+联合注入绕Waf)

    记一道SSRF配合SQL注入的题. 喜欢在做题之前扫一下网站的目录,扫到了robots.txt文件可以访问,拿到user.php.bak的源码.同时还有flag.php. <?php class ...

  3. JavaScript学习02(js快速入门)

    快速入门 基本语法 JavaScript的语法和Java的语法类似,每个语句以;结束,语句块用{...}.但是JavaScrip并不强制要求在每个语句的结尾加;,浏览器中负责执行JavaScript代 ...

  4. Dll文件的创建与测试C#

    创建Dll文件 首先使用VS 2019创建Dll项目,创建项目时选择"类库",如下图 在项目中创建类文件,添加测试代码: namespace PlantSim_C_Interfac ...

  5. PHP下对Mysql数据库的操作

    PHP连接数据库: 使用 mysqli-connect()函数,函数里面至少填三个变量:host,用户名,密码. $dbHost="localhost"; $dbUser=&quo ...

  6. NOIP 模拟 $30\; \rm 毛二琛$

    题解 \(by\;zj\varphi\) 原题问的就是对于一个序列,其中有的数之间有大小关系限制,问有多少种方案. 设 \(dp_{i,j}\) 表示在前 \(i\) 个数中,第 \(i\) 个的排名 ...

  7. Linux 分区扩容(根分区扩容,SWAP 分区扩容,挂载新分区为目录)

    请访问原文链接:https://sysin.org/blog/linux-partition-expansion/,查看最新版.原创作品,转载请保留出处. 作者:gc(at)sysin.org,主页: ...

  8. C#高级应用之------HashTable、HashSet和Dictionary的区别(转)

    原文url:http://www.cnblogs.com/akwwl/p/3680376.html 今天又去面试了,结果依然很悲催,平时太过于关注表面上的东西,有些实质却不太清楚,遇到HashTabl ...

  9. COM笔记-关于GUID

    GUID 它实际上是组件和接口的标识号 static const IID IID_IX = { 0x1ee235bd, 0x2e73, 0x49c2, 0xa5, 0x7c, 0x8b, 0xe5, ...

  10. 如何在指定的地址上创建C++对象

    如果已经掌握在静态存储区上创建对象的方法,那么可以扩展一下,可以在任意地址上创建C++对象. 解决方案:-在类中重载new/delete操作符-在new的操作符重载函数中返回指定的地址-在delete ...