自动化|为什么项目中用了JOOQ后大家都不愿再用Mybatis?( 二 )



而在具体的业务逻辑中 , 需要操作数据库时我们就可以很方便的使用这些自动生成的代码来进行操作 , 例如 , 我们需要在业务代码中执行insert操作 , 代码如下:
@Slf4j
@Service
public class OpenServiceImpl implements OpenService {

   @Autowired
   protected DSLContext dslContext;

   @Override
   public BalanceChargeTradeResVo balanceChargeTrade(BalanceChargeTradeReqVo balanceChargeTradeReqVo)
           throws VerifyDataException BalanceCreateOrderException {
       BalanceChargeTradeResVo balanceChargeTradeResVo;
       try {
           WalletUserBalanceOrderRecord walletUserBalanceOrderRecord = createBalanceChargeOrder(
                   balanceChargeTradeReqVo);
           dslContext.executeInsert(walletUserBalanceOrderRecord);
           balanceChargeTradeResVo = BalanceChargeTradeResVo.builder().userId(balanceChargeTradeReqVo.getUserId())
                   .amount(balanceChargeTradeReqVo.getAmount()).currency(balanceChargeTradeReqVo.getCurrency())
                   .orderId(walletUserBalanceOrderRecord.getOrderId()).businessType(BusinessType.TOP_UP.getCode())
                   .build();
           return balanceChargeTradeResVo;
        catch (Exception e) {
           throw new BalanceCreateOrderException(ErrorCode.BALANCE_CHARGE_ORDER_ERROR.getCode()
                   ErrorCode.BALANCE_CHARGE_ORDER_ERROR.getDesc());
       
   

在以上代码中 , 我们只需要在service业务类中注入DSLContext对象 , 并在组装完自动生成的数据库类的对象后执行executeInsert方法就可以完成insert操作了 。 而如果我们要完成查询操作 , 也可以很简单的实现 , 代码如下
@Slf4j
@Service
public class OpenServiceImpl implements OpenService {

   @Autowired
   protected DSLContext dslContext;

   @Override
   public BalanceQueryResVo balanceQuery(long userId) throws AccountNoExistException {
       List<WalletUserBalanceRecord> walletUserBalanceRecordList = dslContext
               .selectFrom(WalletUserBalance.WALLET_USER_BALANCE)
               .where(WalletUserBalance.WALLET_USER_BALANCE.USER_ID
                       .eq(String.valueOf(userId))).fetchInto(WalletUserBalanceRecord.class);
       if (walletUserBalanceRecordList == null || walletUserBalanceRecordList.size() <= 0) {
           throw new AccountNoExistException(ErrorCode.ACCOUNT_NO_EXIST_ERROR.getCode()
                   ErrorCode.ACCOUNT_NO_EXIST_ERROR.getDesc());
       
       Optional<WalletUserBalanceRecord> walletUserBalanceRecord = walletUserBalanceRecordList.stream()
               .filter(o -> o.getAccType().equals(String.valueOf(AccType.CASH_ACCOUNT.getCode()))).findFirst();
       BalanceQueryResVo balanceQueryResVo = BalanceQueryResVo.builder().userId(userId)
               .balance(walletUserBalanceRecordList.stream().mapToInt(o -> o.getBalance().intValue()).sum())
               .currency(walletUserBalanceRecord.get().getCurrency()).build();
       return balanceQueryResVo;
   

在如 代码中 , 我们需要通过自动代码生成的类指定表名 , 并以面向对象的语法方式组装查询条件后就可以完成查询操作了!这里只是简单介绍了两种通过JOOQ实现常见数据库操作的方法 , 更多的细节 , 大家可以参考JOOQ用户手册!

这样你会发现操作数据库更加方便快捷了 , 而且因为自动代码生成对开发者是透明的 , 所以整个工程的代码整洁度也提高了!PS:大家可以在自己的项目中试试JOOQ , 相信你一定不会后悔!