需求:

将寿险核心库中的黑名单数据提取到团险核心中,供团险核心使用,并且在核心前端页面需配置对应的菜单,提供相应的按钮,该接口采用dblink的方式进行提取。

通过本地数据库配置dblink访问远程数据库。在编码的过程中,考虑到项目上线之后dblink的名字可能会被替换,自己为使用到的远程数据库的这些表创建了同义词,提高了代码的可维护性。

dblink:通俗的讲,就是从一个数据库上,获得另外一个数据库的访问权,并对其进行增删改查操作。

创建dblink,我比较推荐使用写sql语句的方式,因为自己试过使用plsql图形化操作的方式,但是失败了,使用sql语句的形式成功了。

这是创建dblink的sql语句:

CREATE PUBLIC DATABASE LINK SLISOPER3Y CONNECT TO slisoper IDENTIFIED BY njnil3#5hiUil USING '(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 10.8.199.171)(PORT = 1521))

)

(CONNECT_DATA =

(SERVICE_NAME = ghisuat)

)

)'

使用dblink的方式通过本地数据库查询0其他数据库sql:

SELECT * FROM t_slis_blaent@SLISOPER3Y;--结构:t_slis_blaent是另外一个数据库中表的名字    SLISOPER3Y:是dblink的名字

查询数据库中有多少个dblink :     SELECT * FROM dba_db_links

创建同义词:CREATE SYNONYM  SH_t_slis_blaent_sdf For t_slis_blaent_sdf@SLIS_UAT;

删除dblink: drop public database link SLISOPER3Y;--注意:一定要加上public,否则是删不了的。

 package com.sinosoft.lis.bjbs.tasks;

 import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List; import com.sinosoft.lis.common.bjbs.LogUtils;
import com.sinosoft.lis.manualtasks.tasks.TaskService;
import com.sinosoft.lis.pubfun.MMap;
import com.sinosoft.lis.pubfun.PubFun;
import com.sinosoft.lis.pubfun.PubSubmit;
import com.sinosoft.tech.log.Logger;
import com.sinosoft.tech.log.LoggerFactory;
import com.sinosoft.tech.security.UserInfo;
import com.sinosoft.utility.CError;
import com.sinosoft.utility.CErrors;
import com.sinosoft.utility.DBConnPool;
import com.sinosoft.utility.ExeSQL;
import com.sinosoft.utility.SSRS;
import com.sinosoft.utility.TransferData;
import com.sinosoft.utility.VData; /**
* <p>
* Title:黑名单数据提取
* </p>
*
* <p>
* Copyright: Copyright (c) 2012
* </p>
*
* <p>
* Company: Sinosoft
* </p>
*
* @author 赵永强
* @date 2019-08-22
*
*/
public class BlackListDataPushBL implements TaskService { static final Logger logger = LoggerFactory.getLogger(BlackListDataPushBL.class); /** 错误处理类,每个需要错误处理的类中都放置该类 */
private CErrors mErrors = new CErrors(); /** 传入数据的容器 */
private VData mInputData = new VData(); /** 往后面传输数据的容器 */
private VData mResult = new VData(); /** 提交数据的容器 */
private MMap mMMap = new MMap(); /** 存储全局变量 */
private UserInfo mUserInfo = new UserInfo(); private String mOperate; // 当前日志记录批次
private String mBatchID; private StringBuffer mStrBuff = new StringBuffer(); private ExeSQL mExeSQL = new ExeSQL(); private List<String> mMsgs = new ArrayList<>(); // 系统当前日期
private String mCurrentDate = PubFun.getCurrentDate();
// 系统当前时间
private String mCurrentTime = PubFun.getCurrentTime(); /** 抽数据日期 */
private String mStartDate;
private String mEndDate;
private String mDealDate;
// 记录日志
private LogUtils mLogUtils;
private String mCustomerNo;
private String mContNo; @Override
public boolean submitData(VData vData, String operate) {
if (!getInputData(vData, operate)) {
return false;
} if (!checkData()) {
return false;
} if (!dealData()) {
return false;
} return true;
} private boolean dealData() {
mLogUtils = new LogUtils("HMD", "黑名单数据提取");
logger.info("=====================推数开始=============日志批次号:" + mLogUtils.getBatchNo() + "=======");
mLogUtils.recordLog("Before");// 将pushflag=0 logger.info("&&&&&&&&&&&&&&& 开始推送黑名单数据 &&&&&&&&&&&&&&&"); // 先删除中间表的数据
if (!deleteData()) {
buildError("deleteData", "删除中间表数据失败!");
return false;
}
// 推送数据
if (!pushData()) {
buildError("pushData", "提取数据失败!");
return false;
} mLogUtils.recordLog("After");// 将pushflag=1 logger.info("=====================推数完成============日志批次号:" + mLogUtils.getBatchNo() + "=======");
return true;
} /**
* 先删除中间表中的数据
*
* @return
*/
private boolean deleteData() {
mMMap.put(" TRUNCATE TABLE t_slis_blaent ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_dobs ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_pobs ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_citizenships ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_nationalities ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_aliases ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_nativeCharNames ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_ids ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_routingCodes ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_programs ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_titles ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_addresses ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_otherIDs ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_sdf ", "TRUNCATE");
mMMap.put(" TRUNCATE TABLE t_slis_blaent_extractsummary ", "TRUNCATE");
// 提交事务
if (!saveData()) {
buildError("saveData", "执行数据插入失败!");
return false;
}
// mMMap.put("delete from t_slis_blaent_releasenotes where createtime= '"
// + mDealDate + "' ","DELETE");
return true;
} /**
* 推送数据 使用同义词,防止上生产之后,dblink名字被替换掉,导致sql语句不能发挥作用
* 因为寿险库中黑名单表没有主键,现在团险新核心黑名单表有主键,在导入数据的时候会报违反唯一约束,去掉return
* false,即使某张表报错,并不影响其他表的导入。
*
* @return
*/
private boolean pushData() {
StringBuffer mStrBuff = new StringBuffer();
// 黑名单实体主表 问题现在寿险库中没有主键,团险核心库是有主键的,所以会报一个违反唯一约束,entityid <> '1234562'
mStrBuff.append(" insert into t_slis_blaent ");
mStrBuff.append(" select * from SH_t_slis_blaent ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent表数据插入失败!");
// return false;
}
// 黑名单实体出生日期
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_dobs ");
mStrBuff.append(" select * from SH_t_slis_blaent_dobs ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_dobs表数据插入失败!");
// return false;
}
// 黑名单实体出生地点 这张表中重复的数据台多了
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_pobs ");
mStrBuff.append(" select * from SH_t_slis_blaent_pobs ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_pobs表数据插入失败!");
// return false;
}
// 黑名单实体国民:
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_citizenships ");
mStrBuff.append(" select * from SH_t_slis_blaent_citizenships ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_citizenships表数据插入失败!");
// return false;
}
// 黑名单实体国籍
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_nationalities ");
mStrBuff.append(" select * from SH_t_slis_blaent_nationalities ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_nationalities表数据插入失败!");
// return false;
}
// 黑名单实体别名
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_aliases ");
mStrBuff.append(" select * from SH_t_slis_blaent_aliases ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_aliases表数据插入失败!");
// return false;
}
// 黑名单实体原体字符名称 entityid<>'1234562'
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_nativeCharNames ");
mStrBuff.append(" select * from SH_t_slis_blaent_nativeCharNames where entityid<>'1234562' ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_nativeCharNames表数据插入失败!");
// return false;
}
// 黑名单实体识别ID
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_ids ");
mStrBuff.append(" select * from SH_t_slis_blaent_ids ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_ids表数据插入失败!");
// return false;
}
// 黑名单实体金融机构路由代码
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_routingCodes ");
mStrBuff.append(" select * from SH_t_slis_blaent_routingCodes ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_routingCodes表数据插入失败!");
// return false;
}
// 黑名单实体制裁项目 有大量的重复数据
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_programs ");
mStrBuff.append(" select * from SH_t_slis_blaent_programs ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_programs表数据插入失败!");
// return false;
}
// 黑名单实体职位
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_titles ");
mStrBuff.append(" select * from SH_t_slis_blaent_titles ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_titles表数据插入失败!");
// return false;
}
// 黑名单实体地址
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_addresses ");
mStrBuff.append(" select * from SH_t_slis_blaent_addresses ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_addresses表数据插入失败!");
// return false;
}
// 黑名单实体其它ID 有9条重复数据
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_otherIDs ");
mStrBuff.append(" select * from SH_t_slis_blaent_otherIDs ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_otherIDs表数据插入失败!");
// return false;
}
// 黑名单实体补充数据: 有大量重复数据
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_sdf ");
mStrBuff.append(" select * from SH_t_slis_blaent_sdf ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行t_slis_blaent_sdf表数据插入失败!");
// return false;
}
// 黑名单实体版本内容简介备份表 有4条重复数据
mStrBuff = new StringBuffer();
mStrBuff.append(" insert into t_slis_blaent_extractsummary ");
mStrBuff.append(" select * from SH_t_slis_blaent_extractsummary ");
mMMap.put(mStrBuff.toString(), "INSERT");
if (!saveData()) {
buildError("saveData", "执行数据插入失败!");
// return false;
}
// (生产不存在)黑名单实体版本更新记录
/*
* mStrBuff = new StringBuffer();
* mStrBuff.append(" insert into t_slis_blaent_extractsummary ");
* mStrBuff.append(
* " (VERSION, LISTIDS, LISTNAMES, LISTTYPES, LISTISSUERDATE, ACCTSEQ, BACKER, BACKTIME, BACKFLAG, CREATOR, CREATETIME, LOGID, SPARE1, SPARE2) "
* ); mStrBuff.append(" values( "); mStrBuff.append(
* " SELECT * FROM t_slis_blaent_extractsummary where createtime='"
* +mDealDate+"') "); mMMap.put(mStrBuff.toString(), "INSERT");
*/ return true;
} /**
* 对传入的数据进行校验
*
* @return 如果校验成功,则返回true,否则返回false
*/
private boolean checkData() { return true;
} /**
* 从输入数据中得到所有对象
*
* @param cInputData
* 传入数据对象
* @param cOperate
* 操作类型
* @return 如果没有得到足够的业务数据对象,则返回false,否则返回true
*/
private boolean getInputData(VData cInputData, String operate) {
// 获得全局公共数据
mInputData = (VData) cInputData.clone();
mUserInfo = (UserInfo) cInputData.getObjectByObjectName("UserInfo", 0);
TransferData tTransferData = (TransferData) cInputData.getObjectByObjectName("TransferData", 0);
// 现在前端不传这些值了 2019-08-28
/*
* mStartDate = (String) tTransferData.getValueByName("StartDate");
* mEndDate = (String) tTransferData.getValueByName("EndDate");
* logger.info("mStartDate>>>>>>>>>>>>" + mStartDate);
* logger.info("mEndDate>>>>>>>>>>>>" + mEndDate);
*/ return true;
} /**
* 数据提交
*
* @return 如果提交失败,则返回false,否则返回true
*/
private boolean saveData() { mInputData.clear();
mInputData.add(mMMap);
// 连接团险核心数据库
Connection conn = DBConnPool.getConnection(); try {
conn.setAutoCommit(false);
PubSubmit tPubSubmit = new PubSubmit(conn); if (!tPubSubmit.submitData(mInputData, null)) {
mErrors.addOneError(tPubSubmit.getErrors().getFirstError());
conn.rollback();
return false;
}
conn.commit();
} catch (SQLException e1) {
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
buildError("saveData", e1.getMessage());
return false;
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return true;
} @Override
public VData getResult() {
// TODO Auto-generated method stub
return mResult;
} /**
* 错误构造方法
*
* @param tFunctionName
* @param tErrorMessage
*/
private void buildError(String tFunctionName, String tErrorMessage) { CError tCError = new CError();
tCError.moduleName = this.getClass().getSimpleName();
tCError.functionName = tFunctionName;
tCError.errorMessage = tErrorMessage;
mErrors.addOneError(tCError);
logger.error(tErrorMessage);
System.out.println(tErrorMessage);
} @Override
public CErrors getErrors() {
// TODO Auto-generated method stub
return mErrors;
} /**
* 测试
*
* @param args
*/
public static void main(String[] args) {
BlackListDataPushBL tBlackListDataPushBL = new BlackListDataPushBL();
VData tData = new VData();
UserInfo tInfo = new UserInfo();
tInfo.setManageCom("86");
tInfo.setUserName("张三");
tInfo.setPassword("111");
TransferData transferData = new TransferData();
transferData.setNameAndValue("StartDate", "2019-08-28");
transferData.setNameAndValue("EndDate", "2019-08-29");
tData.add(tInfo);
tData.add(transferData);
tBlackListDataPushBL.submitData(tData, "");
} }

在编写代码的过程中:insert into 和select  语句在组合的时候,自己犯了错误,特意记下,避免以后再犯:

正确:

insert into t_slis_blaent select * from t_slis_blaent@SLISOPER3Y where createtime=date'2019-08-28';

错误:

Insert into t_slis_blaent(字段名) values(select * from t_slis_blaent where createtime=date’2019-09-09’)

最新文章

  1. Win10 UI动画
  2. Scrum Guide - Scrum指南中文版
  3. Wireshark基本介绍和学习TCP三次握手
  4. 使用udev实现显示器的热插拔和usb的自动挂载
  5. ajax data数据里面传一个json到后台的写法
  6. 用js完成blog项目
  7. No Entertainment!
  8. ORA-15005: name &quot;orcl&quot; is already used by an existing alias
  9. 【PHP ThinkPHP框架】小bug汇总[更新]
  10. C# 如何获取某用户的“我的文档”的目录
  11. 原生JS实现几个常用DOM操作API
  12. .NET core RSA帮助类
  13. 网络协议学习(2)---IP地址
  14. 2018-2019-2 网络对抗技术 20165333 Exp3 免杀原理与实践
  15. Python3 图片水平镜像实现
  16. sjw-风评评测-定位页面元素
  17. pycharm 中脚本执行的3种模式
  18. MySQL存储引擎--MYSIAM和INNODB引擎区别
  19. YII2 设置session过期时间
  20. C语言发送邮件

热门文章

  1. LeetCode 238. 除自身以外数组的乘积(Product of Array Except Self)
  2. LeetCode 859. 亲密字符串(Buddy Strings) 23
  3. 【Linux】多线程同步的四种方式
  4. Java开发笔记(一百二十七)Swing的标签
  5. 永久修改 Linux pip国内源
  6. 38 多线程(十)——volatile 数据同步
  7. shell分享
  8. Tkinter &amp; mysql 的登录框练习
  9. vue3 父组件给子组件传值 provide &amp; inject
  10. resnet的理解-- 面试笔记