Skip to content

SpecialCompatibility

GangCheng edited this page Jan 23, 2024 · 4 revisions

ReturnGeneratedKeys

  • When using useGeneratedKeys="true" in insert label of mapper-xml, the keyColumns="xxxx" must be set.
  • The JDBC driver'sConnection only provides a method defined as PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException; , the second parameter of this method indicates whether auto returns generatedKeys
  • The R2DBC driver's Statement does not provide any method to return generatedKeys automatically, the Statement only provides a method defined as Statement returnGeneratedValues(String... columns) to return generatedKeys, the columns is not nullable , so the key column name must be configured.
  • Reference:
  • Related Mapper XML

Result Ordered

  • Since r2dbc only return single Result(ResultSet in JDBC) each segment, so I change the resultOrdered process for hold result data for nested result mapping in order to reduce the cache generated when nested-result-map processing as much as possible
  • When using resultOrdered="true" in select label of mapper-xml, the DefaultReactiveResultHandler only hold the related result data for nested result mapping.
  • When using resultOrdered="false" in select label of mapper-xml (by default), the DefaultReactiveResultHandler hold all related result data for nested result mapping.
  • resultOrdered="false" Related Test
  • resultOrdered="true" Related Test

Transaction operation

  • To implement transaction operations:

    • When using mybatis-r2dbc without SpringFramework
      • the configuration of R2dbcConfiguration --> R2dbcEnvironment --> usingDefaultTransactionProxy must be true.
      R2dbcEnvironment r2dbcEnvironment = new R2dbcEnvironment.Builder("ENV-NAME")
                  .withDefaultTransactionProxy(true)  // this should be true
                  .connectionFactory(connectionFactory)
                  .build();
      r2dbcMybatisConfiguration.setR2dbcEnvironment(r2dbcEnvironment);
    • When using mybatis-r2dbc without SpringFramework
      • the transaction operation should be controlled by Spring's R2dbcTransactionManager
  • Manual transaction operation:

    ReactiveSqlSessionOperator reactiveSqlSessionOperator = new DefaultReactiveSqlSessionOperator(
                                      reactiveSqlSessionFactory
                              );
    // execute with specific ReactiveSqlSessionProfile to specify isolation level
    reactiveSqlSessionOperator.executeThenClose(ReactiveSqlSessionProfile.of(IsolationLevel.READ_UNCOMMITTED),
            (session, profile) -> {
                DeleteMapper deleteMapper = session.getMapper(DeleteMapper.class);
                // profile.forceToRollback(); // if execution required a rollback
                return deleteMapper.deleteByDeptNo(4L);
            }
    );
    // execute mono with default profile 
    reactiveSqlSessionOperator.executeMonoThenClose(
            (session, profile) -> {
                DeleteMapper deleteMapper = session.getMapper(DeleteMapper.class);
                // profile.forceToRollback(); // if execution required a rollback
                return deleteMapper.deleteByDeptNo(4L);
            }
    );
    // execute flux with default profile 
    reactiveSqlSessionOperator.executeManyAndCommit(
            (session, profile) -> {
                DeleteMapper deleteMapper = session.getMapper(DeleteMapper.class);
                // profile.forceToRollback(); // if execution required a rollback
                return deleteMapper.deleteByDeptNo(4L);
            }
    );
    • If execution run with given ReactiveSqlSession, you should use ReactiveSqlSessionOperator's static method like below:
    ReactiveSqlSession reactiveSqlSession = reactiveSqlSessionFactory.openSession(ReactiveSqlSessionProfile.of(IsolationLevel.READ_UNCOMMITTED));
    ReactiveSqlSessionOperator.executeMonoThenClose(reactiveSqlSession,
            (session, profile) -> {
                DeleteMapper deleteMapper = session.getMapper(DeleteMapper.class);
                // profile.forceToRollback(); // if execution required a rollback
                return deleteMapper.deleteByDeptNo(4L);
            }
    );

Other

  • Mapper Method's return type could be Flux<T>/Mono<T>/Mono<Void>/Flux<Void>, and void is not allowed.