diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/MapperModel.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/MapperModel.java index 78b3cab4..c0a6f465 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/MapperModel.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/MapperModel.java @@ -25,6 +25,11 @@ import com.mybatisflex.core.util.SqlUtil; import java.util.Optional; /** + *

使用 {@link BaseMapper} 进行 CRUD 操作的实体类的抽象接口。 + * + *

使用接口是为了方便拓展,该接口提供了简单的根据 主键 操作数据的方法, + * 实现类可以进行其他方法的扩展。 + * * @param 实体类类型 * @author 王帅 * @since 2023-07-23 @@ -32,47 +37,117 @@ import java.util.Optional; @SuppressWarnings({"unused", "unchecked"}) public interface MapperModel { + /** + *

获取实体类对应的 {@link BaseMapper} 接口。 + * + *

可以拓展该方法提高效率,例如: + *

{@code
+     * return AccountMapper.class;
+     * }
+ * + * @return {@link BaseMapper} 接口 + */ default BaseMapper baseMapper() { return Mappers.ofEntityClass((Class) getClass()); } + /** + *

获取实体类主键数据。 + * + *

可以拓展该方法提高效率,例如: + *

{@code
+     * return new Object[]{id};
+     * }
+ * + * @return 主键数据数组 + */ default Object[] getPkValues() { TableInfo tableInfo = TableInfoFactory.ofEntityClass(getClass()); return tableInfo.buildPkSqlArgs(this); } + /** + * 保存数据(自动忽略 {@code null} 值)。 + * + * @return {@code true} 保存成功,{@code false} 保存失败 + */ default boolean save() { return save(true); } + /** + * 保存数据,并设置是否忽略 {@code null} 值。 + * + * @param ignoreNulls 是否忽略 {@code null} 值 + * @return {@code true} 保存成功,{@code false} 保存失败 + */ default boolean save(boolean ignoreNulls) { return SqlUtil.toBool(baseMapper().insert((T) this, ignoreNulls)); } + /** + * 保存或者更新数据,如果实体类主键没有值,则 保存 数据;如果实体类主键有值,则 + * 更新 数据(全部自动忽略 {@code null} 值)。 + * + * @return {@code true} 保存或更新成功,{@code false} 保存或更新失败 + */ default boolean saveOrUpdate() { return saveOrUpdate(true); } + /** + * 保存或者更新数据,如果实体类主键没有值,则 保存 数据;如果实体类主键有值,则 + * 更新 数据,并设置是否忽略 {@code null} 值。 + * + * @param ignoreNulls 是否忽略 {@code null} 值 + * @return {@code true} 保存或更新成功,{@code false} 保存或更新失败 + */ default boolean saveOrUpdate(boolean ignoreNulls) { return SqlUtil.toBool(baseMapper().insertOrUpdate((T) this, ignoreNulls)); } + /** + * 根据实体类主键删除数据。 + * + * @return {@code true} 删除成功,{@code false} 删除失败 + */ default boolean removeById() { return SqlUtil.toBool(baseMapper().deleteById(getPkValues())); } + /** + * 根据实体类主键更新数据(自动忽略 {@code null} 值)。 + * + * @return {@code true} 更新成功,{@code false} 更新失败 + */ default boolean updateById() { return updateById(true); } + /** + * 根据实体类主键更新数据,并设置是否忽略 {@code null} 值。 + * + * @param ignoreNulls 是否忽略 {@code null} 值 + * @return {@code true} 更新成功,{@code false} 更新失败 + */ default boolean updateById(boolean ignoreNulls) { return SqlUtil.toBool(baseMapper().update((T) this, ignoreNulls)); } + /** + * 根据实体类主键获取一条数据。 + * + * @return 数据 + */ default T oneById() { return baseMapper().selectOneById(getPkValues()); } + /** + * 根据实体类主键获取一条数据,并封装为 {@link Optional} 返回。 + * + * @return 数据 + */ default Optional oneByIdOpt() { return Optional.ofNullable(oneById()); }