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


因为JOOQ对Spring Boot有很好的支持 , 所以我们只需要引入相应的starter依赖即可 , 而具体的版本则是与Spring Boot的版本关联的 , 这里并不需要我们去指定 。

其次 , 我们需要在项目中配置JOOQ的代码生成插件 , 这样JOOQ就可以自动在项目编译的时候为我们生成所需要的数据库以来对象了 , 在项目的pom.xml中配置Maven插件 , 如下:

配置完成这个Maven插件后 , 基本上JOOQ就算差不多与SpringBoot集成完成了 , 如果此时编译项目JOOQ代码插件就会在target/generated-sources/jooq目录下根据数据库中的表结构生成相应的数据库操作对象 , 而这个过程则完成对开发人员透明 , 我们并不需要做额外的事情 。

而在具体的业务逻辑中 , 需要操作数据库时我们就可以很方便的使用这些自动生成的代码来进行操作 , 例如 , 我们需要在业务代码中执行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) {