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

posted @ 2019-06-21 12:13  向东方  阅读(5170)  评论(0编辑  收藏  举报