1、创建具体的Mapper接口
/** * * 具体操作数据库的 Mapper接口,需要继承通用Mapper提供的核心接口 Mapper<T> * 泛型类型就是实体类的类型 * */ public interface EmployeeMapper extends Mapper<Employee> { }
2、Mapper<T> 里面有什么
Mapper<T> 的声明
@tk.mybatis.mapper.annotation.RegisterMapper public interface Mapper<T> extends BaseMapper<T>, ExampleMapper<T>, RowBoundsMapper<T>, Marker { }
(1)BaseMapper<T>
@tk.mybatis.mapper.annotation.RegisterMapper public interface BaseMapper<T> extends BaseSelectMapper<T>, BaseInsertMapper<T>, BaseUpdateMapper<T>, BaseDeleteMapper<T> { }
① BaseSelectMapper<T>:定义基本的查询操作
/** * 通用Mapper接口,基础查询 * * @param <T> 不能为空 * @author liuzh */ @RegisterMapper public interface BaseSelectMapper<T> extends SelectOneMapper<T>, SelectMapper<T>, SelectAllMapper<T>, SelectCountMapper<T>, SelectByPrimaryKeyMapper<T>, ExistsWithPrimaryKeyMapper<T> { } @RegisterMapper public interface SelectOneMapper<T> { /** * 根据实体中的属性进行查询,只能有一个返回值,有多个结果是抛出异常,查询条件使用等号 * * @param record * @return */ @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL") T selectOne(T record); } @RegisterMapper public interface SelectMapper<T> { /** * 根据实体中的属性值进行查询,查询条件使用等号 * * @param record * @return */ @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL") List<T> select(T record); } @RegisterMapper public interface SelectAllMapper<T> { /** * 查询全部结果 * * @return */ @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL") List<T> selectAll(); } @RegisterMapper public interface SelectCountMapper<T> { /** * 根据实体中的属性查询总数,查询条件使用等号 * * @param record * @return */ @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL") int selectCount(T record); } @RegisterMapper public interface SelectByPrimaryKeyMapper<T> { /** * 根据主键字段进行查询,方法参数必须包含完整的主键属性,查询条件使用等号 * * @param key * @return */ @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL") T selectByPrimaryKey(Object key); } @RegisterMapper public interface ExistsWithPrimaryKeyMapper<T> { /** * 根据主键字段查询总数,方法参数必须包含完整的主键属性,查询条件使用等号 * * @param key * @return */ @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL") boolean existsWithPrimaryKey(Object key); }
② BaseInsertMapper<T>:定义基本的插入操作
/** * 通用Mapper接口,基础查询 * * @param <T> 不能为空 * @author liuzh */ @RegisterMapper public interface BaseInsertMapper<T> extends InsertMapper<T>, InsertSelectiveMapper<T> { } @RegisterMapper public interface InsertMapper<T> { /** * 保存一个实体,null的属性也会保存,不会使用数据库默认值 * * @param record * @return */ @InsertProvider(type = BaseInsertProvider.class, method = "dynamicSQL") int insert(T record); } @RegisterMapper public interface InsertSelectiveMapper<T> { /** * 保存一个实体,null的属性不会保存,会使用数据库默认值 * * @param record * @return */ @InsertProvider(type = BaseInsertProvider.class, method = "dynamicSQL") int insertSelective(T record); }
③ BaseUpdateMapper<T>:定义基本的更新操作
/** * 通用Mapper接口,基础查询 * * @param <T> 不能为空 * @author liuzh */ @RegisterMapper public interface BaseUpdateMapper<T> extends UpdateByPrimaryKeyMapper<T>, UpdateByPrimaryKeySelectiveMapper<T> { } @RegisterMapper public interface UpdateByPrimaryKeyMapper<T> { /** * 根据主键更新实体全部字段,null值会被更新 * * @param record * @return */ @UpdateProvider(type = BaseUpdateProvider.class, method = "dynamicSQL") int updateByPrimaryKey(T record); } @RegisterMapper public interface UpdateByPrimaryKeySelectiveMapper<T> { /** * 根据主键更新属性不为null的值 * * @param record * @return */ @UpdateProvider(type = BaseUpdateProvider.class, method = "dynamicSQL") int updateByPrimaryKeySelective(T record); }
④ BaseDeleteMapper<T>:定义基本的删除操作
/** * 通用Mapper接口,基础删除 * * @param <T> 不能为空 * @author liuzh */ @RegisterMapper public interface BaseDeleteMapper<T> extends DeleteMapper<T>, DeleteByPrimaryKeyMapper<T> { } @RegisterMapper public interface DeleteMapper<T> { /** * 根据实体属性作为条件进行删除,查询条件使用等号 * * @param record * @return */ @DeleteProvider(type = BaseDeleteProvider.class, method = "dynamicSQL") int delete(T record); } @RegisterMapper public interface DeleteByPrimaryKeyMapper<T> { /** * 根据主键字段进行删除,方法参数必须包含完整的主键属性 * * @param key * @return */ @DeleteProvider(type = BaseDeleteProvider.class, method = "dynamicSQL") int deleteByPrimaryKey(Object key); }
(2)ExampleMapper<T>
/** * 通用Mapper接口,Example查询 * * @param <T> 不能为空 * @author liuzh */ @tk.mybatis.mapper.annotation.RegisterMapper public interface ExampleMapper<T> extends SelectByExampleMapper<T>, SelectOneByExampleMapper<T>, SelectCountByExampleMapper<T>, DeleteByExampleMapper<T>, UpdateByExampleMapper<T>, UpdateByExampleSelectiveMapper<T> { }
① SelectByExampleMapper<T>
@tk.mybatis.mapper.annotation.RegisterMapper public interface SelectByExampleMapper<T> { /** * 根据Example条件进行查询 * * @param example * @return */ @SelectProvider(type = ExampleProvider.class, method = "dynamicSQL") List<T> selectByExample(Object example); }
② SelectOneByExampleMapper<T>
@tk.mybatis.mapper.annotation.RegisterMapper public interface SelectOneByExampleMapper<T> { /** * 根据Example条件进行查询 * * @param example * @return */ @SelectProvider(type = ExampleProvider.class, method = "dynamicSQL") T selectOneByExample(Object example); }
③ SelectCountByExampleMapper<T>
@tk.mybatis.mapper.annotation.RegisterMapper public interface SelectCountByExampleMapper<T> { /** * 根据Example条件进行查询总数 * * @param example * @return */ @SelectProvider(type = ExampleProvider.class, method = "dynamicSQL") int selectCountByExample(Object example); }
④ DeleteByExampleMapper<T>
@tk.mybatis.mapper.annotation.RegisterMapper public interface DeleteByExampleMapper<T> { /** * 根据Example条件删除数据 * * @param example * @return */ @DeleteProvider(type = ExampleProvider.class, method = "dynamicSQL") int deleteByExample(Object example); }
⑤ UpdateByExampleMapper<T>
@tk.mybatis.mapper.annotation.RegisterMapper public interface UpdateByExampleMapper<T> { /** * 根据Example条件更新实体`record`包含的全部属性,null值会被更新 * * @param record * @param example * @return */ @UpdateProvider(type = ExampleProvider.class, method = "dynamicSQL") int updateByExample(@Param("record") T record, @Param("example") Object example); }
⑥ UpdateByExampleSelectiveMapper<T>
@tk.mybatis.mapper.annotation.RegisterMapper public interface UpdateByExampleSelectiveMapper<T> { /** * 根据Example条件更新实体`record`包含的不是null的属性值 * * @param record * @param example * @return */ @UpdateProvider(type = ExampleProvider.class, method = "dynamicSQL") int updateByExampleSelective(@Param("record") T record, @Param("example") Object example); }
(3)RowBoundsMapper<T>
/** * 通用Mapper接口,带RowBounds参数的查询 * <p/> * 配合分页插件PageHelper可以实现物理分页 * <p/> * PageHelper - http://git.oschina.net/free/Mybatis_PageHelper * * @param <T> 不能为空 * @author liuzh */ @tk.mybatis.mapper.annotation.RegisterMapper public interface RowBoundsMapper<T> extends SelectByExampleRowBoundsMapper<T>, SelectRowBoundsMapper<T> { }
① SelectByExampleRowBoundsMapper<T>
@tk.mybatis.mapper.annotation.RegisterMapper public interface SelectByExampleRowBoundsMapper<T> { /** * 根据example条件和RowBounds进行分页查询 * * @param example * @param rowBounds * @return */ @SelectProvider(type = ExampleProvider.class, method = "dynamicSQL") List<T> selectByExampleAndRowBounds(Object example, RowBounds rowBounds); }
② SelectRowBoundsMapper<T>
@tk.mybatis.mapper.annotation.RegisterMapper public interface SelectRowBoundsMapper<T> { /** * 根据实体属性和RowBounds进行分页查询 * * @param record * @param rowBounds * @return */ @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL") List<T> selectByRowBounds(T record, RowBounds rowBounds); }
(4)Marker
/** * 标记接口,继承该接口的接口,在MapperScannerConfigurer#setMarkerInterface时,会自动注册到通用Mapper * * @author liuzh * @since 3.2.2 */ public interface Marker { }
3、