• 接口DBLINK初尝试


    需求:

    将寿险核心库中的黑名单数据提取到团险核心中,供团险核心使用,并且在核心前端页面需配置对应的菜单,提供相应的按钮,该接口采用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,否则是删不了的。

      1 package com.sinosoft.lis.bjbs.tasks;
      2 
      3 import java.sql.Connection;
      4 import java.sql.SQLException;
      5 import java.util.ArrayList;
      6 import java.util.List;
      7 
      8 import com.sinosoft.lis.common.bjbs.LogUtils;
      9 import com.sinosoft.lis.manualtasks.tasks.TaskService;
     10 import com.sinosoft.lis.pubfun.MMap;
     11 import com.sinosoft.lis.pubfun.PubFun;
     12 import com.sinosoft.lis.pubfun.PubSubmit;
     13 import com.sinosoft.tech.log.Logger;
     14 import com.sinosoft.tech.log.LoggerFactory;
     15 import com.sinosoft.tech.security.UserInfo;
     16 import com.sinosoft.utility.CError;
     17 import com.sinosoft.utility.CErrors;
     18 import com.sinosoft.utility.DBConnPool;
     19 import com.sinosoft.utility.ExeSQL;
     20 import com.sinosoft.utility.SSRS;
     21 import com.sinosoft.utility.TransferData;
     22 import com.sinosoft.utility.VData;
     23 
     24 /**
     25  * <p>
     26  * Title:黑名单数据提取
     27  * </p>
     28  * 
     29  * <p>
     30  * Copyright: Copyright (c) 2012
     31  * </p>
     32  * 
     33  * <p>
     34  * Company: Sinosoft
     35  * </p>
     36  * 
     37  * @author 赵永强
     38  * @date 2019-08-22
     39  * 
     40  */
     41 public class BlackListDataPushBL implements TaskService {
     42 
     43     static final Logger logger = LoggerFactory.getLogger(BlackListDataPushBL.class);
     44 
     45     /** 错误处理类,每个需要错误处理的类中都放置该类 */
     46     private CErrors mErrors = new CErrors();
     47 
     48     /** 传入数据的容器 */
     49     private VData mInputData = new VData();
     50 
     51     /** 往后面传输数据的容器 */
     52     private VData mResult = new VData();
     53 
     54     /** 提交数据的容器 */
     55     private MMap mMMap = new MMap();
     56 
     57     /** 存储全局变量 */
     58     private UserInfo mUserInfo = new UserInfo();
     59 
     60     private String mOperate;
     61 
     62     // 当前日志记录批次
     63     private String mBatchID;
     64 
     65     private StringBuffer mStrBuff = new StringBuffer();
     66 
     67     private ExeSQL mExeSQL = new ExeSQL();
     68 
     69     private List<String> mMsgs = new ArrayList<>();
     70 
     71     // 系统当前日期
     72     private String mCurrentDate = PubFun.getCurrentDate();
     73     // 系统当前时间
     74     private String mCurrentTime = PubFun.getCurrentTime();
     75 
     76     /** 抽数据日期 */
     77     private String mStartDate;
     78     private String mEndDate;
     79     private String mDealDate;
     80     // 记录日志
     81     private LogUtils mLogUtils;
     82     private String mCustomerNo;
     83     private String mContNo;
     84 
     85     @Override
     86     public boolean submitData(VData vData, String operate) {
     87         if (!getInputData(vData, operate)) {
     88             return false;
     89         }
     90 
     91         if (!checkData()) {
     92             return false;
     93         }
     94 
     95         if (!dealData()) {
     96             return false;
     97         }
     98 
     99         return true;
    100     }
    101 
    102     private boolean dealData() {
    103         mLogUtils = new LogUtils("HMD", "黑名单数据提取");
    104         logger.info("=====================推数开始=============日志批次号:" + mLogUtils.getBatchNo() + "=======");
    105         mLogUtils.recordLog("Before");// 将pushflag=0
    106 
    107         logger.info("&&&&&&&&&&&&&&& 开始推送黑名单数据 &&&&&&&&&&&&&&&");
    108 
    109         // 先删除中间表的数据
    110         if (!deleteData()) {
    111             buildError("deleteData", "删除中间表数据失败!");
    112             return false;
    113         }
    114         // 推送数据
    115         if (!pushData()) {
    116             buildError("pushData", "提取数据失败!");
    117             return false;
    118         }
    119 
    120         mLogUtils.recordLog("After");// 将pushflag=1
    121 
    122         logger.info("=====================推数完成============日志批次号:" + mLogUtils.getBatchNo() + "=======");
    123         return true;
    124     }
    125 
    126     /**
    127      * 先删除中间表中的数据
    128      * 
    129      * @return
    130      */
    131     private boolean deleteData() {
    132         mMMap.put(" TRUNCATE TABLE  t_slis_blaent ", "TRUNCATE");
    133         mMMap.put(" TRUNCATE TABLE  t_slis_blaent_dobs  ", "TRUNCATE");
    134         mMMap.put(" TRUNCATE TABLE  t_slis_blaent_pobs  ", "TRUNCATE");
    135         mMMap.put(" TRUNCATE TABLE  t_slis_blaent_citizenships ", "TRUNCATE");
    136         mMMap.put(" TRUNCATE TABLE  t_slis_blaent_nationalities  ", "TRUNCATE");
    137         mMMap.put(" TRUNCATE TABLE  t_slis_blaent_aliases  ", "TRUNCATE");
    138         mMMap.put(" TRUNCATE TABLE  t_slis_blaent_nativeCharNames  ", "TRUNCATE");
    139         mMMap.put(" TRUNCATE TABLE  t_slis_blaent_ids  ", "TRUNCATE");
    140         mMMap.put(" TRUNCATE TABLE  t_slis_blaent_routingCodes  ", "TRUNCATE");
    141         mMMap.put(" TRUNCATE TABLE  t_slis_blaent_programs  ", "TRUNCATE");
    142         mMMap.put(" TRUNCATE TABLE  t_slis_blaent_titles  ", "TRUNCATE");
    143         mMMap.put(" TRUNCATE TABLE  t_slis_blaent_addresses  ", "TRUNCATE");
    144         mMMap.put(" TRUNCATE TABLE  t_slis_blaent_otherIDs  ", "TRUNCATE");
    145         mMMap.put(" TRUNCATE TABLE  t_slis_blaent_sdf  ", "TRUNCATE");
    146         mMMap.put(" TRUNCATE TABLE  t_slis_blaent_extractsummary  ", "TRUNCATE");
    147         // 提交事务
    148         if (!saveData()) {
    149             buildError("saveData", "执行数据插入失败!");
    150             return false;
    151         }
    152         // mMMap.put("delete from  t_slis_blaent_releasenotes where createtime=  '"
    153         // + mDealDate + "' ","DELETE");
    154         return true;
    155     }
    156 
    157     /**
    158      * 推送数据 使用同义词,防止上生产之后,dblink名字被替换掉,导致sql语句不能发挥作用
    159      * 因为寿险库中黑名单表没有主键,现在团险新核心黑名单表有主键,在导入数据的时候会报违反唯一约束,去掉return
    160      * false,即使某张表报错,并不影响其他表的导入。
    161      * 
    162      * @return
    163      */
    164     private boolean pushData() {
    165         StringBuffer mStrBuff = new StringBuffer();
    166         // 黑名单实体主表 问题现在寿险库中没有主键,团险核心库是有主键的,所以会报一个违反唯一约束,entityid <> '1234562'
    167         mStrBuff.append(" insert into t_slis_blaent ");
    168         mStrBuff.append(" select * from SH_t_slis_blaent  ");
    169         mMMap.put(mStrBuff.toString(), "INSERT");
    170         if (!saveData()) {
    171             buildError("saveData", "执行t_slis_blaent表数据插入失败!");
    172             // return false;
    173         }
    174         // 黑名单实体出生日期
    175         mStrBuff = new StringBuffer();
    176         mStrBuff.append(" insert into t_slis_blaent_dobs ");
    177         mStrBuff.append(" select * from SH_t_slis_blaent_dobs   ");
    178         mMMap.put(mStrBuff.toString(), "INSERT");
    179         if (!saveData()) {
    180             buildError("saveData", "执行t_slis_blaent_dobs表数据插入失败!");
    181             // return false;
    182         }
    183         // 黑名单实体出生地点 这张表中重复的数据台多了
    184         mStrBuff = new StringBuffer();
    185         mStrBuff.append(" insert into t_slis_blaent_pobs ");
    186         mStrBuff.append(" select * from SH_t_slis_blaent_pobs    ");
    187         mMMap.put(mStrBuff.toString(), "INSERT");
    188         if (!saveData()) {
    189             buildError("saveData", "执行t_slis_blaent_pobs表数据插入失败!");
    190             // return false;
    191         }
    192         // 黑名单实体国民:
    193         mStrBuff = new StringBuffer();
    194         mStrBuff.append(" insert into t_slis_blaent_citizenships ");
    195         mStrBuff.append(" select * from SH_t_slis_blaent_citizenships   ");
    196         mMMap.put(mStrBuff.toString(), "INSERT");
    197         if (!saveData()) {
    198             buildError("saveData", "执行t_slis_blaent_citizenships表数据插入失败!");
    199             // return false;
    200         }
    201         // 黑名单实体国籍
    202         mStrBuff = new StringBuffer();
    203         mStrBuff.append(" insert into t_slis_blaent_nationalities ");
    204         mStrBuff.append(" select * from SH_t_slis_blaent_nationalities    ");
    205         mMMap.put(mStrBuff.toString(), "INSERT");
    206         if (!saveData()) {
    207             buildError("saveData", "执行t_slis_blaent_nationalities表数据插入失败!");
    208             // return false;
    209         }
    210         // 黑名单实体别名
    211         mStrBuff = new StringBuffer();
    212         mStrBuff.append(" insert into t_slis_blaent_aliases ");
    213         mStrBuff.append(" select * from SH_t_slis_blaent_aliases    ");
    214         mMMap.put(mStrBuff.toString(), "INSERT");
    215         if (!saveData()) {
    216             buildError("saveData", "执行t_slis_blaent_aliases表数据插入失败!");
    217             // return false;
    218         }
    219         // 黑名单实体原体字符名称 entityid<>'1234562'
    220         mStrBuff = new StringBuffer();
    221         mStrBuff.append(" insert into t_slis_blaent_nativeCharNames ");
    222         mStrBuff.append(" select * from SH_t_slis_blaent_nativeCharNames  where entityid<>'1234562'  ");
    223         mMMap.put(mStrBuff.toString(), "INSERT");
    224         if (!saveData()) {
    225             buildError("saveData", "执行t_slis_blaent_nativeCharNames表数据插入失败!");
    226             // return false;
    227         }
    228         // 黑名单实体识别ID
    229         mStrBuff = new StringBuffer();
    230         mStrBuff.append(" insert into t_slis_blaent_ids ");
    231         mStrBuff.append(" select * from SH_t_slis_blaent_ids   ");
    232         mMMap.put(mStrBuff.toString(), "INSERT");
    233         if (!saveData()) {
    234             buildError("saveData", "执行t_slis_blaent_ids表数据插入失败!");
    235             // return false;
    236         }
    237         // 黑名单实体金融机构路由代码
    238         mStrBuff = new StringBuffer();
    239         mStrBuff.append(" insert into t_slis_blaent_routingCodes ");
    240         mStrBuff.append(" select * from SH_t_slis_blaent_routingCodes    ");
    241         mMMap.put(mStrBuff.toString(), "INSERT");
    242         if (!saveData()) {
    243             buildError("saveData", "执行t_slis_blaent_routingCodes表数据插入失败!");
    244             // return false;
    245         }
    246         // 黑名单实体制裁项目 有大量的重复数据
    247         mStrBuff = new StringBuffer();
    248         mStrBuff.append(" insert into t_slis_blaent_programs ");
    249         mStrBuff.append(" select * from SH_t_slis_blaent_programs   ");
    250         mMMap.put(mStrBuff.toString(), "INSERT");
    251         if (!saveData()) {
    252             buildError("saveData", "执行t_slis_blaent_programs表数据插入失败!");
    253             // return false;
    254         }
    255         // 黑名单实体职位
    256         mStrBuff = new StringBuffer();
    257         mStrBuff.append(" insert into t_slis_blaent_titles ");
    258         mStrBuff.append(" select * from SH_t_slis_blaent_titles    ");
    259         mMMap.put(mStrBuff.toString(), "INSERT");
    260         if (!saveData()) {
    261             buildError("saveData", "执行t_slis_blaent_titles表数据插入失败!");
    262             // return false;
    263         }
    264         // 黑名单实体地址
    265         mStrBuff = new StringBuffer();
    266         mStrBuff.append(" insert into t_slis_blaent_addresses ");
    267         mStrBuff.append(" select * from SH_t_slis_blaent_addresses   ");
    268         mMMap.put(mStrBuff.toString(), "INSERT");
    269         if (!saveData()) {
    270             buildError("saveData", "执行t_slis_blaent_addresses表数据插入失败!");
    271             // return false;
    272         }
    273         // 黑名单实体其它ID 有9条重复数据
    274         mStrBuff = new StringBuffer();
    275         mStrBuff.append(" insert into t_slis_blaent_otherIDs ");
    276         mStrBuff.append(" select * from SH_t_slis_blaent_otherIDs    ");
    277         mMMap.put(mStrBuff.toString(), "INSERT");
    278         if (!saveData()) {
    279             buildError("saveData", "执行t_slis_blaent_otherIDs表数据插入失败!");
    280             // return false;
    281         }
    282         // 黑名单实体补充数据: 有大量重复数据
    283         mStrBuff = new StringBuffer();
    284         mStrBuff.append(" insert into t_slis_blaent_sdf ");
    285         mStrBuff.append(" select * from SH_t_slis_blaent_sdf    ");
    286         mMMap.put(mStrBuff.toString(), "INSERT");
    287         if (!saveData()) {
    288             buildError("saveData", "执行t_slis_blaent_sdf表数据插入失败!");
    289             // return false;
    290         }
    291         // 黑名单实体版本内容简介备份表 有4条重复数据
    292         mStrBuff = new StringBuffer();
    293         mStrBuff.append(" insert into t_slis_blaent_extractsummary ");
    294         mStrBuff.append(" select * from SH_t_slis_blaent_extractsummary    ");
    295         mMMap.put(mStrBuff.toString(), "INSERT");
    296         if (!saveData()) {
    297             buildError("saveData", "执行数据插入失败!");
    298             // return false;
    299         }
    300         // (生产不存在)黑名单实体版本更新记录
    301         /*
    302          * mStrBuff = new StringBuffer();
    303          * mStrBuff.append(" insert into t_slis_blaent_extractsummary ");
    304          * mStrBuff.append(
    305          * " (VERSION, LISTIDS, LISTNAMES, LISTTYPES, LISTISSUERDATE, ACCTSEQ, BACKER, BACKTIME, BACKFLAG, CREATOR, CREATETIME, LOGID, SPARE1, SPARE2) "
    306          * ); mStrBuff.append(" values( "); mStrBuff.append(
    307          * "   SELECT * FROM t_slis_blaent_extractsummary  where createtime='"
    308          * +mDealDate+"') "); mMMap.put(mStrBuff.toString(), "INSERT");
    309          */
    310 
    311         return true;
    312     }
    313 
    314     /**
    315      * 对传入的数据进行校验
    316      * 
    317      * @return 如果校验成功,则返回true,否则返回false
    318      */
    319     private boolean checkData() {
    320 
    321         return true;
    322     }
    323 
    324     /**
    325      * 从输入数据中得到所有对象
    326      * 
    327      * @param cInputData
    328      *            传入数据对象
    329      * @param cOperate
    330      *            操作类型
    331      * @return 如果没有得到足够的业务数据对象,则返回false,否则返回true
    332      */
    333     private boolean getInputData(VData cInputData, String operate) {
    334         // 获得全局公共数据
    335         mInputData = (VData) cInputData.clone();
    336         mUserInfo = (UserInfo) cInputData.getObjectByObjectName("UserInfo", 0);
    337         TransferData tTransferData = (TransferData) cInputData.getObjectByObjectName("TransferData", 0);
    338         // 现在前端不传这些值了 2019-08-28
    339         /*
    340          * mStartDate = (String) tTransferData.getValueByName("StartDate");
    341          * mEndDate = (String) tTransferData.getValueByName("EndDate");
    342          * logger.info("mStartDate>>>>>>>>>>>>" + mStartDate);
    343          * logger.info("mEndDate>>>>>>>>>>>>" + mEndDate);
    344          */
    345 
    346         return true;
    347     }
    348 
    349     /**
    350      * 数据提交
    351      * 
    352      * @return 如果提交失败,则返回false,否则返回true
    353      */
    354     private boolean saveData() {
    355 
    356         mInputData.clear();
    357         mInputData.add(mMMap);
    358         // 连接团险核心数据库
    359         Connection conn = DBConnPool.getConnection();
    360 
    361         try {
    362             conn.setAutoCommit(false);
    363             PubSubmit tPubSubmit = new PubSubmit(conn);
    364 
    365             if (!tPubSubmit.submitData(mInputData, null)) {
    366                 mErrors.addOneError(tPubSubmit.getErrors().getFirstError());
    367                 conn.rollback();
    368                 return false;
    369             }
    370             conn.commit();
    371         } catch (SQLException e1) {
    372             try {
    373                 conn.rollback();
    374             } catch (SQLException e) {
    375                 e.printStackTrace();
    376             }
    377             buildError("saveData", e1.getMessage());
    378             return false;
    379         } finally {
    380             if (conn != null) {
    381                 try {
    382                     conn.close();
    383                 } catch (SQLException e) {
    384                     e.printStackTrace();
    385                 }
    386             }
    387         }
    388         return true;
    389     }
    390 
    391     @Override
    392     public VData getResult() {
    393         // TODO Auto-generated method stub
    394         return mResult;
    395     }
    396 
    397     /**
    398      * 错误构造方法
    399      * 
    400      * @param tFunctionName
    401      * @param tErrorMessage
    402      */
    403     private void buildError(String tFunctionName, String tErrorMessage) {
    404 
    405         CError tCError = new CError();
    406         tCError.moduleName = this.getClass().getSimpleName();
    407         tCError.functionName = tFunctionName;
    408         tCError.errorMessage = tErrorMessage;
    409         mErrors.addOneError(tCError);
    410         logger.error(tErrorMessage);
    411         System.out.println(tErrorMessage);
    412     }
    413 
    414     @Override
    415     public CErrors getErrors() {
    416         // TODO Auto-generated method stub
    417         return mErrors;
    418     }
    419 
    420     /**
    421      * 测试
    422      * 
    423      * @param args
    424      */
    425     public static void main(String[] args) {
    426         BlackListDataPushBL tBlackListDataPushBL = new BlackListDataPushBL();
    427         VData tData = new VData();
    428         UserInfo tInfo = new UserInfo();
    429         tInfo.setManageCom("86");
    430         tInfo.setUserName("张三");
    431         tInfo.setPassword("111");
    432         TransferData transferData = new TransferData();
    433         transferData.setNameAndValue("StartDate", "2019-08-28");
    434         transferData.setNameAndValue("EndDate", "2019-08-29");
    435         tData.add(tInfo);
    436         tData.add(transferData);
    437         tBlackListDataPushBL.submitData(tData, "");
    438     }
    439 
    440 }

    在编写代码的过程中: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’

  • 相关阅读:
    2.6
    20、算法的复杂度
    SVN的部署及分支等方法
    19、数据库设计的三大范式
    2.ViewBag、ViewData、TempData之间的区别
    1、MVC和EF中的 Model First 和 Code First
    19、lambda表达式树
    12、c#中事务及回滚
    11、Linq的使用
    18、(番外)匿名方法+lambda表达式
  • 原文地址:https://www.cnblogs.com/dongyaotou/p/11463070.html
Copyright © 2020-2023  润新知