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搭建项目相关的分享,会逐渐补充完善。