> {
/**
* 保存实体,默认主键自增,并且名称为 id
*
* 这个方法是个示例,你可以在自己的接口中使用相同的方式覆盖父接口中的配置
*
* @param entity 实体类
* @return 1成功,0失败
*/
@Override
@Lang(Caching.class)
@Options(useGeneratedKeys = true, keyProperty = "id")
@InsertProvider(type = EntityProvider.class, method = "insert")
int insert(T entity);
/**
* 保存实体中不为空的字段,默认主键自增,并且名称为 id
*
* 这个方法是个示例,你可以在自己的接口中使用相同的方式覆盖父接口中的配置
*
* @param entity 实体类
* @return 1成功,0失败
*/
@Override
@Lang(Caching.class)
@Options(useGeneratedKeys = true, keyProperty = "id")
@InsertProvider(type = EntityProvider.class, method = "insertSelective")
int insertSelective(T entity);
/**
* 根据主键更新实体中不为空的字段,强制字段不区分是否 null,都更新
*
* 当前方法来自 {@link io.mybatis.mapper.fn.FnMapper},该接口中的其他方法用 {@link ExampleMapper} 也能实现
*
* @param entity 实体类
* @param forceUpdateFields 强制更新的字段,不区分字段是否为 null,通过 {@link Fn#of(Fn...)} 创建 {@link Fn.Fns}
* @return 1成功,0失败
*/
@Lang(Caching.class)
@UpdateProvider(type = FnProvider.class, method = "updateByPrimaryKeySelectiveWithForceFields")
int updateByPrimaryKeySelectiveWithForceFields(@Param("entity") T entity, @Param("fns") Fn.Fns forceUpdateFields);
/**
* 根据指定字段集合查询:field in (fieldValueList)
*
* 这个方法是个示例,你也可以使用 Java8 的默认方法实现一些通用方法
*
* @param field 字段
* @param fieldValueList 字段值集合
* @param 字段类型
* @return 实体列表
*/
default List selectByFieldList(Fn field, List fieldValueList) {
Example example = new Example<>();
example.createCriteria().andIn((Fn) field, fieldValueList);
return selectByExample(example);
}
/**
* 根据指定字段集合删除:field in (fieldValueList)
*
* 这个方法是个示例,你也可以使用 Java8 的默认方法实现一些通用方法
*
* @param field 字段
* @param fieldValueList 字段值集合
* @param 字段类型
* @return 实体列表
*/
default int deleteByFieldList(Fn field, List fieldValueList) {
Example example = new Example<>();
example.createCriteria().andIn((Fn) field, fieldValueList);
return deleteByExample(example);
}
}
```
这个接口展示了好几个通用方法的特点:
1. 可以继承其他通用接口
2. 可以重写继承接口的定义
3. 可以直接复制其他接口中的通用方法定义
4. 可以使用 Java8 默认方法灵活实现通用方法
在下面内容中,还能看到一个特点,“5. 那就是一个 provider 实现,通过修改接口方法的返回值和入参,就能变身无数个通用方法”,通用方法的实现极其容易。
点击[查看详细介绍](./mapper/README.md)。
## 3. extend 模块
基于 **mybatis-mapper/provider** 核心部分扩展更新表和列的信息,可以直接配合 mapper 使用。
这个模块有两个作用:
1. 演示如何通过 SPI 扩展实体的配置信息。
2. 通过扩展支持更多可用的配置项。
点击[查看详细介绍](./extend/README.md)。
## 4. common 模块
当前模块包含了简单的封装代码,这部分的代码在 service 和 activerecord 中被用到,
如果不使用这两个包的功能,也不需要 common 模块的代码。
点击[查看详细介绍](./common/README.md)。
## 5. service 模块
service 模块对应开发中的 service 层,或者说是 Spring 中的 `@Service` 标记的类。
这一层基于 mapper 模块中的 `Mapper` 接口,封装了大量开箱即用的 service 层方法。
点击[查看详细介绍](./service/README.md)。
## 6. activerecord 模块
>**[Active Record](https://zh.wikipedia.org/wiki/Active_Record)** 模式
>
>在软件工程中,主动记录模式(active record pattern)是一种架构模式,
> 可见于在关系数据库中存储内存中对象的软件中。
> 它在Martin Fowler的2003年著《企业应用架构的模式》书中命名。
> 符合这个模式的对象的接口将包括函数比如插入、更新和删除,
> 加上直接对应于在底层数据库表格中列的或多或少的属性。
>
>主动记录模式是访问在数据库中的数据的一种方式。数据库表或视图被包装入类。
> 因此,对象实例被链接到这个表格的一个单一行。
> 在一个对象创建之后,在保存时将一个新行增加到表格中。
> 加载的任何对象都从数据库得到它的信息。在一个对象被更新的时候,
> 在表格中对应的行也被更新。包装类为在表格或视图中的每个列都实现访问器方法或属性。
activerecord 模块提供了 4 个接口类、1个工具类、1个配置类和1个Spring Boot自动配置类。
点击[查看详细介绍](./activerecord/README.md)。