一.说明

  最近使用的项目,采用了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. RecyclerView跳转到指定位置的几种种方式

    Mark一下: http://blog.csdn.net/huangxiaoguo1/article/details/53706971 https://www.jianshu.com/p/3acc39 ...

  2. C++ //拷贝构造函数调用时机//1.使用一个已经创建完毕的对象来初始化一个新对象 //2.值传递的方式给函数参数传值 //3.值方式返回局部对象

    1 //拷贝构造函数调用时机 2 3 4 #include <iostream> 5 using namespace std; 6 7 //1.使用一个已经创建完毕的对象来初始化一个新对象 ...

  3. C++ 结构体+数组+取随机数 案例(打印3名老师 带着 5名学生)结构体

    1 //结构体案列 2 3 #include<iostream> 4 #include<string> 5 #include<ctime> 6 using name ...

  4. 智能合约审计-不安全的delegatecall

    简介 当合约A以delegatecall方式调用时, 相当于将外部合约B的func()代码复制过来 (其函数中涉及的变量或函数都需要在本地存在), 在合约A上下文空间中执行. 合约 pragma so ...

  5. Docker命令图

    attach #当前shell下 attach连接指定运行镜像 build #通过DockerFile 定制镜像 commit #提交当前容器为新的镜像 cp #从容器中拷贝指定文件或者目录到宿主机中 ...

  6. SpringMVC学习04(数据处理及跳转)

    4.数据处理及跳转 4.1结果跳转方式 4.1.1 ModelAndView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 . 页面 : {视图解析器前缀} ...

  7. docker 搭建kafka集群(入门版)

    1.环境 docker, docker-compose 2.zk-kafka.yml version: '3' services: zoo1: image: zookeeper:3.4.14 rest ...

  8. 使用 C# 下载文件的十八般武艺

    文件下载是一个软件开发中的常见需求.本文从最简单的下载方式开始步步递进,讲述了文件下载过程中的常见问题并给出了解决方案.并展示了如何使用多线程提升 HTTP 的下载速度以及调用 aria2 实现非 H ...

  9. Python - typing 模块 —— TypeVar 泛型

    前言 typing 是在 python 3.5 才有的模块 前置学习 Python 类型提示:https://www.cnblogs.com/poloyy/p/15145380.html 常用类型提示 ...

  10. (五)Linux之文件与目录管理以及文本处理

    Linux之文件与目录管理 目录 Linux之文件与目录管理 前言 绝对路径与相对路径说明: 一.目录常用命令 常用处理目录的命令: 切换目录 cd 显示当前路径 pwd 查看目录下文件 ls 创建目 ...