jooq使用示例
一.说明
最近使用的项目,采用了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使用示例的更多相关文章
- jooq实践
用法 sql语句 SELECT AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME, COUNT(*) FROM AUTHOR JOIN BOOK ON AUTHOR.ID = B ...
- ORM “杀器”之 JOOQ
ORM “杀器”之 JOOQ IN 后端编程,JAVA,敏捷开发,数据库 JOOQ是啥? JOOQ 是基于Java访问关系型数据库的工具包,轻量,简单,并且足够灵活,可以轻松的使用Java面向对象语法 ...
- [jOOQ中文] 七个步骤快速入门
https://segmentfault.com/a/1190000010415384 关于jOOQ jOOQ: The easiest way to write SQL in Java jOOQ是一 ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- .NET跨平台之旅:将示例站点升级至 ASP.NET Core 1.1
微软今天在 Connect(); // 2016 上发布了 .NET Core 1.1 ,ASP.NET Core 1.1 以及 Entity Framework Core 1.1.紧跟这次发布,我们 ...
- 通过Jexus 部署 dotnetcore版本MusicStore 示例程序
ASPNET Music Store application 是一个展示最新的.NET 平台(包括.NET Core/Mono等)上使用MVC 和Entity Framework的示例程序,本文将展示 ...
- WCF学习之旅—第三个示例之四(三十)
上接WCF学习之旅—第三个示例之一(二十七) WCF学习之旅—第三个示例之二(二十八) WCF学习之旅—第三个示例之三(二十九) ...
- JavaScript学习笔记(一)——延迟对象、跨域、模板引擎、弹出层、AJAX示例
一.AJAX示例 AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效 ...
- XAMARIN ANDROID 二维码扫描示例
现在二维码的应用越来越普及,二维码扫描也成为手机应用程序的必备功能了.本文将基于 Xamarin.Android 平台使用 ZXing.Net.Mobile 做一个简单的 Android 条码扫描示 ...
随机推荐
- C语言中变参函数传参探究
背景引入 近期在看一本书,叫做<嵌入式C语言自我修养>,写的内容对我帮助很大,是一本好书.在第6章,GNU C编译器扩展语法精讲一节,这本书给出了一些变参函数的例子: //1.变参函数初体 ...
- SpringBoot - Bean validation 参数校验
目录 前言 常见注解 参数校验的应用 依赖 简单的参数校验示例 级联校验 @Validated 与 @Valid 自定义校验注解 前言 后台开发中对参数的校验是不可缺少的一个环节,为了解决如何优雅的对 ...
- 关于Linux下Texlive无法找到已安装字体的问题与解决
关于Linux下Texlive无法找到已安装字体的问题与解决 当我在Ubuntu系统下使用Latex时,在编译渲染时报出了Font "xxx" does not contain r ...
- Check Directory Existence in Shell
The following command in one line can check if a directory exists. You can check the return value (& ...
- linux的iptables设置
添加规则 -A 在链末尾追加一条规则 -I 在链开头或某序号前插入一条规则 查看规则 -L 列出所有规则 -n 数字显示地址和端口信息 -v 详细信息 -line-numbers 显示规则序号 删除规 ...
- Redis-02-主从复制和哨兵模式
安全认证 开启认证 redis默认开启了保护模式,只允许本地回环地址登录并访问数据库 修改redis的配置文件,并重启redis的服务 vim /opt/redis_cluster/redis_637 ...
- Java JVM【笔记】
Java JVM[笔记] Java的平台无关性是如何实现的? Java源码首先被编译成字节码,再由不同的平台的JVM进行解析,Java语言在不同的平台上运行时不需要进行重新编译,Java虚拟机在执行字 ...
- noip23
T1 好吧,题目很sb,描述告诉你序列无限长,输入格式里告诉你m为序列长度,我:????,选择了相信后者.然后连暴力都挂分,可恶 这题一看就是个毒瘤数据结构题,思索了一下,发现就是个线段树,但我又想到 ...
- noip14
T1 考试假贪心,20pts,能摧毁就摧毁,不管前边已经摧毁的水晶. 正解: 首先肯定要离散化,然后考虑dp,设 \(dp_{i,j}\) 表示当前处理到了i,摧毁掉的水晶的a最小为j,则转移方程: ...
- malloc 和new , free 和delete的区别
#include <iostream>using namespace std;class user{ public: int age; int number; void test() { ...