告别重复SQL!Mybatis Common Mapper的BaseMapper如何简化90%数据操作
【免费下载链接】Mapper Mybatis Common Mapper - Easy to use 项目地址: https://gitcode.com/gh_mirrors/ma/Mapper
你是否还在为每个实体类编写重复的CRUD(Create, Read, Update, Delete,增删改查)代码而烦恼?是否厌倦了手写大量SQL语句却只做着简单的数据操作?Mybatis Common Mapper(通用Mapper)项目中的BaseMapper组件彻底改变了这一现状。通过一个简单的接口继承,就能为任意实体类自动生成全套数据操作方法,让开发者从繁琐的重复劳动中解放出来。本文将深入解析BaseMapper的实现原理,带你了解它如何通过巧妙的设计实现"零SQL"开发。
BaseMapper组件快速概览
BaseMapper是Mybatis Common Mapper的核心接口,位于项目的base模块中。它通过组合多个基础操作接口,提供了完整的数据访问功能集。
@tk.mybatis.mapper.annotation.RegisterMapper
public interface BaseMapper<T> extends
BaseSelectMapper<T>, //查询操作集合
BaseInsertMapper<T>, //插入操作集合
BaseUpdateMapper<T>, //更新操作集合
BaseDeleteMapper<T> { //删除操作集合
}
这个看似简单的接口定义,实际上包含了20+个常用数据操作方法。其秘密在于接口组合模式的巧妙应用,通过继承多个基础操作接口,实现了功能的聚合。
核心接口继承关系
BaseMapper的功能来源于四个基础操作接口的组合,每个基础接口又进一步拆分了更细粒度的操作:
完整的接口定义可以查看源代码:
- BaseMapper接口:base/src/main/java/tk/mybatis/mapper/common/BaseMapper.java
- 基础操作接口包:base/src/main/java/tk/mybatis/mapper/common/base/
CRUD操作全覆盖:BaseMapper方法详解
BaseMapper提供的方法涵盖了绝大多数日常数据操作场景,以下是主要方法分类及用途:
查询操作(BaseSelectMapper)
| 方法名 | 功能描述 | 参数说明 | 返回值 |
|---|---|---|---|
| selectOne | 根据实体条件查询单条记录 | 实体对象(非null字段作为查询条件) | T(实体对象) |
| select | 根据实体条件查询多条记录 | 实体对象(非null字段作为查询条件) | List |
| selectAll | 查询表中所有记录 | 无 | List |
| selectCount | 查询符合条件的记录总数 | 实体对象(非null字段作为查询条件) | int(记录数) |
| selectByPrimaryKey | 根据主键查询记录 | 主键值 | T(实体对象) |
| existsWithPrimaryKey | 判断主键对应的记录是否存在 | 主键值 | boolean(存在返回true) |
插入操作(BaseInsertMapper)
提供了两种插入方式,满足不同场景需求:
- 全字段插入(insert):
int insert(T record);
插入所有字段,包括null值字段。
- 选择性插入(insertSelective):
int insertSelective(T record);
只插入非null字段,null字段不参与SQL生成。
这两种方法的源代码定义在:
- InsertMapper:base/src/main/java/tk/mybatis/mapper/common/base/insert/InsertMapper.java
- InsertSelectiveMapper:base/src/main/java/tk/mybatis/mapper/common/base/insert/InsertSelectiveMapper.java
更新与删除操作
更新操作同样提供了两种模式:
- 全字段更新(updateByPrimaryKey)
- 选择性更新(updateByPrimaryKeySelective)
删除操作提供了基础的按条件删除和按主键删除:
- delete(按实体条件删除)
- deleteByPrimaryKey(按主键删除)
实现原理:注解驱动的SQL自动生成
BaseMapper最神奇之处在于无需编写XML映射文件,就能自动生成SQL语句。这一功能的实现依赖于Mybatis的注解驱动和SQLProvider机制。
@RegisterMapper注解:接口注册的关键
每个基础接口都标注了@RegisterMapper注解:
@RegisterMapper
public interface BaseSelectMapper<T> extends
SelectOneMapper<T>,
SelectMapper<T>,
SelectAllMapper<T>,
SelectCountMapper<T>,
SelectByPrimaryKeyMapper<T>,
ExistsWithPrimaryKeyMapper<T> {
}
这个注解的作用是告诉Mybatis Common Mapper框架需要扫描并注册该接口。框架在启动时会扫描所有标注了@RegisterMapper的接口,并为它们注册对应的SQL生成器。
注解定义源代码:core/src/main/java/tk/mybatis/mapper/annotation/RegisterMapper.java
SQLProvider:动态SQL生成的幕后英雄
BaseMapper的方法没有对应的XML映射文件,那么SQL语句从何而来?答案是SQLProvider机制。以查询操作为例,SelectByPrimaryKeyMapper接口定义如下:
public interface SelectByPrimaryKeyMapper<T> {
@SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")
T selectByPrimaryKey(Object key);
}
@SelectProvider注解指定了SQL生成器类(BaseSelectProvider)和方法(dynamicSQL)。当调用selectByPrimaryKey方法时,Mybatis会调用BaseSelectProvider.dynamicSQL()方法生成对应的SQL语句。
SQLProvider实现类位于:base/src/main/java/tk/mybatis/mapper/provider/base/
动态SQL生成流程
BaseMapper生成SQL的过程可以概括为以下步骤:
- 实体类解析:通过反射获取实体类的注解信息(@Table、@Column等),建立实体与数据库表的映射关系。
- 方法参数分析:根据调用的方法和传入参数,确定操作类型和条件。
- SQL模板生成:根据操作类型(查询、插入等)和实体映射关系,生成基础SQL模板。
- 条件动态拼接:根据实体对象的非null字段或方法参数,动态拼接WHERE条件、SET子句等。
- SQL语句执行:将生成的SQL语句提交给Mybatis执行,并返回结果。
核心的SQL生成逻辑在MapperHelper工具类中实现:core/src/main/java/tk/mybatis/mapper/mapperhelper/MapperHelper.java
实战应用:5分钟上手BaseMapper
使用BaseMapper非常简单,只需三个步骤即可完成:
步骤1:定义实体类
创建与数据库表对应的实体类,并使用JPA注解标注映射关系:
@Table(name = "country")
public class Country {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "countryname")
private String countryname;
@Column(name = "countrycode")
private String countrycode;
// getter、setter方法省略
}
步骤2:创建Mapper接口
创建自定义Mapper接口,继承BaseMapper:
public interface CountryMapper extends BaseMapper<Country> {
// 无需编写任何方法,直接继承BaseMapper的所有功能
}
步骤3:注入并使用
在Service中注入Mapper接口,即可直接使用:
@Service
public class CountryService {
@Autowired
private CountryMapper countryMapper;
public List<Country> getAllCountries() {
return countryMapper.selectAll();
}
public Country getCountryById(Integer id) {
return countryMapper.selectByPrimaryKey(id);
}
public int addCountry(Country country) {
return countryMapper.insertSelective(country);
}
public int updateCountry(Country country) {
return countryMapper.updateByPrimaryKeySelective(country);
}
public int deleteCountry(Integer id) {
return countryMapper.deleteByPrimaryKey(id);
}
}
完整的使用示例可以参考项目测试代码:base/src/test/java/tk/mybatis/mapper/
高级特性:扩展BaseMapper功能
BaseMapper提供了基础CRUD功能,对于更复杂的查询需求,可以通过以下方式扩展:
1. 条件查询扩展
使用Example类构建复杂查询条件:
Example example = new Example(Country.class);
example.createCriteria()
.andEqualTo("countrycode", "CN")
.andLike("countryname", "%中国%");
example.orderBy("id").desc();
List<Country> countries = countryMapper.selectByExample(example);
Example类定义:core/src/main/java/tk/mybatis/mapper/entity/Example.java
2. 继承更专业的Mapper接口
除了BaseMapper,项目还提供了针对特定数据库的专用Mapper:
- MySqlMapper:提供MySQL特有功能,如批量插入(insertList)
- SqlServerMapper:提供SQL Server特有功能
使用方法:
public interface CountryMapper extends MySqlMapper<Country> {
// 继承MySqlMapper获得更多MySQL专属方法
}
专用Mapper定义:base/src/main/java/tk/mybatis/mapper/common/MySqlMapper.java
3. 自定义SQL扩展
对于特殊业务场景,可以在Mapper接口中添加自定义方法,并通过注解或XML文件定义SQL:
public interface CountryMapper extends BaseMapper<Country> {
@Select("SELECT * FROM country WHERE countrycode = #{code}")
Country selectByCode(@Param("code") String code);
}
项目结构与模块说明
Mybatis Common Mapper项目采用模块化设计,各模块职责清晰:
Mapper/
├── all/ # 聚合模块,依赖所有其他模块
├── base/ # 基础Mapper接口定义(核心模块)
├── core/ # 核心实现,包含SQL生成、注解处理等
├── extra/ # 扩展功能模块
├── generator/ # 代码生成器插件
├── spring/ # Spring集成支持
├── spring-boot-starter/ # Spring Boot自动配置
└── weekend/ # 高级查询功能扩展
主要模块功能:
- base模块:定义了所有Mapper接口,如BaseMapper
- core模块:实现了SQL生成、注解解析等核心功能
- spring模块:提供Spring框架集成支持,如MapperScan注解
- generator模块:提供代码生成器,可自动生成实体类和Mapper接口
总结:BaseMapper带来的开发变革
BaseMapper通过接口组合和动态SQL生成技术,实现了数据访问层的极大简化。它的优势主要体现在:
- 消除重复代码:一个接口继承,省去数十个重复CRUD方法的编写
- 提高开发效率:新实体类只需创建Mapper接口并继承BaseMapper即可使用
- 标准化操作:统一的数据操作方法,降低团队协作成本
- 减少SQL错误:自动生成标准SQL,避免手写SQL带来的语法错误
- 易于扩展:既支持基础操作,又允许自定义SQL满足特殊需求
如果你正在使用Mybatis进行开发,还在为编写重复的CRUD代码而困扰,不妨尝试Mybatis Common Mapper。只需简单的配置,就能立即享受到BaseMapper带来的便利。项目完整代码和更多使用示例可参考:
- 官方文档:README.md
- 基础示例:base/src/test/java/tk/mybatis/mapper/
- Spring集成示例:spring/src/test/java/tk/mybatis/mapper/
通过BaseMapper,让我们告别重复劳动,专注于业务逻辑的实现,提升开发效率和代码质量!
【免费下载链接】Mapper Mybatis Common Mapper - Easy to use 项目地址: https://gitcode.com/gh_mirrors/ma/Mapper
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



