tk.Mybatis 扩展通用mapper接口

简介: tk.Mybatis 扩展通用mapper接口

tk.Mybatis 扩展通用mapper

前文提要

《spring boot 整合 tk.Mybatis 》

《tk.mybatis官方手册》


引言

tk.mybatis项目中提供了大量现成的方法,这些方法可以作为扩展时的参考。

例如 tk.mybatis.mapper.common.ids 包中的 批量删除接口DeleteByIdsMapper

@RegisterMapper
public interface DeleteByIdsMapper<T> {
    @DeleteProvider(
        type = IdsProvider.class,
        method = "dynamicSQL"
    )
    int deleteByIds(String var1);
}


SQL模版生产者IdsProvider.class的源码如下,继承了MapperTemplate模版接口

public class IdsProvider extends MapperTemplate {
    public IdsProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
        super(mapperClass, mapperHelper);
    }
    public String deleteByIds(MappedStatement ms) {
        Class<?> entityClass = this.getEntityClass(ms);
        StringBuilder sql = new StringBuilder();
        sql.append(SqlHelper.deleteFromTable(entityClass, this.tableName(entityClass)));
        Set<EntityColumn> columnList = EntityHelper.getPKColumns(entityClass);
        if (columnList.size() == 1) {
            EntityColumn column = (EntityColumn)columnList.iterator().next();
            sql.append(" where ");
            sql.append(column.getColumn());
            sql.append(" in (${_parameter})");
            return sql.toString();
        } else {
            throw new MapperException("继承 deleteByIds 方法的实体类[" + entityClass.getCanonicalName() + "]中必须只有一个带有 @Id 注解的字段");
        }
    }
  ... ... //省略


上面的代码实际上就是对sql语句的拼接,由此可得我们只需要创建一个mappr接口,然后再创建一个provider继承MapperTemplate模版接口即可

更多template的功能可以参考这篇博客 《基于tk.mybatis扩展自己的通用mapper》

扩展通用mapper

创建自定义接口:DletetByCodesMapper

注意,这个类不能被MapperScan 扫描到,否则会报错

@RegisterMapper
public interface DletetByCodesMapper<T> {
    @DeleteProvider(
            type = IdsProviderExt.class,
            method = "dynamicSQL"
    )
    int deleteByCodes(String[] arr);
}


创建自定义模版:IdsProviderExt

由于我的数据主键是UUID,所以依据IdsProvider进行了扩展

public class IdsProviderExt extends MapperTemplate {
    public IdsProviderExt(Class<?> mapperClass, MapperHelper mapperHelper) {
        super(mapperClass, mapperHelper);
    }
    public String deleteByCodes(MappedStatement ms) {
        Class<?> entityClass = this.getEntityClass(ms);
        StringBuilder sql = new StringBuilder();
        sql.append(SqlHelper.deleteFromTable(entityClass, this.tableName(entityClass)));
        Set<EntityColumn> columnList = EntityHelper.getPKColumns(entityClass);
        if (columnList.size() == 1) {
            EntityColumn column = (EntityColumn)columnList.iterator().next();
            sql.append(" where ");
           // 不指定@Parm的话,数组参数默认使用array接收
            sql.append("<foreach collection='array' index='index' item='code' open='(' separator='OR' close=')'>");
            sql.append(column.getColumn() + "= #{code}");
            sql.append("</foreach>");
            return sql.toString();
        } else {
            throw new MapperException("继承 deleteByIds 方法的实体类[" + entityClass.getCanonicalName() + "]中必须只有一个带有 @Id 注解的字段");
        }
    }
}


创建MyMapper继承扩展模版

/**
 * tkMybatis 的 BaseMapper
 * 特别注意,该接口不能被扫描到,否则会出错
 */
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> , DeleteByIdsMapper<T>, DletetByCodesMapper<T> {
}


generator逆向工程生成 TbSysUserMapper 和XML

TbSysUserMapper 继承了MyMapper接口,所以也就继承了扩展接口

public interface TbSysUserMapper extends MyMapper<TbSysUser> {
}


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.funtl.itoken.common.mapper.TbSysUserMapper">
  <resultMap id="BaseResultMap" type="com.funtl.itoken.common.domain.entity.TbSysUser">
    <!--
      WARNING - @mbg.generated
    -->
    <id column="user_code" jdbcType="VARCHAR" property="userCode" />
    <result column="login_code" jdbcType="VARCHAR" property="loginCode" />
    <result column="user_name" jdbcType="VARCHAR" property="userName" />
    <result column="password" jdbcType="VARCHAR" property="password" />
    <result column="email" jdbcType="VARCHAR" property="email" />
    <result column="mobile" jdbcType="VARCHAR" property="mobile" />
    <result column="phone" jdbcType="VARCHAR" property="phone" />
  <!--省略-->


创建Spring Boot启动类

@MapperScan(basePackages = {"com.funtl.itoken.common.mapper","com.funtl.itoken.service.admin.mapper"})//dao路径
public class ServiceAdminApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceAdminApplication.class,args);
    }
}


Junit Test 测试代码

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ServiceAdminApplication.class)
@Transactional
public class MyBatisTests{
    /**
     * 注入数据查询接口
     */
    @Autowired
    private TbSysUserMapper tbUserMapper;
   /**
     * 测试批量删除
     */
    @Test
    @Rollback
    public void deleteByCodes() {
        String[] codes = {"5bb38bf6-2378-431c-88cb-7a38b69df806","c04471e1-fa3b-4d6e-ba98-e806dc5ad07c"};
        int i = tbUserMapper.deleteByCodes(codes);
        info("删除数量:"+i);//这个是我的自定义函数,自行打印即可
    }
}

结果


相关文章
|
8月前
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
4月前
|
SQL XML Java
MyBatis Mapper中使用limit参数的查询问题
总结而言,MyBatis中使用 `limit`参数的查询可以高度定制并且灵活,基于方法签名和XML映射文件的组合来达成多样化的查询需求。通过参数化查询和动态SQL,MyBatis可以有效地处理各种复杂情境下的数据库操作,并且将SQL语句的维护与业务代码的编写相分离,提升代码的可维护性和可阅读性。
455 13
|
8月前
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
8月前
|
人工智能 Java 数据库连接
MyBatis Plus 使用 Service 接口进行增删改查
本文介绍了基于 MyBatis-Plus 的数据库操作流程,包括配置、实体类、Service 层及 Mapper 层的创建。通过在 `application.yml` 中配置 SQL 日志打印,确保调试便利。示例中新建了 `UserTableEntity` 实体类映射 `sys_user` 表,并构建了 `UserService` 和 `UserServiceImpl` 处理业务逻辑,同时定义了 `UserTableMapper` 进行数据交互。测试部分展示了查询、插入、删除和更新的操作方法及输出结果,帮助开发者快速上手 MyBatis-Plus 数据持久化框架。
621 0
|
10月前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
1643 1
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
393 10
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
250 1
|
5月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1001 1
Spring boot 使用mybatis generator 自动生成代码插件
|
8月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于注解的整合
本文介绍了Spring Boot集成MyBatis的两种方式:基于XML和注解的形式。重点讲解了注解方式,包括@Select、@Insert、@Update、@Delete等常用注解的使用方法,以及多参数时@Param注解的应用。同时,针对字段映射不一致的问题,提供了@Results和@ResultMap的解决方案。文章还提到实际项目中常结合XML与注解的优点,灵活使用两者以提高开发效率,并附带课程源码供下载学习。
680 0
|
10月前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
457 2
下一篇
oss云网关配置