一、创建具体的Mapper接口
继承通用的Mapper,必须指定泛型,例如下面的例子:
/**
*
* 具体操作数据库的Mapper接口,需要继承通用Mapper提供的核心接口 Mapper<T>
* 泛型类型就是实体类的类型
*
*/
public interface EmployeeMapper extends Mapper<Employee> {
//其他必须手写的接口
}
一旦继承了Mapper,继承的Mapper就拥有了Mapper所有的通用方法。
二、Mapper 里面有什么
Mapper 的声明
@tk.mybatis.mapper.annotation.RegisterMapper
public interface Mapper<T> extends
BaseMapper<T>,
ExampleMapper<T>,
RowBoundsMapper<T>,
Marker {
}
1、BaseMapper
@tk.mybatis.mapper.annotation.RegisterMapper
public interface BaseMapper<T> extends
BaseSelectMapper<T>,
BaseInsertMapper<T>,
BaseUpdateMapper<T>,
BaseDeleteMapper<T> {
}
① BaseSelectMapper:定义基本的查询操作
/**
* 通用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:定义基本的插入操作
/**
* 通用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:定义基本的更新操作
/**
* 通用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:定义基本的删除操作
/**
* 通用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
/**
* 通用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
@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
@tk.mybatis.mapper.annotation.RegisterMapper
public interface SelectOneByExampleMapper<T> {
/**
* 根据Example条件进行查询
*
* @param example
* @return
*/
@SelectProvider(type = ExampleProvider.class, method = "dynamicSQL")
T selectOneByExample(Object example);
}
③ SelectCountByExampleMapper
@tk.mybatis.mapper.annotation.RegisterMapper
public interface SelectCountByExampleMapper<T> {
/**
* 根据Example条件进行查询总数
*
* @param example
* @return
*/
@SelectProvider(type = ExampleProvider.class, method = "dynamicSQL")
int selectCountByExample(Object example);
}
④ DeleteByExampleMapper
@tk.mybatis.mapper.annotation.RegisterMapper
public interface DeleteByExampleMapper<T> {
/**
* 根据Example条件删除数据
*
* @param example
* @return
*/
@DeleteProvider(type = ExampleProvider.class, method = "dynamicSQL")
int deleteByExample(Object example);
}
⑤ UpdateByExampleMapper
@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
@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
/**
* 通用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
@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
@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 {
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?