首页 > 其他分享 >MybatisPlus实现按年份动态操作表数据

MybatisPlus实现按年份动态操作表数据

时间:2022-12-29 14:02:11浏览次数:72  
标签:年份 MybatisPlus String return org import 动态 com public

MybatisPlus实现按年份动态操作表数据

 在mp的官方网站上最近的一次更新可以看到,其提供了动态表名插件:https://baomidou.com/pages/2a45ff/#dynamictablenameinnerinterceptor

创建个项目试试吧

项目基础配置

由于MP的动态表名插件是最近才加入的功能所以选择版本的时候一定要注意下

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3.3</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

 先让项目跑起来

server:
  port: 9090
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/sharding?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
    username: root
    password: 123456

    hikari:
      minimum-idle: 5
      idle-timeout: 180000
      maximum-pool-size: 10
      auto-commit: true
      pool-name: MyHikariCP
      connection-timeout: 30000


mybatis-plus:
  mapperPackage: com.mpkt.mapper
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com/mpkt/entity
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

建需要用到的entity、mapper、xml

在mapper里面已经预先把分页查询和创建表结构的接口写好了

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mpkt.entity.User;
import org.apache.ibatis.annotations.Param;

public interface UserMapper extends BaseMapper<User> {

    /**
     * 分页查询
     * @param page
     * @return
     */
    Page<User> queryAll(@Param("page") Page<User> page);

    /**
     * 创建表
     * @param tableName
     */
    void createTable(@Param("tableName") String tableName);

}
View Code
@Data
@Accessors(chain = true)
public class User implements Serializable {

    @TableId
    private String id;

    private String userName;

}
View Code
<?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.mpkt.mapper.UserMapper">

    <select id="queryAll" resultType="com.mpkt.entity.User">
        select * from user
    </select>

    <update id="createTable">
        CREATE TABLE ${tableName}  (
          `id` bigint(255) NOT NULL,
          `user_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户名',
          PRIMARY KEY (`id`) USING BTREE
        ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

    </update>

</mapper>
View Code

添加MybatisPlusInterceptor配置

在这里也可以看到我定义了一个YearTableNameHandler的控制器和DicTableNameEnum的枚举类,然后就是你执行sql语句的时候会先拦截住执行的sql和表名,我这里就直接

就手动判断了。

import lombok.*;

import java.util.ArrayList;
import java.util.List;

@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum  DicTableNameEnum {

    A("user")
    ;

    private String tableName;

    public static List<String> findAll() {
        List<String> list = new ArrayList<>();
        for(DicTableNameEnum v : values()) {
            list.add(v.getTableName());
        }
        return list;
    }
}
View Code
import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
import org.springframework.util.ObjectUtils;

import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;


public class YearTableNameHandler implements TableNameHandler {

    /**
     * 动态表名处理器
     */
    private List<String> tableNames;

    /**
     * 每个请求线程维护一个数据
     */
    private static final ThreadLocal<String> YEAR_DATA = new ThreadLocal<>();

    /**
     * 默认本年
     */
    private static String DEFAULT_YEAR = String.valueOf(LocalDate.now().getYear());

    /**
     * 构造方法
     * @param tableNames
     */
    public YearTableNameHandler(String ...tableNames) {
        this.tableNames = !ObjectUtils.isEmpty(tableNames) ? Arrays.asList(tableNames) : DicTableNameEnum.findAll();
    }

    public static void setData(String year) {
        YEAR_DATA.set(year);
    }

    public static String getData() {
        return YEAR_DATA.get();
    }

    public static void removeData() {
        YEAR_DATA.remove();
    }

    public static void setDefaultYear() {
        YEAR_DATA.set(DEFAULT_YEAR);
    }

    public static String getDefaultYear() {
        return DEFAULT_YEAR;
    }

    @Override
    public String dynamicTableName(String sql, String tableName) {
        if (this.tableNames.contains(tableName)) {
            return tableName + "_" + YEAR_DATA.get();
        }else{
            return tableName;
        }
    }

}
View Code
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@MapperScan("com.mpkt")
public class MybatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
        // 可以传多个表名参数,指定哪些表处理表名称
        dynamicTableNameInnerInterceptor.setTableNameHandler(new YearTableNameHandler());

        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
        interceptor.addInnerInterceptor(paginationInnerInterceptor());
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

        return interceptor;
    }

    public PaginationInnerInterceptor paginationInnerInterceptor() {
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
        // 设置最大单页限制数量,默认 500 条,-1 不受限制
        paginationInnerInterceptor.setMaxLimit(-1L);
        // 分页合理化
        paginationInnerInterceptor.setOverflow(true);
        return paginationInnerInterceptor;
    }


}
View Code

测试一下下

然后惊奇的发现会动态到你配置的表了(不过这玩意只适合简单的动态分表)

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mpkt.config.YearTableNameHandler;
import com.mpkt.entity.User;
import com.mpkt.mapper.UserMapper;
import com.mpkt.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

@RestController
@RequestMapping("/test")
public class TestController {

    @Autowired
    private UserMapper userMapper;

    @GetMapping("/i1")
    public R i1() {
        userMapper.createTable("user_" + YearTableNameHandler.getDefaultYear());
        return R.ok();
    }

    @GetMapping("/k1")
    public R k1() {
        YearTableNameHandler.setDefaultYear();
        Page<User> page = new Page<>(1, 10);
        return R.ok().data(userMapper.queryAll(page));
    }

    @GetMapping("/k2")
    public R k2() {
        YearTableNameHandler.setDefaultYear();
        userMapper.insert(new User().setUserName("张三" + UUID.randomUUID()));
        return R.ok();
    }


}
View Code

 

标签:年份,MybatisPlus,String,return,org,import,动态,com,public
From: https://www.cnblogs.com/yiMro/p/17011683.html

相关文章

  • 重磅直播|基于格雷码结合相移技术的高鲁棒性高效率动态三维面形测量
    主讲人对该领域的核心和主流技术进行了详解,干货满满,线下的答疑更是赢得了同学们的好评。本期由四川大学三维传感与机器视觉实验室博士生吴周杰分享,分享的主题为《基于格雷码......
  • HZOJ 最长公共上升子序列 动态规划
    题面: 解题思路:首先定义状态dp[i][j]表示序列ai和序列bj的最长公共上升子序列的长度  代码:#include<iostream>#include<cstdio>#include<cstdlib>#incl......
  • UE4 动态添加/删除蓝图Actor三维模型
    应用场景:想通过业务数据动态添加飞机/车辆等模型到三维机场,并且能根据需求移除指定的三维模型。一,动态添加三维模型的代码:1FStringblueprintName=TEXT("Bluepr......
  • ABAP 动态生成内表方法一
    在做动态更新程序的时候,要注意两点:1.使用modify(p_tabname)from<dyn_wa>.的时候,一定要确定要更新的字段是不是系统表的关键字段,如果是关键字段的话,需要先删除这条记录,de......
  • ABAP 动态生成内表方法三
    SAP干货铺QQ群及微信群。纯顾问群,禁止发招聘及一切无关链接 广告等,欢迎顾问加入,申请时请提供模块,加入后请看公告,谢谢配合在做动态更新程序的时候,要注意两点:1.使用modify(p......
  • 动态规划-背包问题
    01背包问题问题描述:有N件物品和一个容量是V的背包。每件物品只能使用一次。第i件物品的体积是vi,价值是wi,求解将哪些物品装入背包,可使这些物品的总体积不超过......
  • 动态开点线段树说明
    动态开点线段树说明作者:Grey原文地址:博客园:动态开点线段树说明CSDN:动态开点线段树说明说明针对普通线段树,参考使用线段树解决数组任意区间元素修改问题在普通线段树......
  • 动态sql
    动态sql一般使用where标签,使用if如果不加条件会报错,但是使用where不会报错,他会默认无条件,输出全部数据,有一个条件就加一个条件。使用if标签条件越多if越多,   加......
  • [leetcode]第 8 天 动态规划(简单)
    I.斐波那契数列思路使用到了动态规划,最核心的思想,就在于拆分子问题,记住过往,减少重复计算。classSolution{publicintfib(intn){inta=0,b=1,......
  • layui table 动态生成复杂表头 及 数据绑定问题
    table复杂表头 下面将是我们要实现的效果下面是后台返回的数据    复杂表头重要的属性:rowspancolspan需要注意的是循环生成表头时,循环时不会执行templet里......