--源数据库AS400,目标数据库为sqlserver
package aia.com.cn.sis.syndata.service.impl;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Service;
import aia.com.cn.sis.syndata.service.SyndataService;
@Service
public class SyndataServiceImpl implements SyndataService {
@Override
public boolean SyndataByPlanCode(String planCode){
// TODO Auto-generated method stub
boolean syndataSuccess =false;
String planCode1 ="";
Connection conn = null;
// DataSource ds = (DataSource) SpringContextUtil.getBean("dataSource");
for(int i=0;i<planCode.split(";").length;i++){
PreparedStatement pstmt = null;
try {
// conn = ds.getConnection();
conn = SyndataServiceImpl.getConnection();
CallableStatement cs = conn.prepareCall("{? = call dbo.sp_import_product(?,?)}");
planCode1=planCode.split(";")[i];
cs.registerOutParameter(1, java.sql.Types.INTEGER);
cs.setString(2,planCode1);
cs.registerOutParameter(3, java.sql.Types.INTEGER);
cs.execute();
int result = cs.getInt(3);
if(result == 1)
syndataSuccess = true;
else
syndataSuccess = false;
} catch (SQLException e) {
e.printStackTrace();
} finally {
SISUtils.closeConnection(conn, pstmt, null);
}
}
return syndataSuccess;
}
public static void main(String[] args) {
boolean isSuccess = new SyndataServiceImpl().SyndataByPlanCode("AIOJ19E2;AIOJ25E2");
System.out.println("存储过程执行结果:"+isSuccess);
}
// 获取连接
public static Connection getOlasConnection() {
Connection con = null;
try {
// 注册AS400
java.sql.DriverManager.registerDriver(new com.ibm.as400.access.AS400JDBCDriver());
con = DriverManager.getConnection("jdbc:as400://AIASH.AIA.BIZ;naming=system", "nsnp540", "Test@1234");
// 测试 获取sqlserver某张表的所有字段,插入sql打印 正常情况下不要放开
// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
// con =
// DriverManager.getConnection("jdbc:sqlserver://chot3r8csts02:1433;DatabaseName=CHOA1SIS",
// "devplogin", "devplogin");
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
public static Connection getConnection() {
Connection con = null;
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
con = DriverManager.getConnection("jdbc:sqlserver://chot3r8csts02:1433;DatabaseName=newsis", "devplogin",
"devplogin");
// 设置windows连接
// con =
// DriverManager.getConnection("jdbc:sqlserver://chot3r8csts02:1433;DatabaseName=CHOA1SIS;"
// + "integratedSecurity=true;");
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
// 获取连接
public static Connection getSISConnection() {
Connection con = null;
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
con = DriverManager.getConnection("jdbc:sqlserver://chot3r8csts02:1433;DatabaseName=CHOA1SIS", "devplogin",
"devplogin");
// 设置windows连接
// con =
// DriverManager.getConnection("jdbc:sqlserver://chot3r8csts02:1433;DatabaseName=CHOA1SIS;"
// + "integratedSecurity=true;");
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
@Override
public List<Object[][]> getDatas(String dataBaseName, String tableName, String plancode) throws Exception {
List<Object[][]> lists = new ArrayList<Object[][]>();
for (String tableName1 : tableName.split(";")) {
for (String plancode1 : plancode.split(";")) {
Object[][] datas = null;
Connection con = null;
PreparedStatement pStatement = null;
ResultSet rSet = null;
String sql = SISUtils.getFindSql(dataBaseName, tableName1);// 测试查询sqlserver的完整sql语句需要将此注掉
// String sql="select * from "+dataBaseName+"."+tableName;
try {
con = getOlasConnection();
pStatement = con.prepareStatement(sql);
pStatement.setString(1, "%" + plancode1 + "%");// 测试查询sqlserver的完整sql语句需要将此注掉
rSet = pStatement.executeQuery();
// 获取查询表列数
int columnCounts = rSet.getMetaData().getColumnCount();
// //获取表字段
List<String> columnNames = new ArrayList<String>();
for (int i = 1; i <= columnCounts; i++) {
columnNames.add(rSet.getMetaData().getColumnName(i));
}
// 打印某张表的sql dbo打印insert语句,非dbo打印select语句
// String sqlString="";
// String column=StringUtils.join(columnNames.toArray(),
// ",");
// String countColon="";//测试多少个占位符
// for(int i=0;i<columnNames.size();i++){
// countColon=countColon+",?";
// }
// countColon=countColon.substring(1);
// if(dataBaseName != null &&
// "dbo".equals(dataBaseName)){
// sqlString="insert into "+tableName + "("+column+")
// values("+countColon+");";
// }else{
// sqlString="select "+column +" from
// "+dataBaseName+"."+tableName;
// }
// System.out.println("完整sql语句为:" + sqlString);
// 获取表数据值
List<Object[]> valueLists = new ArrayList<Object[]>();
while (rSet.next()) {
// 每行数据封装成数组
Object[] rowData = new Object[columnCounts];
int i = 0;
for (int j = 0; j < columnCounts; j++) {
String columnName = columnNames.get(j);
rowData[i++] = rSet.getObject(columnName);
}
valueLists.add(rowData);
}
datas = new Object[valueLists.size()][columnCounts];// 定义数组长度
// 存值
int i = 0;
for (Object[] temp : valueLists) {
datas[i++] = temp;
}
lists.add(datas);
} catch (Exception e) {
e.printStackTrace();
throw new Exception("获取数据失败!");
} finally {
// 关闭连接
SISUtils.closeConnection(con, pStatement, rSet);
}
}
}
return lists;
}
@Override
public boolean importDatas(String planCode, String tableName, List<Object[][]> lists) throws Exception {
boolean isSuccess = false;
Connection con = getSISConnection();
PreparedStatement pStatement = null;
con.setAutoCommit(false);
if (tableName != null && tableName.split(";").length > 0 && planCode != null && lists != null
&& lists.size() > 0 && (planCode.split(";").length * tableName.split(";").length == lists.size())) {
for (int a=0,b=0; a < lists.size() && b < tableName.split(";").length; b++) {
String tableName1 = tableName.split(";")[b];
for(int c=0;c<planCode.split(";").length;c++){
Object[][] datas = lists.get(a);
a++;
final int batchSize = 1000;
// 获取sql
String sql = SISUtils.getSql(tableName1);
int count = 0;
try {
pStatement = con.prepareStatement(sql);
if (datas != null && datas.length > 0) {
for (int i = 0; i < datas.length; i++) {
Object[] rows = datas[i];
int whichCol = 0;
for (int j = 0; j < rows.length; j++) {
pStatement.setObject((whichCol + 1), rows[j]);
whichCol++;
}
pStatement.addBatch();
if (++count % batchSize == 0) {
pStatement.executeBatch();
}
}
pStatement.executeBatch();
System.out.printf("%s%n", "插入数据完毕!");
isSuccess = true;
}
} catch (Exception e) {
isSuccess = false;
e.printStackTrace();
con.rollback();
throw new Exception("插入数据失败!");
} finally {
SISUtils.closeConnection(null, pStatement, null);
}
}
}
}
if (isSuccess) {
con.commit();
} else {
con.rollback();
}
SISUtils.closeConnection(con, null, null);
return isSuccess;
}
}
--controller层
package aia.com.cn.sis.syndata.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import aia.com.cn.sis.syndata.service.SyndataService;
/**
* 公式配置
*
* @author Administrator
*
*/
@Controller
@RequestMapping("/admin/syndata")
public class SyndataController {
@Autowired
private SyndataService syndataService;
@RequestMapping("/index")
public ModelAndView index(
) {
ModelAndView view = new ModelAndView();
view.setViewName("/admin/syndata/index");
return view;
}
@ResponseBody
@RequestMapping(method = RequestMethod.POST, value = "syndata")
public String syndata(String dataBaseName,String tableNames,String planCode){
String rs="数据同步成功!";
try {
// 根据页面填写的olas库名、表名及对应plancode查询AS400数据库
List<Object[][]> datas = syndataService.getDatas(dataBaseName, tableNames, planCode);
if (datas != null && datas.size() > 0) {
// 查询成功则插入老sis表
boolean isSuccess = syndataService.importDatas(planCode,tableNames, datas);
if (!isSuccess) {// 插入失败直接返回
rs = "在插入老sis表时数据错误,请检查数据库相关填写是否正确!";
}else{
//开始执行存储过程,将老sis数据同步至新sis
isSuccess = syndataService.SyndataByPlanCode(planCode);
if(!isSuccess)
rs="存储过程执行从老sis同步数据至新sis失败!";
}
} else {
rs = "在查询AS400数据库时失败,请检查数据库相关填写是否正确!";
}
} catch (Exception e) {
rs = "数据同步失败";
e.printStackTrace();
}
return rs;
}
}
--共有部分
package aia.com.cn.sis.syndata.service.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class SISUtils {
//关闭连接
public static void closeConnection(Connection con,PreparedStatement pStatement,ResultSet rSet){
try{
if(con != null){
con.close();
}
if(pStatement != null){
pStatement.close();
}
if(rSet != null){
rSet.close();
}
}catch(Exception e){
System.out.println("关闭连接失败!");
}
}
// 表名不同,查询sql语句不同,这里采用起始表与目标表的sql语句字段名称与数量对应的匹配方式,后面有动态方式可优化
public static String getFindSql(String dataBaseName, String tableName) {
String sql = "";
if (tableName != null && "LADPJ".equals(tableName)) {
sql = "select DDS_PJ_CO,DDS_PJ_PLAN,DDS_PJ_COVERAGE_TYPE,DDS_PJ_COVERAGE_GROUP,DDS_PJ_TERM_COVERAGE,DDS_PJ_RCCPLAN,DDS_PJ_COMMFLAT,DDS_PJ_ACFLAT,"
+ "DDS_PJ_PRMFLAT,DDS_PJ_CASECNT,DDS_PJ_FLAG1,DDS_PJ_FLAG2,DDS_PJ_FLAG3,DDS_PJ_DATE1,DDS_PJ_DATE2,DDS_PJ_CODE1,DDS_PJ_CODE2,DDS_PJ_CODE3,"
+ "DDS_PJ_INT1,DDS_PJ_INT2,DDS_PJ_AMT1,DDS_PJ_AMT2,DDS_PJ_NUM1,DDS_PJ_NUM2,DDS_PJ_NUM3 from "
+ dataBaseName + "." + tableName + " where DDS_PJ_PLAN like ?";
} else if (tableName != null && "lldpa".equals(tableName)) {
sql = "select DDS_PA_CO,DDS_PA_PLAN,DDS_PA_SHORT_NAME,PAPLOB,PAVTBL,PAVLIV,PAVINT,PAVMETH,PAVCLS,PAVIADUSE,PAVIADCHG,PAVINT2,PAVRPUPLAN,PASEXUSE,"
+ "PAVTBLF,PANTBLF,PAETITBLF,PAGSADUSE,PAGSAGEDUR,PAOPT9TBL,PANTBL,PANETITBL,PANLIV,PANINT,PANMETH,PANCLS,PANIADUSE,PANIADCHG,PANINT2,"
+ "PANRPUPLAN,PANPUAPLAN,PALOAGE,PAHIAGE,PAPUPUSE,PAPAYUP,PAMXUSE,PAMX,PAVPU,PARPU,PAETI,PAAPL,PAPAR,PAPAROPT,PANFOPT,PALEVDUR,PAMRULE,"
+ "PAARULE,PACPLAN,PARPLAN1,PARPLAN2,PAAPUUSE,PAADBPU,PAACSUSE,PAACEASE,PAWPPUUSE,PAWPPAYU,PAWPCSUSE,PAWPCEASE,PAGIPUUSE,PAGIPAYU,PAGICSUSE,"
+ "PAGICEASE,PAPDEPUSE,PAPDEPAYU,PAPDECUSE,PAPDECEASE,PAPDIPUSE,PAPDIPAYU,PAPDICUSE,PAPDICEASE,PAPHPUSE,PAPHPAYU,PAPHCUSE,PAPHCEASE,PAP1PUSE,"
+ "PAP1PAYU,PAP1CUSE,PAP1CEASE,PABNDUSE,PABNDNUM,PABNDCD1,PABNDHI1,PABNDCD2,PABNDHI2,PABNDCD3,PABNDHI3,PABNDCD4,PABNDHI4,PABNDCD5,PABNDHI5,PABNDCD6,"
+ "PABNDHI6,PABNDCD7,PABNDHI7,PABNDCD8,PABNDHI8,PABNDCD9,PABNDHI9,PABNDCD10,PABNDHI10,PAPRMCHG,PASBCHG,PAVPUCHG,PAETIINT,PAPUATBL,PAPUAINT,PANEWPLAN,"
+ "PAMINSIZE,PAFYCOST,PASURRMETH,PARENEWUSE,PARENEW,PAMTSEXUSE,PAMTAGEUSE,PAMTAGE,PAEXCESINT,PAFILLER from "
+ dataBaseName + "." + tableName + " where DDS_PA_PLAN like ?";
} else if (tableName != null && "lldpg".equals(tableName)) {
sql = "select PGCO,PGPLAN,PGSEX,PGBAND,PGAGE,PGBASIC,PGAD,PGWP,PGAIWP,PGAI,PGAX,PGCPA,PGIWP from "
+ dataBaseName + "." + tableName + " where PGPLAN like ?";
} else if (tableName != null && "nladpa".equals(tableName)) {
sql = "select PLANCO,PLANCODE,PLANNAME,CSVPRINT,APPPRINT,PIPPRINT,CSVFLD,CSVFMT,CNTRNO,OLDPLAN,PIPRMCD,CSVRMCD,RIDRMCD,DOCNAME,DOCPATH,DOCPAGE,ENDRSFLG,ENDRSNAM,RESFLD1,RESFLD2,RESFLD3 from "
+ dataBaseName + "." + tableName + " where PLANCODE like ?";
} else if (tableName != null && "nladpipcsv".equals(tableName)) {
sql = "select PCCO,PCPLAN,PCAGE,PCSEX,PCDUR,PCBACSV,PCBARPU,PCRB,PCRBCSV,PCRBRPU,PCSA,PCRDCSV,PCTTCSV from "
+ dataBaseName + "." + tableName + " where PCPLAN like ? and pcband ='00'";
}
return sql;
}
// 不同的表插入语句不通
public static String getSql(String tableName) {
String sql = "";
// 模拟一些测试bk表,后续改成正式表
if (tableName != null && "ladpj".equals(tableName)) {
sql = "INSERT INTO [dbo].ladpj11(PJCO,PJPLAN,PJCOVTYP,PJCOVGRP,PJTERMCOV,PJRCCPLAN,PJCOMMFLAT,PJACFLAT,PJPRMFLAT,PJCASECNT,PJFLAG1,PJFLAG2,PJFLAG3,PJDATE1,PJDATE2,"
+ "PJCODE1,PJCODE2,PJCODE3,PJINT1,PJINT2,PJAMT1,PJAMT2,PJNUM1,PJNUM2,PJNUM3) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
} else if (tableName != null && "lldpa".equals(tableName)) {
sql = "insert into lldpa11(PACO,PAPLAN,PASNAME,PAPLOB,PAVTBL,PAVLIV,PAVINT,PAVMETH,PAVCLS,PAVIADUSE,PAVIADCHG,PAVINT2,PAVRPUPLAN,PASEXUSE,PAVTBLF,PANTBLF,PAETITBLF,PAGSADUSE,PAGSAGEDUR,PAOPT9TBL,PANTBL,PANETITBL,PANLIV,PANINT,PANMETH,PANCLS,PANIADUSE,PANIADCHG,PANINT2,PANRPUPLAN,PANPUAPLAN,PALOAGE,PAHIAGE,PAPUPUSE,PAPAYUP,PAMXUSE,PAMX,PAVPU,PARPU,PAETI,PAAPL,PAPAR,PAPAROPT,PANFOPT,PALEVDUR,PAMRULE,PAARULE,PACPLAN,PARPLAN1,PARPLAN2,PAAPUUSE,PAADBPU,PAACSUSE,PAACEASE,PAWPPUUSE,PAWPPAYU,PAWPCSUSE,PAWPCEASE,PAGIPUUSE,PAGIPAYU,PAGICSUSE,PAGICEASE,PAPDEPUSE,PAPDEPAYU,PAPDECUSE,PAPDECEASE,PAPDIPUSE,PAPDIPAYU,PAPDICUSE,PAPDICEASE,PAPHPUSE,PAPHPAYU,PAPHCUSE,PAPHCEASE,PAP1PUSE,PAP1PAYU,PAP1CUSE,PAP1CEASE,PABNDUSE,PABNDNUM,PABNDCD1,PABNDHI1,PABNDCD2,PABNDHI2,PABNDCD3,PABNDHI3,PABNDCD4,PABNDHI4,PABNDCD5,PABNDHI5,PABNDCD6,PABNDHI6,PABNDCD7,PABNDHI7,PABNDCD8,PABNDHI8,PABNDCD9,PABNDHI9,PABNDCD10,PABNDHI10,PAPRMCHG,PASBCHG,PAVPUCHG,PAETIINT,PAPUATBL,PAPUAINT,PANEWPLAN,PAMINSIZE,PAFYCOST,PASURRMETH,PARENEWUSE,PARENEW,PAMTSEXUSE,PAMTAGEUSE,PAMTAGE,PAEXCESINT,PAFILLER) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);";
} else if (tableName != null && "lldpg".equals(tableName)) {
sql = "insert into lldpg11(PGCO,PGPLAN,PGSEX,PGBAND,PGAGE,PGBASIC,PGAD,PGWP,PGAIWP,PGAI,PGAX,PGCPA,PGIWP) values(?,?,?,?,?,?,?,?,?,?,?,?,?);";
} else if (tableName != null && "nladpa".equals(tableName)) {
sql = "insert into nladpa11(PLANCO,PLANCODE,PLANNAME,CSVPRINT,APPPRINT,PIPPRINT,CSVFLD,CSVFMT,CNTRNO,OLDPLAN,PIPRMCD,CSVRMCD,RIDRMCD,DOCNAME,DOCPATH,DOCPAGE,ENDRSFLG,ENDRSNAM,RESFLD1,RESFLD2,RESFLD3) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?);";
} else if (tableName != null && "nladpipcsv".equals(tableName)) {
sql = "insert into nladpipcsv11(PCCO,PCPLAN,PCAGE,PCSEX,PCDUR,PCBACSV,PCBARPU,PCRB,PCRBCSV,PCRBRPU,PCSA,PCRDCSV,PCTTCSV) values(?,?,?,?,?,?,?,?,?,?,?,?,?);";
}
return sql;
}
// public static void main(String[] args) {
// String input="<script aaaaa> aaaaaaaaaa </script><iframe aaaaa> aaaaaaaaaa </iframe>";
// //Pattern pattern = RegexpUtil.getPattern("<[[script]|[iframe]][^>]*>[\\w|[^x00-xff]]*<\\/[[script]|[iframe]]>");
// Pattern pattern = RegexpUtil.getPattern("<script[^>]*>[\\w|[^x00-xff]]*<\\/script>");
// while (true) {
// Matcher m= pattern.matcher(input);
// if(m.find()){
// input=m.replaceAll("*");
// }else{
// break;
// }
// }
// Pattern pattern1 = RegexpUtil.getPattern("<iframe[^>]*>[\\w|[^x00-xff]]*<\\/iframe>");
// while (true) {
// Matcher m= pattern1.matcher(input);
// if(m.find()){
// input=m.replaceAll("*");
// }else{
// break;
// }
// }
// System.out.println(input);
// }
//测试导入数据过程
public static void main(String[] args) throws Exception {
// String tableName="nladpipcsv;lldpg";
// String planCode="AIOJ19E2;AIOJ25E2";
// java.util.List<Object[][]> lists =ConnectionAs400.getDatas("ES1708003N",tableName,planCode);//as400打印查询语句
// boolean isSuccess = ConnectionSIS.importDatas(planCode,tableName, lists);
// System.out.println("导入数据是否成功:"+isSuccess);
}
}
--最后一步是将导入的数据在通过存储过程插入到另一个表中,这里不做介绍,可忽略。