Interface UpdateDSLCompleter

  • All Superinterfaces:
    Function<UpdateDSL<UpdateModel>,​Buildable<UpdateModel>>
    Functional Interface:
    This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.

    @FunctionalInterface
    public interface UpdateDSLCompleter
    extends Function<UpdateDSL<UpdateModel>,​Buildable<UpdateModel>>
    Represents a function that can be used to create a general update method. When using this function, you can create a method that does not require a user to call the build() and render() methods - making client code look a bit cleaner.

    This function is intended to be used in conjunction in the utility method like MyBatis3Utils.update(ToIntFunction, SqlTable, UpdateDSLCompleter)

    For example, you can create mapper interface methods like this:

     @UpdateProvider(type=SqlProviderAdapter.class, method="update")
     int update(UpdateStatementProvider updateStatement);
    
     default int update(UpdateDSLCompleter completer) {
            return MyBatis3Utils.update(this::update, person, completer);
     }
     

    And then call the simplified default method like this:

     int rows = mapper.update(c ->
                    c.set(firstName).equalTo("Fred")
                    .where(id, isEqualTo(100))
                );
     

    You can implement an "update all" simply by omitting a where clause:

     int rows = mapper.update(c ->
                    c.set(firstName).equalTo("Fred")
                );
     

    You could also implement a helper method that would set fields based on values of a record. For example, the following method would set all fields of a record based on whether or not the values are null:

     static UpdateDSL<UpdateModel> updateSelectiveColumns(PersonRecord record,
             UpdateDSL<UpdateModel> dsl) {
         return dsl.set(id).equalToWhenPresent(record::getId)
                 .set(firstName).equalToWhenPresent(record::getFirstName)
                 .set(lastName).equalToWhenPresent(record::getLastName)
                 .set(birthDate).equalToWhenPresent(record::getBirthDate)
                 .set(employed).equalToWhenPresent(record::getEmployed)
                 .set(occupation).equalToWhenPresent(record::getOccupation);
     }
     

    The helper method could be used like this:

     rows = mapper.update(c ->
            PersonMapper.updateSelectiveColumns(record, c)
            .where(id, isLessThan(100)));
     

    In this way, you could mimic the function of the old style "updateByExampleSelective" methods from MyBatis Generator.

    Author:
    Jeff Butler