当前位置: 首页 > 工具软件 > Mapper > 使用案例 >

通用mapper——自定义搭配继承Mapper

高琛
2023-12-01

前提

通用Mapper——tk.mybatis(Example)

正文

由于tk.mybatis.mapper.common.Mapper中只有
BaseMapper<T>, ExampleMapper<T>, RowBoundsMapper<T>, Marker这几个mapper,对于一些实际应用的场景是不够用的。通过Mapper 接口大全可以看到还有很多好用的Mapper,比如 IdsMapper<T>、MySqlMapper<T>等,我们可以通过多继承的方式将它们统统继承过来,但是这样每个表对应的mapper接口都会有一大堆的继承,很不好看,所以将他们整合成一个mapper接口,通过继承这个接口来继承我们想使用的所有mapper接口。

1. 创建自定义的mapper接口

import tk.mybatis.mapper.annotation.RegisterMapper;
import tk.mybatis.mapper.common.IdsMapper;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;

/**
 * 自定义的通用mapper
 * 除了集成基本的增删改查以外,还集成了批量添加,通过id集合批量删除、批量查询
 *
 * @author √Angelの爱灬
 * @date 2022/4/16
 */
@RegisterMapper
public interface AllMapper<T> extends Mapper<T>, MySqlMapper<T>, IdsMapper<T> {
}

这里可以通过使用@tk.mybatis.mapper.annotation.RegisterMapper注解来注册这个mapper,官网的解释是这样的:

在 4.0 以前这是一个非常重要的参数,当时只有通过 mappers 配置过的接口才能真正调用,由于很多人不注意看文档,通用 Mapper 90% 的问题都出在这个参数上。
4.0 之后,增加了一个 @RegisterMapper 注解,通用 Mapper 中提供的所有接口都有这个注解,有了该注解后,通用 Mapper 会自动解析所有的接口,如果父接口(递归向上找到的最顶层)存在标记该注解的接口,就会自动注册上。因此 4.0 后使用通用 Mapper 提供的方法时,不需要在配置这个参数。
当你自己扩展通用接口时,建议加上该注解,否则就要配置 mappers 参数。

2. 各表对应的mapper接口继承该接口

import com.study.tk.mybatis.expand.AllMapper;
import com.study.tk.mybatis.entity.Employee;

/**
 * 通用 Mapper 代码生成器
 *
 * @author mapper-generator
 */
public interface EmployeeMapper extends AllMapper<Employee> 

特别注意:SpringBoot启动类上的@MapperScan不能扫描到自定义的Mapper接口,不然会报错。

3. 代码生成器的配置

如果使用了代码生成器,则需要配置<property name="mappers" value="com.study.tk.mybatis.expand.AllMapper"/>,生成的Mapper接口才会自动继承自定义的接口

<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
    <!-- 必填属性。声明mapper接口需要继承哪些接口,多个mapper之间用“,”分隔开 -->
    <!--<property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>-->
    <!--自己的通用接口-->
    <property name="mappers" value="${baseMapperLocation}"/>
    <property name="useMapperCommentGenerator" value="true"/>
    <property name="caseSensitive" value="true"/>
    <property name="beginningDelimiter" value="`"/>
    <property name="endingDelimiter" value="`"/>
    <property name="lombok" value="Data"/>
    <property name="swagger" value="false"/>
</plugin>
 类似资料: