告别重复SQL!Mybatis Common Mapper的BaseMapper如何简化90%数据操作

告别重复SQL!Mybatis Common Mapper的BaseMapper如何简化90%数据操作

【免费下载链接】Mapper Mybatis Common Mapper - Easy to use 【免费下载链接】Mapper 项目地址: 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的功能来源于四个基础操作接口的组合,每个基础接口又进一步拆分了更细粒度的操作:

mermaid

完整的接口定义可以查看源代码:

CRUD操作全覆盖:BaseMapper方法详解

BaseMapper提供的方法涵盖了绝大多数日常数据操作场景,以下是主要方法分类及用途:

查询操作(BaseSelectMapper)

方法名功能描述参数说明返回值
selectOne根据实体条件查询单条记录实体对象(非null字段作为查询条件)T(实体对象)
select根据实体条件查询多条记录实体对象(非null字段作为查询条件)List
selectAll查询表中所有记录List
selectCount查询符合条件的记录总数实体对象(非null字段作为查询条件)int(记录数)
selectByPrimaryKey根据主键查询记录主键值T(实体对象)
existsWithPrimaryKey判断主键对应的记录是否存在主键值boolean(存在返回true)

插入操作(BaseInsertMapper)

提供了两种插入方式,满足不同场景需求:

  1. 全字段插入(insert):
int insert(T record);

插入所有字段,包括null值字段。

  1. 选择性插入(insertSelective):
int insertSelective(T record);

只插入非null字段,null字段不参与SQL生成。

这两种方法的源代码定义在:

更新与删除操作

更新操作同样提供了两种模式:

  • 全字段更新(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的过程可以概括为以下步骤:

  1. 实体类解析:通过反射获取实体类的注解信息(@Table、@Column等),建立实体与数据库表的映射关系。
  2. 方法参数分析:根据调用的方法和传入参数,确定操作类型和条件。
  3. SQL模板生成:根据操作类型(查询、插入等)和实体映射关系,生成基础SQL模板。
  4. 条件动态拼接:根据实体对象的非null字段或方法参数,动态拼接WHERE条件、SET子句等。
  5. 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生成技术,实现了数据访问层的极大简化。它的优势主要体现在:

  1. 消除重复代码:一个接口继承,省去数十个重复CRUD方法的编写
  2. 提高开发效率:新实体类只需创建Mapper接口并继承BaseMapper即可使用
  3. 标准化操作:统一的数据操作方法,降低团队协作成本
  4. 减少SQL错误:自动生成标准SQL,避免手写SQL带来的语法错误
  5. 易于扩展:既支持基础操作,又允许自定义SQL满足特殊需求

如果你正在使用Mybatis进行开发,还在为编写重复的CRUD代码而困扰,不妨尝试Mybatis Common Mapper。只需简单的配置,就能立即享受到BaseMapper带来的便利。项目完整代码和更多使用示例可参考:

通过BaseMapper,让我们告别重复劳动,专注于业务逻辑的实现,提升开发效率和代码质量!

【免费下载链接】Mapper Mybatis Common Mapper - Easy to use 【免费下载链接】Mapper 项目地址: https://gitcode.com/gh_mirrors/ma/Mapper

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值