数据库表历史数据备份(定时任务)

■一、数据库表数据备份

此处的数据库表数据备份指的并不是整个数据库的数据备份,而是针对某些数据量比较大的业务表的历史数据备份。数据库中基础表、用户表、字典表等等表的数据量都是非常小的,只有个别业务表因业务操作频繁数据量巨大。假如我们的业务表并不需要保存过长时间的业务数据时,可以将一定期限前的数据保存到历史表中。这样业务表中数据量就能够保持到一个合理水平,从而提高该业务表的查询效率。

备份数据逻辑图:

■二、数据备份逻辑设计

表定义

接收报文(wdi_receive_msg_01)

No 物理名 逻辑名称 数据类型 主键唯一 非空 默认值 注释
1 id 物理主键 INT4 TRUE TRUE 序列值  
2 msg_text 报文内容 TEXT FALSE TRUE NULL 接收数据内容
3 msg_length 报文大小 INT4 FALSE TRUE NULL  
4 receive_servicecd 接收报文服务编码 VARCHAR(100) FALSE FALSE NULL  
5 connect_add 接收地址 CHAR(30) FALSE TRUE NULL 接收地址
6 create_user 创建者 VARCHAR(50) FALSE TRUE NULL  
7 create_time 创建时间 TIMESTAMP FALSE TRUE NULL  
8 update_user 修改者 VARCHAR(50) FALSE TRUE NULL  
9 update_time 修改时间 TIMESTAMP FALSE TRUE NULL  

接收报文历史(wdi_receive_msg_history_01)

No 物理名 逻辑名称 数据类型 主键唯一 非空 默认值 注释
1 id 物理主键 INT4 TRUE TRUE   业务表数据
2 msg_text 报文内容 TEXT FALSE TRUE NULL 业务表数据
3 msg_length 报文大小 INT4 FALSE TRUE NULL 业务表数据
4 receive_servicecd 接收报文服务编码 VARCHAR(100) FALSE FALSE NULL 业务表数据
5 connect_add 接收地址 CHAR(30) FALSE TRUE NULL 业务表数据
6 create_user 创建者 VARCHAR(50) FALSE TRUE NULL 业务表数据
7 create_time 创建时间 TIMESTAMP FALSE TRUE NULL 业务表数据
8 update_user 修改者 VARCHAR(50) FALSE TRUE NULL 业务表数据
9 update_time 修改时间 TIMESTAMP FALSE TRUE NULL 业务表数据
10 backup_user 备份者 VARCHAR(50) FALSE TRUE NULL 备份时追加数据
11 backup_time 备份时间 TIMESTAMP FALSE TRUE NULL 备份时追加数据

历史数据(wdi_history)

No 物理名 逻辑名称 数据类型 主键唯一 非空 默认值 注释
1 id 物理主键 INT4 TRUE TRUE 序列值  
2 table_name 业务表名称 VARCHAR(100) FALSE TRUE NULL 处理业务表名
3 table_minid 表的最小ID值 INT4 FALSE FALSE NULL 处理日表id的最小值
4 table_maxid 表的最大ID值 INT4 FALSE FALSE NULL 处理日表id的最大值
5 opt_date 处理日期 DATE FALSE TRUE NULL  
6 backup_flag 备份标志 CHAR(1) FALSE TRUE NULL Y:已备份/N:未备份
7 create_user 创建者 VARCHAR(50) FALSE TRUE NULL  
8 create_time 创建时间 TIMESTAMP FALSE TRUE NULL  
9 update_user 修改者 VARCHAR(50) FALSE TRUE NULL  
10 update_time 修改时间 TIMESTAMP FALSE TRUE NULL  

1.在数据备份时我们需要解决以下几个问题。

1)由于我们的数据备份是通过每天的定时任务完成的,如果其中某些天程序没有执行,那么后续的定时任务要把前面没有执行的数据处理掉。
2)业务表的主键ID是通过PostgreSQL的sequence生成的。这就存在一个问题当sequence达到最大值后,他将重新从1开始取值。这个特殊的数据变化也要在程序中处理掉。

2.处理逻辑设计

1)每天需要将业务表中最小id和最大id放入【历史数据(wdi_history)】中。
  每天0点时获取业务表的最大id,并将该id作为昨天的最大id和今天的最小id更新到【历史数据】表中。

插入历史数据表数据有以下几种情况:

2)备份数据只需要处理15天前的业务数据 最小id->最大id。

3)删除历史表中180天以前的数据。

■三、代码实现

1)定时任务配置类

package infosky.wdis.task;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 配置定时任务
 */
@Configuration
public class QuartzConfig {

	/**
	 * 使用jobDetail包装job
	 * @return
	 */
	@Bean
	public JobDetail backupJobDetail(){
		return JobBuilder.newJob(BackupJob.class).withIdentity("backupJob").storeDurably().build();
	}

	/**
	 * 把jobDetail注册到Cron表达式的trigger上去
	 * @return
	 */
	@Bean
	public Trigger backupJobCronTrigger(){
		CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("1 0 0 * * ?");

		return TriggerBuilder.newTrigger()
				.forJob(backupJobDetail())
				.withIdentity("backupJobCronTrigger")
				.withSchedule(cronScheduleBuilder)
				.build();
	}
}

2)数据备份类

package infosky.wdis.task;
import infosky.wdis.common.WdiConstants;
import infosky.wdis.dao.WdiBackupDataMapper;
import infosky.wdis.dao.WdiHistoryMapper;
import infosky.wdis.dao.WdiReceiveMsgHistoryMapper;
import infosky.wdis.dao.WdiSendMsgHistoryMapper;
import infosky.wdis.entity.WdiBackupData;
import infosky.wdis.entity.WdiHistory;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.transaction.annotation.Transactional;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * 定时任务
 * 数据备份
 *
 * 2020/01/29
 */
@Transactional
public class BackupJob extends QuartzJobBean {

	private static final Logger logger = LoggerFactory.getLogger(BackupJob.class);
	@Autowired
	WdiHistoryMapper wdiHistoryMapper;
	@Autowired
	WdiReceiveMsgHistoryMapper wdiReceiveMsgHistoryMapper;
	@Autowired
	WdiSendMsgHistoryMapper wdiSendMsgHistoryMapper;
	@Autowired
	WdiBackupDataMapper wdiBackupDataMapper;

	/**
	 * 定时任务处理
	 * @param jobExecutionContext
	 * @throws JobExecutionException
	 */
	@Override
	protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
		logger.info("########## BackupJob/executeInternal start ##########");

		// 1.将今天的最小id和昨天的最大id登录到【wdi_history】表中
		saveIdByTablename("wdi_receive_msg_01");
		saveIdByTablename("wdi_receive_msg_02");
		saveIdByTablename("wdi_receive_msg_03");
		saveIdByTablename("wdi_receive_msg_04");
		saveIdByTablename("wdi_receive_msg_05");
		saveIdByTablename("wdi_receive_msg_06");
		saveIdByTablename("wdi_receive_msg_07");
		saveIdByTablename("wdi_receive_msg_08");
		saveIdByTablename("wdi_receive_msg_09");
		saveIdByTablename("wdi_receive_msg_10");
		saveIdByTablename("wdi_receive_msg_11");
		saveIdByTablename("wdi_receive_msg_12");
		saveIdByTablename("wdi_receive_msg_13");
		saveIdByTablename("wdi_receive_msg_14");
		saveIdByTablename("wdi_receive_msg_15");
		saveIdByTablename("wdi_receive_msg_16");
		saveIdByTablename("wdi_receive_msg_17");
		saveIdByTablename("wdi_receive_msg_18");
		saveIdByTablename("wdi_receive_msg_19");
		saveIdByTablename("wdi_receive_msg_20");
		saveIdByTablename("wdi_send_msg_01");
		saveIdByTablename("wdi_send_msg_02");
		saveIdByTablename("wdi_send_msg_03");
		saveIdByTablename("wdi_send_msg_04");
		saveIdByTablename("wdi_send_msg_05");
		saveIdByTablename("wdi_send_msg_06");
		saveIdByTablename("wdi_send_msg_07");
		saveIdByTablename("wdi_send_msg_08");
		saveIdByTablename("wdi_send_msg_09");
		saveIdByTablename("wdi_send_msg_10");
		saveIdByTablename("wdi_send_msg_11");
		saveIdByTablename("wdi_send_msg_12");
		saveIdByTablename("wdi_send_msg_13");
		saveIdByTablename("wdi_send_msg_14");
		saveIdByTablename("wdi_send_msg_15");
		saveIdByTablename("wdi_send_msg_16");
		saveIdByTablename("wdi_send_msg_17");
		saveIdByTablename("wdi_send_msg_18");
		saveIdByTablename("wdi_send_msg_19");
		saveIdByTablename("wdi_send_msg_20");

		// 2.将业务表数据备份到历史表中
		backupData("wdi_receive_msg_01","wdi_receive_msg_history_01");
		backupData("wdi_receive_msg_02","wdi_receive_msg_history_02");
		backupData("wdi_receive_msg_03","wdi_receive_msg_history_03");
		backupData("wdi_receive_msg_04","wdi_receive_msg_history_04");
		backupData("wdi_receive_msg_05","wdi_receive_msg_history_05");
		backupData("wdi_receive_msg_06","wdi_receive_msg_history_06");
		backupData("wdi_receive_msg_07","wdi_receive_msg_history_07");
		backupData("wdi_receive_msg_08","wdi_receive_msg_history_08");
		backupData("wdi_receive_msg_09","wdi_receive_msg_history_09");
		backupData("wdi_receive_msg_10","wdi_receive_msg_history_10");
		backupData("wdi_receive_msg_11","wdi_receive_msg_history_11");
		backupData("wdi_receive_msg_12","wdi_receive_msg_history_12");
		backupData("wdi_receive_msg_13","wdi_receive_msg_history_13");
		backupData("wdi_receive_msg_14","wdi_receive_msg_history_14");
		backupData("wdi_receive_msg_15","wdi_receive_msg_history_15");
		backupData("wdi_receive_msg_16","wdi_receive_msg_history_16");
		backupData("wdi_receive_msg_17","wdi_receive_msg_history_17");
		backupData("wdi_receive_msg_18","wdi_receive_msg_history_18");
		backupData("wdi_receive_msg_19","wdi_receive_msg_history_19");
		backupData("wdi_receive_msg_20","wdi_receive_msg_history_20");
		backupData("wdi_send_msg_01","wdi_send_msg_history_01");
		backupData("wdi_send_msg_02","wdi_send_msg_history_02");
		backupData("wdi_send_msg_03","wdi_send_msg_history_03");
		backupData("wdi_send_msg_04","wdi_send_msg_history_04");
		backupData("wdi_send_msg_05","wdi_send_msg_history_05");
		backupData("wdi_send_msg_06","wdi_send_msg_history_06");
		backupData("wdi_send_msg_07","wdi_send_msg_history_07");
		backupData("wdi_send_msg_08","wdi_send_msg_history_08");
		backupData("wdi_send_msg_09","wdi_send_msg_history_09");
		backupData("wdi_send_msg_10","wdi_send_msg_history_10");
		backupData("wdi_send_msg_11","wdi_send_msg_history_11");
		backupData("wdi_send_msg_12","wdi_send_msg_history_12");
		backupData("wdi_send_msg_13","wdi_send_msg_history_13");
		backupData("wdi_send_msg_14","wdi_send_msg_history_14");
		backupData("wdi_send_msg_15","wdi_send_msg_history_15");
		backupData("wdi_send_msg_16","wdi_send_msg_history_16");
		backupData("wdi_send_msg_17","wdi_send_msg_history_17");
		backupData("wdi_send_msg_18","wdi_send_msg_history_18");
		backupData("wdi_send_msg_19","wdi_send_msg_history_19");
		backupData("wdi_send_msg_20","wdi_send_msg_history_20");

		// 3.删除180天以上数据
		deleteBackupData("wdi_receive_msg_history_01");
		deleteBackupData("wdi_receive_msg_history_02");
		deleteBackupData("wdi_receive_msg_history_03");
		deleteBackupData("wdi_receive_msg_history_04");
		deleteBackupData("wdi_receive_msg_history_05");
		deleteBackupData("wdi_receive_msg_history_06");
		deleteBackupData("wdi_receive_msg_history_07");
		deleteBackupData("wdi_receive_msg_history_08");
		deleteBackupData("wdi_receive_msg_history_09");
		deleteBackupData("wdi_receive_msg_history_10");
		deleteBackupData("wdi_receive_msg_history_11");
		deleteBackupData("wdi_receive_msg_history_12");
		deleteBackupData("wdi_receive_msg_history_13");
		deleteBackupData("wdi_receive_msg_history_14");
		deleteBackupData("wdi_receive_msg_history_15");
		deleteBackupData("wdi_receive_msg_history_16");
		deleteBackupData("wdi_receive_msg_history_17");
		deleteBackupData("wdi_receive_msg_history_18");
		deleteBackupData("wdi_receive_msg_history_19");
		deleteBackupData("wdi_receive_msg_history_20");
		deleteBackupData("wdi_send_msg_history_01");
		deleteBackupData("wdi_send_msg_history_02");
		deleteBackupData("wdi_send_msg_history_03");
		deleteBackupData("wdi_send_msg_history_04");
		deleteBackupData("wdi_send_msg_history_05");
		deleteBackupData("wdi_send_msg_history_06");
		deleteBackupData("wdi_send_msg_history_07");
		deleteBackupData("wdi_send_msg_history_08");
		deleteBackupData("wdi_send_msg_history_09");
		deleteBackupData("wdi_send_msg_history_10");
		deleteBackupData("wdi_send_msg_history_11");
		deleteBackupData("wdi_send_msg_history_12");
		deleteBackupData("wdi_send_msg_history_13");
		deleteBackupData("wdi_send_msg_history_14");
		deleteBackupData("wdi_send_msg_history_15");
		deleteBackupData("wdi_send_msg_history_16");
		deleteBackupData("wdi_send_msg_history_17");
		deleteBackupData("wdi_send_msg_history_18");
		deleteBackupData("wdi_send_msg_history_19");
		deleteBackupData("wdi_send_msg_history_20");

		logger.info("########## BackupJob/executeInternal end ##########");
	}

	/**
	 * 获取业务表表最大id,并将该值插入到wdi_history中
	 *
	 * @param tablename 业务表名
	 */
	public void saveIdByTablename(String tablename){
		// 1.获取业务表中最大的id
		Integer maxId = wdiHistoryMapper.getMaxId(tablename);
		if(maxId == null){
			maxId = 0;
		}

		// 2.将1获取的id保存到wdi_history中,前一天的maxid和今天的minid
		// 2.1.处理前一天的wdi_history数据
		WdiHistory wdiHistory = new WdiHistory();
		// 表名称
		wdiHistory.setTableName(tablename);
		// 处理日期
		Calendar yesterday = Calendar.getInstance();
		yesterday.add(Calendar.DATE, -1);
		wdiHistory.setOptDate(yesterday.getTime());
		// 获取当前日期前一天的wdi_history数据
		WdiHistory yesterdayWdiHistory = wdiHistoryMapper.getWdiHistory(wdiHistory);
		// 前一天wdi_history数据不存在
		if(yesterdayWdiHistory == null){
			// 如果不存在就插入
			WdiHistory insWdiHistory = new WdiHistory();
			// 表名称
			insWdiHistory.setTableName(tablename);
			// 表的ID值
			insWdiHistory.setTableMaxid(maxId);
			// 处理日期
			insWdiHistory.setOptDate(yesterday.getTime());
			// 备份标志
			insWdiHistory.setBackupFlag("N");
			// 创建者
			insWdiHistory.setCreateUser(WdiConstants.SYSTEM_TASK_BACKUPJOB);
			// 创建时间
			insWdiHistory.setCreateTime(new Date());
			// 修改者
			insWdiHistory.setUpdateUser(WdiConstants.SYSTEM_TASK_BACKUPJOB);
			// 修改时间
			insWdiHistory.setUpdateTime(new Date());

			wdiHistoryMapper.insertSelective(insWdiHistory);
		}else{
			// 如果存在就更新
			WdiHistory updWdiHistory = new WdiHistory();
			// 表名称
			updWdiHistory.setTableName(tablename);
			// 处理日期
			updWdiHistory.setOptDate(yesterday.getTime());
			// 表的ID值
			updWdiHistory.setTableMaxid(maxId);
			// 修改者
			updWdiHistory.setUpdateUser(WdiConstants.SYSTEM_TASK_BACKUPJOB);
			// 修改时间
			updWdiHistory.setUpdateTime(new Date());

			wdiHistoryMapper.updateByTableNameOptTime(updWdiHistory);
		}

		// 2.2.插入当天wdi_history数据
		WdiHistory todayWdiHistory = new WdiHistory();
		// 表名称
		todayWdiHistory.setTableName(tablename);
		// 表的ID值
		todayWdiHistory.setTableMinid(maxId);
		// 处理日期
		todayWdiHistory.setOptDate(new Date());
		// 备份标志
		todayWdiHistory.setBackupFlag("N");
		// 创建者
		todayWdiHistory.setCreateUser(WdiConstants.SYSTEM_TASK_BACKUPJOB);
		// 创建时间
		todayWdiHistory.setCreateTime(new Date());
		// 修改者
		todayWdiHistory.setUpdateUser(WdiConstants.SYSTEM_TASK_BACKUPJOB);
		// 修改时间
		todayWdiHistory.setUpdateTime(new Date());

		wdiHistoryMapper.insertSelective(todayWdiHistory);
	}

	/**
	 * 备份数据
	 * @param tablename        业务表名
	 * @param historyTablename 历史表名
	 */
	public void backupData(String tablename,String historyTablename){
		Calendar day = Calendar.getInstance();
		// 获取15天以前的id值
		day.add(Calendar.DATE, -15);

		// 设定查询条件
		WdiHistory wdiHistory = new WdiHistory();
		wdiHistory.setTableName(tablename);
		wdiHistory.setOptDate(day.getTime());
		List<WdiHistory> wdiHistoryBefore15daysOld = wdiHistoryMapper.getWdiHistoryLst(wdiHistory);

		// 如果15天以前的DiHistory存在,处理继续
		if(wdiHistoryBefore15daysOld != null && wdiHistoryBefore15daysOld.size() > 0){
			// ====================================================================
			//  maxId | minId maxId| minId     |     maxId | minId maxId| minId
			// 本处理会出现以下几种情况
			// 1.minId,maxId都存在,当maxId>minId时为正常情况。当maxId<minId时,说明seq跨越了最大值,需要特殊处理
			// 2.minId存在,但是maxId不存在。这种情况说明定时处理在这一天执行了,插入了minId,但是第二天定时任务
			//   没有执行,所以没有插入maxId。这种情况不做处理。
			// 3.minId不存在,但是maxId存在。产生这种情况有2种可能。
			//   A:当定时任务第一次执行的时候,会插入前一天maxId,但是不会有minId。
			//   B:本定时任务隔了几天后又开始执行。这个时候我们要找到这一次定时任务前面的执行结果。那个结果中只有minId,
			//     而没有maxId,我们需要处理从哪个minId开始,到这次的maxId的数据。
			// ====================================================================
			for(int i=0;i<wdiHistoryBefore15daysOld.size();i++){
				WdiHistory tmpWdiHistory = wdiHistoryBefore15daysOld.get(i);
				WdiBackupData wbd = new WdiBackupData();
				wbd.setTbnm(tablename);
				wbd.setTbnm_history(historyTablename);
				Integer minId = tmpWdiHistory.getTableMinid();
				Integer maxId = tmpWdiHistory.getTableMaxid();
				// 判断最大最小id是否存在
				if(minId != null && maxId != null){
					// 最大与最小id都存在
					// 判断最大id与最小id的大小关系
					if(maxId >= minId){
						// 正常情况
						backupTable(wbd,minId,maxId);
					}else{
						// 跨越seq最大值情况
						// a:minId->seq最大值(2147483647)    b:0->maxId
						backupTable(wbd,minId,2147483647);
						backupTable(wbd,0,maxId);
					}
					// 更新wdi_history表
					tmpWdiHistory.setUpdateUser(WdiConstants.SYSTEM_TASK_BACKUPJOB);
					tmpWdiHistory.setUpdateTime(new Date());
					wdiHistoryMapper.updWdiHistoryByTableNameOptDate(tmpWdiHistory);
				}else if(minId != null && maxId == null){
					// 最小id存在,最大id不存在 ※无需处理
				}else if(minId == null && maxId != null){
					// 最小id不存在,最大id存在  ※2种情况。1.第一次插入数据,没有最小id。2.程序执行中间有些天没有有启动。
					// 本条DiHistory是表中第一条数据
					if(i == 0){
						// 处理数据0->maxId
						backupTable(wbd,0,maxId);
						// 更新wdi_history表
						tmpWdiHistory.setUpdateUser(WdiConstants.SYSTEM_TASK_BACKUPJOB);
						tmpWdiHistory.setUpdateTime(new Date());
						wdiHistoryMapper.updWdiHistoryByTableNameOptDate(tmpWdiHistory);
					}else{
						// 获取minId
						Integer beforeMinId = wdiHistoryBefore15daysOld.get(i-1).getTableMinid();
						// 比较beforeMinId 与 maxId大小关系
						if(maxId >= beforeMinId){
							// 正常情况
							backupTable(wbd,beforeMinId,maxId);
						}else{
							// 跨越seq最大值情况
							// a:beforeMinId->seq最大值(2147483647)    b:0->maxId
							backupTable(wbd,beforeMinId,2147483647);
							backupTable(wbd,0,maxId);
						}
						// 更新wdi_history表 当条数据
						tmpWdiHistory.setUpdateUser(WdiConstants.SYSTEM_TASK_BACKUPJOB);
						tmpWdiHistory.setUpdateTime(new Date());
						wdiHistoryMapper.updWdiHistoryByTableNameOptDate(tmpWdiHistory);

						// 更新wdi_history表 前一条数据(存在minId的数据)
						WdiHistory beforeTmpWdiHistory = wdiHistoryBefore15daysOld.get(i-1);
						beforeTmpWdiHistory.setUpdateUser(WdiConstants.SYSTEM_TASK_BACKUPJOB);
						beforeTmpWdiHistory.setUpdateTime(new Date());
						wdiHistoryMapper.updWdiHistoryByTableNameOptDate(beforeTmpWdiHistory);
					}
				}else{
					// 最小最大id都不存在 ※理论上不会出现这种状况
				}
			}
		}
	}

	/**
	 * 备份业务表数据到历史表,并删除已备份业务数据
	 *
	 * @param wdiBackupData 需备份业务表及历史表信息
	 * @param minId         备份的起始id
	 * @param maxId         备份的终止id
	 */
	public void backupTable(WdiBackupData wdiBackupData,Integer minId,Integer maxId){
		while(true){
			if(minId + 1000 <= maxId){
				wdiBackupData.setMinId(minId);
				wdiBackupData.setMaxId(minId + 1000);
				// 分批备份数据
				wdiBackupDataMapper.backUpData(wdiBackupData);
				// 删除业务表已备份数据
				wdiBackupDataMapper.deleteData(wdiBackupData);
				minId = minId + 1000;
			}else{
				wdiBackupData.setMinId(minId);
				wdiBackupData.setMaxId(maxId);
				// 分批备份数据
				wdiBackupDataMapper.backUpData(wdiBackupData);
				// 删除业务表已备份数据
				wdiBackupDataMapper.deleteData(wdiBackupData);
				break;
			}
		}
	}

	/**
	 * 删除历史表数据
	 * @param historyTablename 历史表名
	 */
	public void deleteBackupData(String historyTablename){
		wdiHistoryMapper.deleteHistoryMsgByTableName(historyTablename);
	}
}

3)SQL  WdiHistoryMapper.xml

<?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="infosky.wdis.dao.WdiHistoryMapper">
  <resultMap id="BaseResultMap" type="infosky.wdis.entity.WdiHistory">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="table_name" jdbcType="VARCHAR" property="tableName" />
    <result column="table_minid" jdbcType="INTEGER" property="tableMinid" />
    <result column="table_maxid" jdbcType="INTEGER" property="tableMaxid" />
    <result column="opt_date" jdbcType="DATE" property="optDate" />
    <result column="backup_flag" jdbcType="CHAR" property="backupFlag" />
    <result column="create_user" jdbcType="VARCHAR" property="createUser" />
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
    <result column="update_user" jdbcType="VARCHAR" property="updateUser" />
    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
  </resultMap>
  <sql id="Example_Where_Clause">
    <where>
      <foreach collection="oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <trim prefix="(" prefixOverrides="and" suffix=")">
            <foreach collection="criteria.criteria" item="criterion">
              <choose>
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Update_By_Example_Where_Clause">
    <where>
      <foreach collection="example.oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <trim prefix="(" prefixOverrides="and" suffix=")">
            <foreach collection="criteria.criteria" item="criterion">
              <choose>
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Base_Column_List">
    id, table_name, table_minid, table_maxid, opt_date, backup_flag, create_user, create_time, 
    update_user, update_time
  </sql>
  <select id="selectByExample" parameterType="infosky.wdis.entity.WdiHistoryExample" resultMap="BaseResultMap">
    select
    <if test="distinct">
      distinct
    </if>
    'true' as QUERYID,
    <include refid="Base_Column_List" />
    from wdi_history
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null">
      order by ${orderByClause}
    </if>
  </select>
  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from wdi_history
    where id = #{id,jdbcType=INTEGER}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
    delete from wdi_history
    where id = #{id,jdbcType=INTEGER}
  </delete>
  <delete id="deleteByExample" parameterType="infosky.wdis.entity.WdiHistoryExample">
    delete from wdi_history
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
  </delete>
  <insert id="insert" parameterType="infosky.wdis.entity.WdiHistory">
    insert into wdi_history (id, table_name, table_minid, 
      table_maxid, opt_date, backup_flag, 
      create_user, create_time, update_user, 
      update_time)
    values (#{id,jdbcType=INTEGER}, #{tableName,jdbcType=VARCHAR}, #{tableMinid,jdbcType=INTEGER}, 
      #{tableMaxid,jdbcType=INTEGER}, #{optDate,jdbcType=DATE}, #{backupFlag,jdbcType=CHAR}, 
      #{createUser,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updateUser,jdbcType=VARCHAR}, 
      #{updateTime,jdbcType=TIMESTAMP})
  </insert>
  <insert id="insertSelective" parameterType="infosky.wdis.entity.WdiHistory">
    insert into wdi_history
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="tableName != null">
        table_name,
      </if>
      <if test="tableMinid != null">
        table_minid,
      </if>
      <if test="tableMaxid != null">
        table_maxid,
      </if>
      <if test="optDate != null">
        opt_date,
      </if>
      <if test="backupFlag != null">
        backup_flag,
      </if>
      <if test="createUser != null">
        create_user,
      </if>
      <if test="createTime != null">
        create_time,
      </if>
      <if test="updateUser != null">
        update_user,
      </if>
      <if test="updateTime != null">
        update_time,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=INTEGER},
      </if>
      <if test="tableName != null">
        #{tableName,jdbcType=VARCHAR},
      </if>
      <if test="tableMinid != null">
        #{tableMinid,jdbcType=INTEGER},
      </if>
      <if test="tableMaxid != null">
        #{tableMaxid,jdbcType=INTEGER},
      </if>
      <if test="optDate != null">
        #{optDate,jdbcType=DATE},
      </if>
      <if test="backupFlag != null">
        #{backupFlag,jdbcType=CHAR},
      </if>
      <if test="createUser != null">
        #{createUser,jdbcType=VARCHAR},
      </if>
      <if test="createTime != null">
        #{createTime,jdbcType=TIMESTAMP},
      </if>
      <if test="updateUser != null">
        #{updateUser,jdbcType=VARCHAR},
      </if>
      <if test="updateTime != null">
        #{updateTime,jdbcType=TIMESTAMP},
      </if>
    </trim>
  </insert>
  <update id="updateByExampleSelective" parameterType="map">
    update wdi_history
    <set>
      <if test="record.id != null">
        id = #{record.id,jdbcType=INTEGER},
      </if>
      <if test="record.tableName != null">
        table_name = #{record.tableName,jdbcType=VARCHAR},
      </if>
      <if test="record.tableMinid != null">
        table_minid = #{record.tableMinid,jdbcType=INTEGER},
      </if>
      <if test="record.tableMaxid != null">
        table_maxid = #{record.tableMaxid,jdbcType=INTEGER},
      </if>
      <if test="record.optDate != null">
        opt_date = #{record.optDate,jdbcType=DATE},
      </if>
      <if test="record.backupFlag != null">
        backup_flag = #{record.backupFlag,jdbcType=CHAR},
      </if>
      <if test="record.createUser != null">
        create_user = #{record.createUser,jdbcType=VARCHAR},
      </if>
      <if test="record.createTime != null">
        create_time = #{record.createTime,jdbcType=TIMESTAMP},
      </if>
      <if test="record.updateUser != null">
        update_user = #{record.updateUser,jdbcType=VARCHAR},
      </if>
      <if test="record.updateTime != null">
        update_time = #{record.updateTime,jdbcType=TIMESTAMP},
      </if>
    </set>
    <if test="_parameter != null">
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
  <update id="updateByExample" parameterType="map">
    update wdi_history
    set id = #{record.id,jdbcType=INTEGER},
      table_name = #{record.tableName,jdbcType=VARCHAR},
      table_minid = #{record.tableMinid,jdbcType=INTEGER},
      table_maxid = #{record.tableMaxid,jdbcType=INTEGER},
      opt_date = #{record.optDate,jdbcType=DATE},
      backup_flag = #{record.backupFlag,jdbcType=CHAR},
      create_user = #{record.createUser,jdbcType=VARCHAR},
      create_time = #{record.createTime,jdbcType=TIMESTAMP},
      update_user = #{record.updateUser,jdbcType=VARCHAR},
      update_time = #{record.updateTime,jdbcType=TIMESTAMP}
    <if test="_parameter != null">
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
  <update id="updateByPrimaryKeySelective" parameterType="infosky.wdis.entity.WdiHistory">
    update wdi_history
    <set>
      <if test="tableName != null">
        table_name = #{tableName,jdbcType=VARCHAR},
      </if>
      <if test="tableMinid != null">
        table_minid = #{tableMinid,jdbcType=INTEGER},
      </if>
      <if test="tableMaxid != null">
        table_maxid = #{tableMaxid,jdbcType=INTEGER},
      </if>
      <if test="optDate != null">
        opt_date = #{optDate,jdbcType=DATE},
      </if>
      <if test="backupFlag != null">
        backup_flag = #{backupFlag,jdbcType=CHAR},
      </if>
      <if test="createUser != null">
        create_user = #{createUser,jdbcType=VARCHAR},
      </if>
      <if test="createTime != null">
        create_time = #{createTime,jdbcType=TIMESTAMP},
      </if>
      <if test="updateUser != null">
        update_user = #{updateUser,jdbcType=VARCHAR},
      </if>
      <if test="updateTime != null">
        update_time = #{updateTime,jdbcType=TIMESTAMP},
      </if>
    </set>
    where id = #{id,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="infosky.wdis.entity.WdiHistory">
    update wdi_history
    set table_name = #{tableName,jdbcType=VARCHAR},
      table_minid = #{tableMinid,jdbcType=INTEGER},
      table_maxid = #{tableMaxid,jdbcType=INTEGER},
      opt_date = #{optDate,jdbcType=DATE},
      backup_flag = #{backupFlag,jdbcType=CHAR},
      create_user = #{createUser,jdbcType=VARCHAR},
      create_time = #{createTime,jdbcType=TIMESTAMP},
      update_user = #{updateUser,jdbcType=VARCHAR},
      update_time = #{updateTime,jdbcType=TIMESTAMP}
    where id = #{id,jdbcType=INTEGER}
  </update>

  <!-- =================================== 以下为手动追加方法 =================================== -->
  <select id="getMaxId" parameterType="String" resultType="java.lang.Integer">
    select tb.id as maxId
      from ${tablename} tb
     order by create_time desc
     limit 1
  </select>

  <select id="getWdiHistory" parameterType="infosky.wdis.entity.WdiHistory" resultMap="BaseResultMap">
    select <include refid="Base_Column_List" />
      from wdi_history
     where table_name = #{tableName}
       and opt_date =  #{optDate}
  </select>

  <select id="getWdiHistoryLst" parameterType="infosky.wdis.entity.WdiHistory" resultMap="BaseResultMap">
    select <include refid="Base_Column_List" />
      from wdi_history
     where table_name = #{tableName}
       and opt_date <![CDATA[  <= ]]> #{optDate}
       and backup_flag = 'N'
     order by create_time asc
  </select>

  <update id="updateByTableNameOptTime" parameterType="infosky.wdis.entity.WdiHistory">
    update wdi_history
       set table_maxid=#{tableMaxid},
           update_user=#{updateUser},
           update_time=#{updateTime}
     where table_name=#{tableName}
       and opt_date=#{optDate}
  </update>

  <delete id="deleteHistoryMsgByTableName" parameterType="java.lang.String">
    delete from ${tablename}
     where update_time <![CDATA[ < ]]>(current_timestamp - interval'180 day')
  </delete>

  <update id="updWdiHistoryByTableNameOptDate" parameterType="infosky.wdis.entity.WdiHistory">
    update wdi_history
       set backup_flag='Y',
           update_user=#{updateUser},
           update_time=#{updateTime}
     where table_name=#{tableName}
       and opt_date=#{optDate}
  </update>

  <select id="getWdiHistoryBefore" parameterType="infosky.wdis.entity.WdiHistory" resultMap="BaseResultMap">
    select id,
           table_name,
           table_minid,
           table_maxid,
           opt_date,
           backup_flag,
           create_user,
           create_time,
           update_user,
           update_time
      from wdi_history
	  where id = (select max(id) from wdi_history where table_name = #{tableName} and opt_date <![CDATA[ < ]]> #{optDate})
  </select>

</mapper>

WdiReceiveMsgHistoryMapper.xml

<?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="infosky.wdis.dao.WdiReceiveMsgHistoryMapper">
  <resultMap id="BaseResultMap" type="infosky.wdis.entity.WdiReceiveMsgHistory">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="msg_text" jdbcType="VARCHAR" property="msgText" />
    <result column="msg_length" jdbcType="INTEGER" property="msgLength" />
    <result column="receive_servicecd" jdbcType="VARCHAR" property="receiveServicecd" />
    <result column="connect_add" jdbcType="CHAR" property="connectAdd" />
    <result column="create_user" jdbcType="VARCHAR" property="createUser" />
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
    <result column="update_user" jdbcType="VARCHAR" property="updateUser" />
    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
    <result column="backup_user" jdbcType="VARCHAR" property="backupUser" />
    <result column="backup_time" jdbcType="TIMESTAMP" property="backupTime" />
  </resultMap>
  <sql id="Example_Where_Clause">
    <where>
      <foreach collection="oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <trim prefix="(" prefixOverrides="and" suffix=")">
            <foreach collection="criteria.criteria" item="criterion">
              <choose>
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Update_By_Example_Where_Clause">
    <where>
      <foreach collection="example.oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <trim prefix="(" prefixOverrides="and" suffix=")">
            <foreach collection="criteria.criteria" item="criterion">
              <choose>
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Base_Column_List">
    id, msg_text, msg_length, receive_servicecd, connect_add, create_user, create_time, 
    update_user, update_time, backup_user, backup_time
  </sql>
  <select id="selectByExample" parameterType="infosky.wdis.entity.WdiReceiveMsgHistoryExample" resultMap="BaseResultMap">
    select
    <if test="distinct">
      distinct
    </if>
    'true' as QUERYID,
    <include refid="Base_Column_List" />
    from wdi_receive_msg_history_01
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null">
      order by ${orderByClause}
    </if>
  </select>
  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from wdi_receive_msg_history_01
    where id = #{id,jdbcType=INTEGER}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
    delete from wdi_receive_msg_history_01
    where id = #{id,jdbcType=INTEGER}
  </delete>
  <delete id="deleteByExample" parameterType="infosky.wdis.entity.WdiReceiveMsgHistoryExample">
    delete from wdi_receive_msg_history_01
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
  </delete>
  <insert id="insert" parameterType="infosky.wdis.entity.WdiReceiveMsgHistory">
    insert into wdi_receive_msg_history_01 (id, msg_text, msg_length, 
      receive_servicecd, connect_add, create_user, 
      create_time, update_user, update_time, 
      backup_user, backup_time)
    values (#{id,jdbcType=INTEGER}, #{msgText,jdbcType=VARCHAR}, #{msgLength,jdbcType=INTEGER}, 
      #{receiveServicecd,jdbcType=VARCHAR}, #{connectAdd,jdbcType=CHAR}, #{createUser,jdbcType=VARCHAR}, 
      #{createTime,jdbcType=TIMESTAMP}, #{updateUser,jdbcType=VARCHAR}, #{updateTime,jdbcType=TIMESTAMP}, 
      #{backupUser,jdbcType=VARCHAR}, #{backupTime,jdbcType=TIMESTAMP})
  </insert>
  <insert id="insertSelective" parameterType="infosky.wdis.entity.WdiReceiveMsgHistory">
    insert into wdi_receive_msg_history_01
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="msgText != null">
        msg_text,
      </if>
      <if test="msgLength != null">
        msg_length,
      </if>
      <if test="receiveServicecd != null">
        receive_servicecd,
      </if>
      <if test="connectAdd != null">
        connect_add,
      </if>
      <if test="createUser != null">
        create_user,
      </if>
      <if test="createTime != null">
        create_time,
      </if>
      <if test="updateUser != null">
        update_user,
      </if>
      <if test="updateTime != null">
        update_time,
      </if>
      <if test="backupUser != null">
        backup_user,
      </if>
      <if test="backupTime != null">
        backup_time,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=INTEGER},
      </if>
      <if test="msgText != null">
        #{msgText,jdbcType=VARCHAR},
      </if>
      <if test="msgLength != null">
        #{msgLength,jdbcType=INTEGER},
      </if>
      <if test="receiveServicecd != null">
        #{receiveServicecd,jdbcType=VARCHAR},
      </if>
      <if test="connectAdd != null">
        #{connectAdd,jdbcType=CHAR},
      </if>
      <if test="createUser != null">
        #{createUser,jdbcType=VARCHAR},
      </if>
      <if test="createTime != null">
        #{createTime,jdbcType=TIMESTAMP},
      </if>
      <if test="updateUser != null">
        #{updateUser,jdbcType=VARCHAR},
      </if>
      <if test="updateTime != null">
        #{updateTime,jdbcType=TIMESTAMP},
      </if>
      <if test="backupUser != null">
        #{backupUser,jdbcType=VARCHAR},
      </if>
      <if test="backupTime != null">
        #{backupTime,jdbcType=TIMESTAMP},
      </if>
    </trim>
  </insert>
  <update id="updateByExampleSelective" parameterType="map">
    update wdi_receive_msg_history_01
    <set>
      <if test="record.id != null">
        id = #{record.id,jdbcType=INTEGER},
      </if>
      <if test="record.msgText != null">
        msg_text = #{record.msgText,jdbcType=VARCHAR},
      </if>
      <if test="record.msgLength != null">
        msg_length = #{record.msgLength,jdbcType=INTEGER},
      </if>
      <if test="record.receiveServicecd != null">
        receive_servicecd = #{record.receiveServicecd,jdbcType=VARCHAR},
      </if>
      <if test="record.connectAdd != null">
        connect_add = #{record.connectAdd,jdbcType=CHAR},
      </if>
      <if test="record.createUser != null">
        create_user = #{record.createUser,jdbcType=VARCHAR},
      </if>
      <if test="record.createTime != null">
        create_time = #{record.createTime,jdbcType=TIMESTAMP},
      </if>
      <if test="record.updateUser != null">
        update_user = #{record.updateUser,jdbcType=VARCHAR},
      </if>
      <if test="record.updateTime != null">
        update_time = #{record.updateTime,jdbcType=TIMESTAMP},
      </if>
      <if test="record.backupUser != null">
        backup_user = #{record.backupUser,jdbcType=VARCHAR},
      </if>
      <if test="record.backupTime != null">
        backup_time = #{record.backupTime,jdbcType=TIMESTAMP},
      </if>
    </set>
    <if test="_parameter != null">
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
  <update id="updateByExample" parameterType="map">
    update wdi_receive_msg_history_01
    set id = #{record.id,jdbcType=INTEGER},
      msg_text = #{record.msgText,jdbcType=VARCHAR},
      msg_length = #{record.msgLength,jdbcType=INTEGER},
      receive_servicecd = #{record.receiveServicecd,jdbcType=VARCHAR},
      connect_add = #{record.connectAdd,jdbcType=CHAR},
      create_user = #{record.createUser,jdbcType=VARCHAR},
      create_time = #{record.createTime,jdbcType=TIMESTAMP},
      update_user = #{record.updateUser,jdbcType=VARCHAR},
      update_time = #{record.updateTime,jdbcType=TIMESTAMP},
      backup_user = #{record.backupUser,jdbcType=VARCHAR},
      backup_time = #{record.backupTime,jdbcType=TIMESTAMP}
    <if test="_parameter != null">
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
  <update id="updateByPrimaryKeySelective" parameterType="infosky.wdis.entity.WdiReceiveMsgHistory">
    update wdi_receive_msg_history_01
    <set>
      <if test="msgText != null">
        msg_text = #{msgText,jdbcType=VARCHAR},
      </if>
      <if test="msgLength != null">
        msg_length = #{msgLength,jdbcType=INTEGER},
      </if>
      <if test="receiveServicecd != null">
        receive_servicecd = #{receiveServicecd,jdbcType=VARCHAR},
      </if>
      <if test="connectAdd != null">
        connect_add = #{connectAdd,jdbcType=CHAR},
      </if>
      <if test="createUser != null">
        create_user = #{createUser,jdbcType=VARCHAR},
      </if>
      <if test="createTime != null">
        create_time = #{createTime,jdbcType=TIMESTAMP},
      </if>
      <if test="updateUser != null">
        update_user = #{updateUser,jdbcType=VARCHAR},
      </if>
      <if test="updateTime != null">
        update_time = #{updateTime,jdbcType=TIMESTAMP},
      </if>
      <if test="backupUser != null">
        backup_user = #{backupUser,jdbcType=VARCHAR},
      </if>
      <if test="backupTime != null">
        backup_time = #{backupTime,jdbcType=TIMESTAMP},
      </if>
    </set>
    where id = #{id,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="infosky.wdis.entity.WdiReceiveMsgHistory">
    update wdi_receive_msg_history_01
    set msg_text = #{msgText,jdbcType=VARCHAR},
      msg_length = #{msgLength,jdbcType=INTEGER},
      receive_servicecd = #{receiveServicecd,jdbcType=VARCHAR},
      connect_add = #{connectAdd,jdbcType=CHAR},
      create_user = #{createUser,jdbcType=VARCHAR},
      create_time = #{createTime,jdbcType=TIMESTAMP},
      update_user = #{updateUser,jdbcType=VARCHAR},
      update_time = #{updateTime,jdbcType=TIMESTAMP},
      backup_user = #{backupUser,jdbcType=VARCHAR},
      backup_time = #{backupTime,jdbcType=TIMESTAMP}
    where id = #{id,jdbcType=INTEGER}
  </update>
</mapper>

WdiSendMsgHistoryMapper.xml

<?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="infosky.wdis.dao.WdiSendMsgHistoryMapper">
  <resultMap id="BaseResultMap" type="infosky.wdis.entity.WdiSendMsgHistory">
    <id column="id" jdbcType="INTEGER" property="id" />
    <result column="receive_msg_table_name" jdbcType="VARCHAR" property="receiveMsgTableName" />
    <result column="receive_msg_id" jdbcType="INTEGER" property="receiveMsgId" />
    <result column="receive_connect_add" jdbcType="CHAR" property="receiveConnectAdd" />
    <result column="msg_text" jdbcType="VARCHAR" property="msgText" />
    <result column="msg_length" jdbcType="INTEGER" property="msgLength" />
    <result column="receive_servicecd" jdbcType="VARCHAR" property="receiveServicecd" />
    <result column="send_connect_add" jdbcType="CHAR" property="sendConnectAdd" />
    <result column="operation_finish" jdbcType="CHAR" property="operationFinish" />
    <result column="create_user" jdbcType="VARCHAR" property="createUser" />
    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
    <result column="update_user" jdbcType="VARCHAR" property="updateUser" />
    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
    <result column="backup_user" jdbcType="VARCHAR" property="backupUser" />
    <result column="backup_time" jdbcType="TIMESTAMP" property="backupTime" />
  </resultMap>
  <sql id="Example_Where_Clause">
    <where>
      <foreach collection="oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <trim prefix="(" prefixOverrides="and" suffix=")">
            <foreach collection="criteria.criteria" item="criterion">
              <choose>
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Update_By_Example_Where_Clause">
    <where>
      <foreach collection="example.oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <trim prefix="(" prefixOverrides="and" suffix=")">
            <foreach collection="criteria.criteria" item="criterion">
              <choose>
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach close=")" collection="criterion.value" item="listItem" open="(" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>
  <sql id="Base_Column_List">
    id, receive_msg_table_name, receive_msg_id, receive_connect_add, msg_text, msg_length, 
    receive_servicecd, send_connect_add, operation_finish, create_user, create_time, 
    update_user, update_time, backup_user, backup_time
  </sql>
  <select id="selectByExample" parameterType="infosky.wdis.entity.WdiSendMsgHistoryExample" resultMap="BaseResultMap">
    select
    <if test="distinct">
      distinct
    </if>
    'true' as QUERYID,
    <include refid="Base_Column_List" />
    from wdi_send_msg_history_01
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
    <if test="orderByClause != null">
      order by ${orderByClause}
    </if>
  </select>
  <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from wdi_send_msg_history_01
    where id = #{id,jdbcType=INTEGER}
  </select>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
    delete from wdi_send_msg_history_01
    where id = #{id,jdbcType=INTEGER}
  </delete>
  <delete id="deleteByExample" parameterType="infosky.wdis.entity.WdiSendMsgHistoryExample">
    delete from wdi_send_msg_history_01
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
  </delete>
  <insert id="insert" parameterType="infosky.wdis.entity.WdiSendMsgHistory">
    insert into wdi_send_msg_history_01 (id, receive_msg_table_name, receive_msg_id, 
      receive_connect_add, msg_text, msg_length, 
      receive_servicecd, send_connect_add, operation_finish, 
      create_user, create_time, update_user, 
      update_time, backup_user, backup_time
      )
    values (#{id,jdbcType=INTEGER}, #{receiveMsgTableName,jdbcType=VARCHAR}, #{receiveMsgId,jdbcType=INTEGER}, 
      #{receiveConnectAdd,jdbcType=CHAR}, #{msgText,jdbcType=VARCHAR}, #{msgLength,jdbcType=INTEGER}, 
      #{receiveServicecd,jdbcType=VARCHAR}, #{sendConnectAdd,jdbcType=CHAR}, #{operationFinish,jdbcType=CHAR}, 
      #{createUser,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updateUser,jdbcType=VARCHAR}, 
      #{updateTime,jdbcType=TIMESTAMP}, #{backupUser,jdbcType=VARCHAR}, #{backupTime,jdbcType=TIMESTAMP}
      )
  </insert>
  <insert id="insertSelective" parameterType="infosky.wdis.entity.WdiSendMsgHistory">
    insert into wdi_send_msg_history_01
    <trim prefix="(" suffix=")" suffixOverrides=",">
      <if test="id != null">
        id,
      </if>
      <if test="receiveMsgTableName != null">
        receive_msg_table_name,
      </if>
      <if test="receiveMsgId != null">
        receive_msg_id,
      </if>
      <if test="receiveConnectAdd != null">
        receive_connect_add,
      </if>
      <if test="msgText != null">
        msg_text,
      </if>
      <if test="msgLength != null">
        msg_length,
      </if>
      <if test="receiveServicecd != null">
        receive_servicecd,
      </if>
      <if test="sendConnectAdd != null">
        send_connect_add,
      </if>
      <if test="operationFinish != null">
        operation_finish,
      </if>
      <if test="createUser != null">
        create_user,
      </if>
      <if test="createTime != null">
        create_time,
      </if>
      <if test="updateUser != null">
        update_user,
      </if>
      <if test="updateTime != null">
        update_time,
      </if>
      <if test="backupUser != null">
        backup_user,
      </if>
      <if test="backupTime != null">
        backup_time,
      </if>
    </trim>
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      <if test="id != null">
        #{id,jdbcType=INTEGER},
      </if>
      <if test="receiveMsgTableName != null">
        #{receiveMsgTableName,jdbcType=VARCHAR},
      </if>
      <if test="receiveMsgId != null">
        #{receiveMsgId,jdbcType=INTEGER},
      </if>
      <if test="receiveConnectAdd != null">
        #{receiveConnectAdd,jdbcType=CHAR},
      </if>
      <if test="msgText != null">
        #{msgText,jdbcType=VARCHAR},
      </if>
      <if test="msgLength != null">
        #{msgLength,jdbcType=INTEGER},
      </if>
      <if test="receiveServicecd != null">
        #{receiveServicecd,jdbcType=VARCHAR},
      </if>
      <if test="sendConnectAdd != null">
        #{sendConnectAdd,jdbcType=CHAR},
      </if>
      <if test="operationFinish != null">
        #{operationFinish,jdbcType=CHAR},
      </if>
      <if test="createUser != null">
        #{createUser,jdbcType=VARCHAR},
      </if>
      <if test="createTime != null">
        #{createTime,jdbcType=TIMESTAMP},
      </if>
      <if test="updateUser != null">
        #{updateUser,jdbcType=VARCHAR},
      </if>
      <if test="updateTime != null">
        #{updateTime,jdbcType=TIMESTAMP},
      </if>
      <if test="backupUser != null">
        #{backupUser,jdbcType=VARCHAR},
      </if>
      <if test="backupTime != null">
        #{backupTime,jdbcType=TIMESTAMP},
      </if>
    </trim>
  </insert>
  <update id="updateByExampleSelective" parameterType="map">
    update wdi_send_msg_history_01
    <set>
      <if test="record.id != null">
        id = #{record.id,jdbcType=INTEGER},
      </if>
      <if test="record.receiveMsgTableName != null">
        receive_msg_table_name = #{record.receiveMsgTableName,jdbcType=VARCHAR},
      </if>
      <if test="record.receiveMsgId != null">
        receive_msg_id = #{record.receiveMsgId,jdbcType=INTEGER},
      </if>
      <if test="record.receiveConnectAdd != null">
        receive_connect_add = #{record.receiveConnectAdd,jdbcType=CHAR},
      </if>
      <if test="record.msgText != null">
        msg_text = #{record.msgText,jdbcType=VARCHAR},
      </if>
      <if test="record.msgLength != null">
        msg_length = #{record.msgLength,jdbcType=INTEGER},
      </if>
      <if test="record.receiveServicecd != null">
        receive_servicecd = #{record.receiveServicecd,jdbcType=VARCHAR},
      </if>
      <if test="record.sendConnectAdd != null">
        send_connect_add = #{record.sendConnectAdd,jdbcType=CHAR},
      </if>
      <if test="record.operationFinish != null">
        operation_finish = #{record.operationFinish,jdbcType=CHAR},
      </if>
      <if test="record.createUser != null">
        create_user = #{record.createUser,jdbcType=VARCHAR},
      </if>
      <if test="record.createTime != null">
        create_time = #{record.createTime,jdbcType=TIMESTAMP},
      </if>
      <if test="record.updateUser != null">
        update_user = #{record.updateUser,jdbcType=VARCHAR},
      </if>
      <if test="record.updateTime != null">
        update_time = #{record.updateTime,jdbcType=TIMESTAMP},
      </if>
      <if test="record.backupUser != null">
        backup_user = #{record.backupUser,jdbcType=VARCHAR},
      </if>
      <if test="record.backupTime != null">
        backup_time = #{record.backupTime,jdbcType=TIMESTAMP},
      </if>
    </set>
    <if test="_parameter != null">
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
  <update id="updateByExample" parameterType="map">
    update wdi_send_msg_history_01
    set id = #{record.id,jdbcType=INTEGER},
      receive_msg_table_name = #{record.receiveMsgTableName,jdbcType=VARCHAR},
      receive_msg_id = #{record.receiveMsgId,jdbcType=INTEGER},
      receive_connect_add = #{record.receiveConnectAdd,jdbcType=CHAR},
      msg_text = #{record.msgText,jdbcType=VARCHAR},
      msg_length = #{record.msgLength,jdbcType=INTEGER},
      receive_servicecd = #{record.receiveServicecd,jdbcType=VARCHAR},
      send_connect_add = #{record.sendConnectAdd,jdbcType=CHAR},
      operation_finish = #{record.operationFinish,jdbcType=CHAR},
      create_user = #{record.createUser,jdbcType=VARCHAR},
      create_time = #{record.createTime,jdbcType=TIMESTAMP},
      update_user = #{record.updateUser,jdbcType=VARCHAR},
      update_time = #{record.updateTime,jdbcType=TIMESTAMP},
      backup_user = #{record.backupUser,jdbcType=VARCHAR},
      backup_time = #{record.backupTime,jdbcType=TIMESTAMP}
    <if test="_parameter != null">
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
  <update id="updateByPrimaryKeySelective" parameterType="infosky.wdis.entity.WdiSendMsgHistory">
    update wdi_send_msg_history_01
    <set>
      <if test="receiveMsgTableName != null">
        receive_msg_table_name = #{receiveMsgTableName,jdbcType=VARCHAR},
      </if>
      <if test="receiveMsgId != null">
        receive_msg_id = #{receiveMsgId,jdbcType=INTEGER},
      </if>
      <if test="receiveConnectAdd != null">
        receive_connect_add = #{receiveConnectAdd,jdbcType=CHAR},
      </if>
      <if test="msgText != null">
        msg_text = #{msgText,jdbcType=VARCHAR},
      </if>
      <if test="msgLength != null">
        msg_length = #{msgLength,jdbcType=INTEGER},
      </if>
      <if test="receiveServicecd != null">
        receive_servicecd = #{receiveServicecd,jdbcType=VARCHAR},
      </if>
      <if test="sendConnectAdd != null">
        send_connect_add = #{sendConnectAdd,jdbcType=CHAR},
      </if>
      <if test="operationFinish != null">
        operation_finish = #{operationFinish,jdbcType=CHAR},
      </if>
      <if test="createUser != null">
        create_user = #{createUser,jdbcType=VARCHAR},
      </if>
      <if test="createTime != null">
        create_time = #{createTime,jdbcType=TIMESTAMP},
      </if>
      <if test="updateUser != null">
        update_user = #{updateUser,jdbcType=VARCHAR},
      </if>
      <if test="updateTime != null">
        update_time = #{updateTime,jdbcType=TIMESTAMP},
      </if>
      <if test="backupUser != null">
        backup_user = #{backupUser,jdbcType=VARCHAR},
      </if>
      <if test="backupTime != null">
        backup_time = #{backupTime,jdbcType=TIMESTAMP},
      </if>
    </set>
    where id = #{id,jdbcType=INTEGER}
  </update>
  <update id="updateByPrimaryKey" parameterType="infosky.wdis.entity.WdiSendMsgHistory">
    update wdi_send_msg_history_01
    set receive_msg_table_name = #{receiveMsgTableName,jdbcType=VARCHAR},
      receive_msg_id = #{receiveMsgId,jdbcType=INTEGER},
      receive_connect_add = #{receiveConnectAdd,jdbcType=CHAR},
      msg_text = #{msgText,jdbcType=VARCHAR},
      msg_length = #{msgLength,jdbcType=INTEGER},
      receive_servicecd = #{receiveServicecd,jdbcType=VARCHAR},
      send_connect_add = #{sendConnectAdd,jdbcType=CHAR},
      operation_finish = #{operationFinish,jdbcType=CHAR},
      create_user = #{createUser,jdbcType=VARCHAR},
      create_time = #{createTime,jdbcType=TIMESTAMP},
      update_user = #{updateUser,jdbcType=VARCHAR},
      update_time = #{updateTime,jdbcType=TIMESTAMP},
      backup_user = #{backupUser,jdbcType=VARCHAR},
      backup_time = #{backupTime,jdbcType=TIMESTAMP}
    where id = #{id,jdbcType=INTEGER}
  </update>
</mapper>

WdiBackupDataMapper.xml

<?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="infosky.wdis.dao.WdiBackupDataMapper">

    <resultMap id="DiBackupData" type="infosky.wdis.entity.WdiBackupData">
        <result column="minId" property="minId"/>
        <result column="maxId" property="maxId"/>
    </resultMap>

    <select id="getMinMaxID" parameterType="infosky.wdis.entity.WdiBackupData" resultMap="DiBackupData">
        select min(tb.id) as minId,
               max(tb.id) as maxId
          from ${tbnm} tb
         where tb.update_time <![CDATA[ < ]]> (current_timestamp - interval '15 day')
    </select>

    <insert id="backUpData"  parameterType="infosky.wdis.entity.WdiBackupData">
        insert into ${tbnm_history} 
        (select *,
                'SYSTEM_TASK_BACKUPJOB' as backup_user,
                current_timestamp as backup_time 
           from ${tbnm} 
          where id <![CDATA[ >= ]]> #{minId} 
            and id <![CDATA[ <= ]]> #{maxId})
    </insert>
    
    <delete id="deleteData" parameterType="infosky.wdis.entity.WdiBackupData">
        delete from ${tbnm} tb
         where id <![CDATA[ >= ]]> #{minId} 
           and id <![CDATA[ <= ]]> #{maxId}
    </delete>
    
    <select id="getMaxId" parameterType="String" resultType="java.lang.Integer">
        select max(tb.id) as maxId
          from ${tableName} tb
    </select>
</mapper>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章