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