• Controller

/**
* 如果为空就都为空,如果不为空就都不为空
* @param startTime
* @param endTime
* @return
*/
@ApiOperation(value = "⭐分表分页")
@GetMapping("getTwo")
public ResultInfo getTwo(String startTime, String endTime,
                        @ApiParam(value = "page", required = true) @RequestParam int page,
                        @ApiParam(value = "size", required = true) @RequestParam int size){
   return ResultInfo.success(userService.getTwo(startTime, endTime, page, size));
}
  • Service

public interface UserService extends IService<User> {
   Map<String, Object> getTwo(String startTime, String endTime, int page, int size);
}
  • ServiceImpl

/**
* 如果为空就都为空,如果不为空就都不为空
* @param startTime
* @param endTime 一定大于startTime
* @return
*/
@Override
public Map<String, Object> getTwo(String startTime, String endTime, int page, int size) {
   if ((page - 1) * size < 0){
       throw new RuntimeException("页码异常");
  }
   Map<String, Object> map = new HashMap<>();
   List<List<User>> result = new ArrayList<>();
   List<String> tableName = new ArrayList<>();
   //为空直接返回最新数据,分表的意义
   if (StringUtils.isBlank(startTime)){
       result.add(userInfoMapper.getTwo("t_user"));
       map.put("list", result);
       return map;
  }
   String startYM = format(startTime);
   String startMonth = startYM.substring(startYM.lastIndexOf("_") + 1);
   String startYear = startYM.substring(0, 4);
   if (Integer.parseInt(startYear) < 2020){
       throw new RuntimeException("没有对应的数据");
  }
   String nowYM = DateUtil.format(new Date(), "yyyy_M");
   String nowMonth = nowYM.substring(nowYM.lastIndexOf("_") + 1);
   String nowYear = nowYM.substring(0, 4);
   if (startYM.equals(nowYM)){
       tableName.add("t_user");
       result.add(userInfoMapper.getTwo(tableName.get(0)));
       map.put("list", result);
       return map;
  }
   //当年的数据
   if (nowYear.equals(startYear)){
       String endYM = format(endTime);
       String endMonth = endYM.substring(endYM.lastIndexOf("_") + 1);
       if (Integer.parseInt(endMonth) >= Integer.parseInt(nowMonth)){
           result.add(userInfoMapper.getTime(startTime, endTime, "t_user"));
           int monthReduce = Integer.parseInt(nowMonth) - Integer.parseInt(startMonth);
           for (int i = 0; i < monthReduce - 1; i++) {
               tableName.add("t_user_" + nowYear + "_" + (Integer.parseInt(nowMonth) - i - 1));
          }
           for (int i = 0; i < tableName.size(); i++) {
               result.add(userInfoMapper.getTwo(tableName.get(i)));

          }
           result.add(userInfoMapper.getTime(startTime, endTime, "t_user_" + nowYear + "_" + startMonth));
      }else {
           result.add(userInfoMapper.getTime(startTime, endTime, "t_user_" + nowYear + "_" + endMonth));
           int monthReduce = Integer.parseInt(endMonth) - Integer.parseInt(startMonth);
           for (int i = monthReduce; i > 1; i--) {
               tableName.add("t_user_" + nowYear + "_" + (Integer.parseInt(startMonth) + i - 1));
          }
           for (int i = 0; i < tableName.size(); i++) {
               result.add(userInfoMapper.getTwo(tableName.get(i)));
          }
           result.add(userInfoMapper.getTime(startTime, endTime, "t_user_" + nowYear + "_" + startMonth));
      }
  }else if (startYear.equals(format(endTime).substring(0,4)) && !startYear.equals(nowYear)){
       //不是当前年,起止时间年份相同
       String endYM = format(endTime);
       String endMonth = endYM.substring(endYM.lastIndexOf("_") + 1);
       int monthReduce = Integer.parseInt(endMonth) - Integer.parseInt(startMonth);
       if (monthReduce == 0){
           result.add(userInfoMapper.getTime(startTime, endTime, "t_user_" + startYear + "_" + startMonth));
      }else {
           result.add(userInfoMapper.getTime(startTime, endTime, "t_user_" + startYear + "_" + endMonth));
           for (int i = monthReduce; i > 1; i--) {
               tableName.add("t_user_" + startYear + "_" + (Integer.parseInt(startMonth) + i - 1));
          }
           for (int i = 0; i < tableName.size(); i++) {
               result.add(userInfoMapper.getTwo(tableName.get(i)));
          }
           result.add(userInfoMapper.getTime(startTime, endTime, "t_user_" + startYear + "_" + startMonth));
      }
  }else{
       //startYear < nowYear
       String endYM = format(endTime);
       String endYear = endYM.substring(0,4);
       String endMonth = endYM.substring(endYM.lastIndexOf("_") + 1);
       int yearReduce = Integer.parseInt(endYear) - Integer.parseInt(startYear);
       if (endYear.equals(nowYear)){
           if (Integer.parseInt(endMonth) >= Integer.parseInt(nowMonth)){
               result.add(userInfoMapper.getTime(startTime, endTime, "t_user"));
               for (int i = Integer.parseInt(nowMonth); i > 1; i--) {
                   tableName.add("t_user_" + endYear + "_" + (i - 1));
              }
               for (int i = yearReduce; i > 1; i--) {
                   for (int j = 12; j >= 1 ; j--) {
                       tableName.add("t_user_" + (Integer.parseInt(startYear) + i - 1) + "_" + j);
                  }
              }
               int monthReduce = 12 - Integer.parseInt(startMonth);
               for (int i = monthReduce; i >= 1; i--) {
                   tableName.add("t_user_" + startYear + "_" + (Integer.parseInt(startMonth) + i));
              }
               for (int i = 0; i < tableName.size(); i++) {
                   result.add(userInfoMapper.getTwo(tableName.get(i)));
              }
               result.add(userInfoMapper.getTime(startTime, endTime,"t_user_" + startYear + "_" + startMonth));
          }else {
               //4 7
               result.add(userInfoMapper.getTime(startTime, endTime, "t_user_" + endYear + "_" + endMonth));
               for (int i = Integer.parseInt(endMonth); i > 1 ; i--) {
                   tableName.add("t_user_" + endYear + "_" + (i - 1));
              }
               for (int i = yearReduce; i > 1; i--) {
                   for (int j = 12; j >= 1 ; j--) {
                       tableName.add("t_user_" + (Integer.parseInt(startYear) + i - 1) + "_" + j);
                  }
              }
               int monthReduce = 12 - Integer.parseInt(startMonth);
               for (int i = monthReduce; i >= 1; i--) {
                   tableName.add("t_user_" + startYear + "_" + (Integer.parseInt(startMonth) + i));
              }
               for (int i = 0; i < tableName.size(); i++) {
                   result.add(userInfoMapper.getTwo(tableName.get(i)));
              }
               result.add(userInfoMapper.getTime(startTime, endTime,"t_user_" + startYear + "_" + startMonth));
          }
      }else if (Integer.parseInt(endYear) > Integer.parseInt(nowYear)){
           int startNowYearReduce = Integer.parseInt(nowYear) - Integer.parseInt(startYear);
           result.add(userInfoMapper.getTime(startTime, endTime, "t_user"));
           for (int i = Integer.parseInt(nowMonth); i > 1; i--) {
               tableName.add("t_user_" + nowYear + "_" + (i - 1));
          }
           for (int i = startNowYearReduce; i > 1; i--) {
               for (int j = 12; j >= 1 ; j--) {
                   tableName.add("t_user_" + (Integer.parseInt(startYear) + i - 1) + "_" + j);
              }
          }
           int monthReduce = 12 - Integer.parseInt(startMonth);
           for (int i = monthReduce; i >= 1; i--) {
               tableName.add("t_user_" + startYear + "_" + (Integer.parseInt(startMonth) + i));
          }
           for (int i = 0; i < tableName.size(); i++) {
               result.add(userInfoMapper.getTwo(tableName.get(i)));
          }
           result.add(userInfoMapper.getTime(startTime, endTime,"t_user_" + startYear + "_" + startMonth));
      } else{
           //endYear < nowYear, startYear < endYear
           result.add(userInfoMapper.getTime(startTime, endTime, "t_user_" + endYear + "_" + endMonth));
           for (int i = Integer.parseInt(endMonth); i > 1; i--) {
               tableName.add("t_user_" + endYear + "_" + (i - 1));
          }
           for (int i = yearReduce; i > 1; i--) {
               for (int j = 12; j >= 1 ; j--) {
                   tableName.add("t_user_" + (Integer.parseInt(startYear) + i - 1) + "_" + j);
              }
          }
           int monthReduce = 12 - Integer.parseInt(startMonth);
           for (int i = monthReduce; i >= 1; i--) {
               tableName.add("t_user_" + startYear + "_" + (Integer.parseInt(startMonth) + i));
          }
           for (int i = 0; i < tableName.size(); i++) {
               result.add(userInfoMapper.getTwo(tableName.get(i)));
          }
           result.add(userInfoMapper.getTime(startTime, endTime,"t_user_" + startYear + "_" + startMonth));
      }
  }
   List<User> list = new ArrayList<>();
   for (int i = 0; i < result.size(); i++) {
       list.addAll(result.get(i));
  }
   //PageHelper.startPage(page, size);是对之后的数据库查询语句才起作用
   //对list进行分页处理
   Page page1 = new Page(page,size);
   page1.setTotal(list.size());
   int startIndex = (page - 1) * size;
   int endIndex = Math.min(startIndex + size, list.size());
   if (list.size() > startIndex) {
       page1.addAll(list.subList(startIndex, endIndex));
       PageInfo pageInfo = new PageInfo<>(page1);
       map.put("count", pageInfo.getTotal());
       map.put("list", pageInfo.getList());
  }else{
       map.put("count", list.size());
       map.put("list", new ArrayList<>());
  }
   return map;
}
public static String format(String time) {
   Date date = null;
   try {
       date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time);
  } catch (ParseException e) {
       e.printStackTrace();
  }
   return new SimpleDateFormat("yyyy_M").format(date);
}
  • dao

@Component
public interface UserInfoMapper extends BaseMapper<User> {
   void alterTableName(@Param("tableName") String tableName);

   void createTable();

   List<User> getTwo(@Param("tableName") String tableName);

   List<User> getTime(@Param("startTime") String startTime,
                      @Param("endTime") String endTime,
                      @Param("tableName") String tableName);
}
  • 分表 scheduled

@Component
public class TimeTask {
   @Autowired
   private UserInfoMapper userInfoMapper;

   @Scheduled(cron = "0 0 18 28-31 * ?")
   public void createTable(){
       String tableName = "t_user_" + DateUtil.format(new Date(),"yyyy_M");
       userInfoMapper.alterTableName(tableName);
       userInfoMapper.createTable();
  }
}
  • 分表

<update id="alterTableName">
  ALTER TABLE t_user RENAME ${tableName}
</update>
  • 建表

<insert id="createTable">
  CREATE TABLE `t_user` (
                              `id` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
                              `user_name` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
                              `user_pwd` varchar(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
                              `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
                              `update_time` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
                              PRIMARY KEY (`id`) USING BTREE
  ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
</insert>
  • 查多表

<select id="getTwo" resultType="com.xxxx.springboot.pojo.po.User">
  SELECT *
  FROM ${tableName}
  ORDER BY create_time desc
</select>
  • 筛选时间

<select id="getTime" resultType="com.xxxx.springboot.pojo.po.User">
  SELECT *
  FROM ${tableName}
  WHERE 1=1
       <if test="startTime != null and startTime != '' ">
          AND create_time &gt; #{startTime}
       </if>
       <if test="endTime != null and endTime != '' ">
          AND create_time &lt; #{endTime}
       </if>
  ORDER BY create_time desc
</select>
  • User

@ApiModel(description = "用户实体对象")
@TableName(value = "t_user")
public class User {
   @TableId(value = "id")
   @ApiModelProperty(value = "用户id主键")
   private String id;

   @ApiModelProperty(value = "用户名")
   @NotBlank(message = "用户名不能为空")
   private String userName;

   @ApiModelProperty(value = "用户密码")
   @NotBlank(message = "用户名不能为空")
   @Length(min = 6,max = 10,message = "密码长度至少6位,不超过10位")
   private String userPwd;

   @ApiModelProperty(value = "创建时间")
   private Date createTime;

   @ApiModelProperty(value = "更新时间")
   private Date updateTime;

   public String getId() {
       return id;
  }

   public void setId(String id) {
       this.id = id;
  }

   public String getUserName() {
       return userName;
  }

   public void setUserName(String userName) {
       this.userName = userName;
  }

   public String getUserPwd() {
       return userPwd;
  }

   public void setUserPwd(String userPwd) {
       this.userPwd = userPwd;
  }

   public Date getCreateTime() {
       return createTime;
  }

   public void setCreateTime(Date createTime) {
       this.createTime = createTime;
  }

   public Date getUpdateTime() {
       return updateTime;
  }

   public void setUpdateTime(Date updateTime) {
       this.updateTime = updateTime;
  }

   @Override
   public String toString() {
       return "User{" +
               "id='" + id + '\'' +
               ", userName='" + userName + '\'' +
               ", userPwd='" + userPwd + '\'' +
               ", createTime='" + createTime + '\'' +
               ", updateTime='" + updateTime + '\'' +
               '}';
  }
}