一.說明
最近使用的項目,采用了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搭建項目相關的分享,會逐漸補充完善。