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 row based on whether 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