这篇博客我们介绍一下关于Mybatis-Plus相关的知识,Mybatis-Plus可以简单的理解为Mybatis的加强,其在Mybatis的基础上完成了一些封装,这样开发人员在使用起来就很容易和方便(确实是一个很好的框架),官网Mybatis-Plus
在使用Mybatis-Plus中我们可能用到一个比较多的类是BaseMapper接口,其最终也是利用的Mybatis接口编程的实现机制,其默认提供了一系列的增删改查的基础方法,并且开发人员对于这些基础操作不需要写SQL进行处理操作(Mybatis提供的机制就是需要开发人员在mapper.xml中提供sql语句),那样我们可以猜测肯定是Mybatis-Plus完成了BaseMapper接口提供的方法的SQL语句的生成操作。
BaseMapper类:
public interface BaseMapper<T> { /** * <p> * 插入一条记录 * </p> * * @param entity 实体对象 */ Integer insert(T entity); /** * <p> * 根据 ID 删除 * </p> * * @param id 主键ID */ Integer deleteById(Serializable id); /** * <p> * 根据 columnMap 条件,删除记录 * </p> * * @param columnMap 表字段 map 对象 */ Integer deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); /** * <p> * 根据 entity 条件,删除记录 * </p> * * @param queryWrapper 实体对象封装操作类(可以为 null) */ Integer delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * <p> * 删除(根据ID 批量删除) * </p> * * @param idList 主键ID列表(不能为 null 以及 empty) */ Integer deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); /** * <p> * 根据 ID 修改 * </p> * * @param entity 实体对象 */ Integer updateById(@Param(Constants.ENTITY) T entity); /** * <p> * 根据 whereEntity 条件,更新记录 * </p> * * @param entity 实体对象 (set 条件值,不能为 null) * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句) */ Integer update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper); /** * <p> * 根据 ID 查询 * </p> * * @param id 主键ID */ T selectById(Serializable id); /** * <p> * 查询(根据ID 批量查询) * </p> * * @param idList 主键ID列表(不能为 null 以及 empty) */ List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); /** * <p> * 查询(根据 columnMap 条件) * </p> * * @param columnMap 表字段 map 对象 */ List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); /** * <p> * 根据 entity 条件,查询一条记录 * </p> * * @param queryWrapper 实体对象 */ T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * <p> * 根据 Wrapper 条件,查询总记录数 * </p> * * @param queryWrapper 实体对象 */ Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * <p> * 根据 entity 条件,查询全部记录 * </p> * * @param queryWrapper 实体对象封装操作类(可以为 null) */ List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * <p> * 根据 Wrapper 条件,查询全部记录 * </p> * * @param queryWrapper 实体对象封装操作类(可以为 null) */ List<Map<String, Object>> selectMaps( @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * <p> * 根据 Wrapper 条件,查询全部记录 * 注意: 只返回第一个字段的值 * </p> * * @param queryWrapper 实体对象封装操作类(可以为 null) */ List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * <p> * 根据 entity 条件,查询全部记录(并翻页) * </p> * * @param page 分页查询条件(可以为 RowBounds.DEFAULT) * @param queryWrapper 实体对象封装操作类(可以为 null) */ IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * <p> * 根据 Wrapper 条件,查询全部记录(并翻页) * </p> * * @param page 分页查询条件 * @param queryWrapper 实体对象封装操作类 */ IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); }
在Mybatis-Plus中提供了SqlMethod类,从这个类中我们可以看到针对BaseMapper类中的每个方法,SqlMethod都提供了一个SQL语句的模板来生成SQL语句,最终还是一个namespace+method对应一条sql语句
public enum SqlMethod { /** * 插入 */ INSERT_ONE( "insert", "插入一条数据(选择字段插入)", "<script>INSERT INTO %s %s VALUES %s</script>"), /** * 删除 */ DELETE_BY_ID( "deleteById", "根据ID 删除一条数据", "<script>DELETE FROM %s WHERE %s=#{%s}</script>"), DELETE_BY_MAP( "deleteByMap", "根据columnMap 条件删除记录", "<script>DELETE FROM %s %s</script>"), DELETE( "delete", "根据 entity 条件删除记录", "<script>DELETE FROM %s %s</script>"), DELETE_BATCH_BY_IDS( "deleteBatchIds", "根据ID集合,批量删除数据", "<script>DELETE FROM %s WHERE %s IN (%s)</script>"), /** * 逻辑删除 */ LOGIC_DELETE_BY_ID( "deleteById", "根据ID 逻辑删除一条数据", "<script>UPDATE %s %s WHERE %s=#{%s} %s</script>"), LOGIC_DELETE_BY_MAP( "deleteByMap", "根据columnMap 条件逻辑删除记录", "<script>UPDATE %s %s %s</script>"), LOGIC_DELETE( "delete", "根据 entity 条件逻辑删除记录", "<script>UPDATE %s %s %s</script>"), LOGIC_DELETE_BATCH_BY_IDS( "deleteBatchIds", "根据ID集合,批量逻辑删除数据", "<script>UPDATE %s %s WHERE %s IN (%s) %s</script>"), /** * 修改 */ UPDATE_BY_ID( "updateById", "根据ID 选择修改数据", "<script>UPDATE %s %s WHERE %s=#{%s} %s</script>"), UPDATE( "update", "根据 whereEntity 条件,更新记录", "<script>UPDATE %s %s %s</script>"), /** * 逻辑删除 -> 修改 */ LOGIC_UPDATE_BY_ID( "updateById", "根据ID 修改数据", "<script>UPDATE %s %s WHERE %s=#{%s} %s</script>"), LOGIC_UPDATE_ALL_COLUMN_BY_ID( "updateAllColumnById", "根据ID 选择修改数据", "<script>UPDATE %s %s WHERE %s=#{%s} %s</script>"), /** * 查询 */ SELECT_BY_ID( "selectById", "根据ID 查询一条数据", "SELECT %s FROM %s WHERE %s=#{%s}"), SELECT_BY_MAP( "selectByMap", "根据columnMap 查询一条数据", "<script>SELECT %s FROM %s %s</script>"), SELECT_BATCH_BY_IDS( "selectBatchIds", "根据ID集合,批量查询数据", "<script>SELECT %s FROM %s WHERE %s IN (%s)</script>"), SELECT_ONE( "selectOne", "查询满足条件一条数据", "<script>SELECT %s FROM %s %s</script>"), SELECT_COUNT( "selectCount", "查询满足条件总记录数", "<script>SELECT COUNT(1) FROM %s %s</script>"), SELECT_LIST( "selectList", "查询满足条件所有数据", "<script>SELECT %s FROM %s %s</script>"), SELECT_PAGE( "selectPage", "查询满足条件所有数据(并翻页)", "<script>SELECT %s FROM %s %s</script>"), SELECT_MAPS( "selectMaps", "查询满足条件所有数据", "<script>SELECT %s FROM %s %s</script>"), SELECT_MAPS_PAGE( "selectMapsPage", "查询满足条件所有数据(并翻页)", "<script>SELECT %s FROM %s %s</script>"), SELECT_OBJS( "selectObjs", "查询满足条件所有数据", "<script>SELECT %s FROM %s %s</script>"), /** * 逻辑删除 -> 查询 */ LOGIC_SELECT_BY_ID( "selectById", "根据ID 查询一条数据", "SELECT %s FROM %s WHERE %s=#{%s} %s"), LOGIC_SELECT_BATCH_BY_IDS( "selectBatchIds", "根据ID集合,批量查询数据", "<script>SELECT %s FROM %s WHERE %s IN (%s) %s</script>"); private final String method; private final String desc; private final String sql; SqlMethod(String method, String desc, String sql) { this.method = method; this.desc = desc; this.sql = sql; } public String getMethod() { return method; } public String getDesc() { return desc; } public String getSql() { return sql; } }