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搭建項目相關的分享,會逐漸補充完善。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM