接口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’

原文地址:https://www.cnblogs.com/dongyaotou/p/11463070.html