1、创建具体的Mapper接口
继承通用的Mapper<T>,必须指定泛型<T>,例如下面的例子:
/**
*
* 具体操作数据库的 Mapper接口,需要继承通用Mapper提供的核心接口 Mapper<T>
* 泛型类型就是实体类的类型
*
*/
public interface EmployeeMapper extends Mapper<Employee> {
//其他必须手写的接口
}
一旦继承了Mapper<T>
,继承的Mapper
就拥有了Mapper<T>
所有的通用方法。
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 {
}