推送数据到中间库
推送数据到中间库
1、关于数据中间库接口的描述
接口主要是解决系统数据相互交换读写的问题。解决方法有如下:
用直接读取数据库的方式,建立特定权限的数据库访问用户,只能访问接口信息相关的部分数据表,而不是全部。这样在读数据时可以保证数据的及时性;并不影响原来系统的数据。
为了保证双方相互访问的透明与高效,可以制定两方都认可的数据访问规范性文档,明确如:数据库名、密码、可读表或视图、及具体字段的含义等信息。
2、本篇文章主要示范如何将数据推到第三方系统的数据库中。
3、连接中间库所需要的参数
本实例是将配置信息配置到xml文件中,然后在开发过程中进行读取。参数配置为示例,具体以实际情况为准。
<jdbc>
<conninfo desc="jdbc连接中间数据库类型
(0为mysql,1为sqlserver,2为oracle,3为PostgreSQL),
数据库IP,
数据库端口,
数据库实例名,
数据库用户名,
数据库密码">
0,ip,3306,MiddleDatabase_Name,root,123456
</conninfo>
<middleform desc="中间表名">Middleform_Name</middleform>
</jdbc>
3、创建一个Vo类,该类字段名称与数据库的字段名称相对应。
package vo;
//中间库表的字段名称
public class TestVo {
private String Id;//id
private String AnimalName;//动物姓名
private String Age;//动物年龄
private String Color;//动物颜色
public String getId() {return Id;}
public void setId(String id) {Id = id;}
public String getAnimalName() {return AnimalName;}
public void setAnimalName(String animalName) {AnimalName = animalName;}
public String getAge() {return Age;}
public void setAge(String age) {Age = age;}
public String getColor() {return Color;}
public void setColor(String color) {Color = color;}
}
4、连接中间库的工具类
package util;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import vo.TestVo;
import java.sql.*;
import java.util.List;
/**
* 通过jdbc的形式连接其他数据库
* 向表插入数据
*/
public class DataBaseDao {
private static Log LOG = LogFactory.getLog(DataBaseDao.class);
private Connection conn = null;
Boolean oldAutoCommit;
/**
* 插入表数据
* @param subVoList
* @throws Exception
*/
public void insertSubVO(List<TestVo> subVoList)throws Exception{
PreparedStatement stmt = null;
try {
//中间表名
String middleForm = "Middleform_Name";
for(TestVo subVo : subVoList){
String sql="insert into " + middleForm +"("
+"Id" //id
+",AnimalName" //动物名称
+",Age" //动物年龄
+",Color" //动物颜色
+") values(?,?,?,?)";
stmt = conn.prepareStatement(sql);
stmt.setString(1,subVo.getId());
stmt.setString(2,subVo.getAnimalName());
stmt.setString(3,subVo.getAge());
stmt.setString(4,subVo.getColor());
stmt.executeUpdate();
}
}catch (Exception e) {
LOG.error("", e);
throw new Exception("异常,"+e.getMessage());
}finally {
try {if(stmt != null) {stmt.close();stmt = null;}}catch (Exception e) {}
}
}
/**
* 读取配置文件信息,取得连接数据库的参数
*/
public void beginTransaction() throws Exception {
try {
this.conn = getConn();
this.oldAutoCommit = Boolean.valueOf(this.conn.getAutoCommit());
this.conn.setAutoCommit(false);
} catch (Exception ex) {
throw ex;
}
}
/**
* 读取配置文件信息,取得连接数据库的参数
*/
public void beginConn() throws Exception {
try {
this.conn = getConn();
} catch (Exception ex) {
throw ex;
}
}
/**
* 连接数据库
* @return
* @throws Exception
*/
public Connection getConn() throws Exception {
Connection conn = null;
try {
//数据库类型(0为mysql,1为sqlserver,2为oracle),数据库IP,数据库端口,数据库实例名,数据库用户名,数据库密码
String connInfo ="0,ip,3306,MiddleDatabase_Name,root,123456";
if(StringUtils.isBlank(connInfo)) {
return conn;
}
String[] connInfoL = connInfo.split(",");
if (connInfoL[0].equals("0")) {
Class.forName("org.gjt.mm.mysql.Driver");
String url = "jdbc:mysql://" + connInfoL[1].toString().trim()
+ ":" + connInfoL[2].toString().trim()+ "/"
+ connInfoL[3].toString().trim() + "?user="
+ connInfoL[4].toString().trim()+ "&password="
+ connInfoL[5].toString().trim();
conn = DriverManager.getConnection(url);
} else if (connInfoL[0].equals("1")) {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
String url = "jdbc:sqlserver://" + connInfoL[1].toString().trim()
+ ":"+ connInfoL[2].toString().trim() + ";DatabaseName="
+ connInfoL[3].toString().trim();
conn = DriverManager.getConnection(url, connInfoL[4].toString().trim(), connInfoL[5].toString().trim());
} else if (connInfoL[0].equals("2")) {
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url = "jdbc:oracle:thin:@" + connInfoL[1].toString().trim()
+ ":"+ connInfoL[2].toString().trim() + ":"
+ connInfoL[3].toString().trim();
conn = DriverManager.getConnection(url, connInfoL[4].toString().trim(), connInfoL[5].toString().trim());
} else {
throw new Exception("未指明Conn连接信息");
}
} catch (SQLException e) {
LOG.error("", e);
throw new Exception(e.getMessage());
}
return conn;
}
/**
* 提交
* @throws SQLException
*/
public void commitTransaction() throws SQLException {
try {
if (this.conn != null)
this.conn.commit();
} catch (SQLException ex) {
throw ex;
} finally {
closeConn();
}
}
/**
* 关闭连接
* @throws SQLException
*/
public void closeConn() throws SQLException {
try {
if (this.conn != null && oldAutoCommit != null)
this.conn.setAutoCommit(this.oldAutoCommit.booleanValue());
} catch (Exception localException) {
}
try {
if (this.conn != null)
this.conn.close();
} catch (SQLException localSQLException1) {
}
}
/**
* 回滚
* @throws SQLException
*/
public void rollbackTransaction() throws SQLException {
try {
if (this.conn != null)
this.conn.rollback();
} catch (SQLException ex) {
throw ex;
} finally {
closeConn();
}
}
}
5、初始化数据并进行推送
package application;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import util.DataBaseDao;
import vo.TestVo;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class SendToMiddleDataBase {
private static Log log = LogFactory.getLog(SendToMiddleDataBase.class);
public static void main(String[] args) throws Exception{
String msg = "";
List<TestVo> subvoList = new ArrayList<TestVo>();
//循环创建5条初始数据
for (int i=0; i < 5; i++){
TestVo testVo = new TestVo();
testVo.setId(i+"");//动物id
testVo.setAge(i+"");//动物年龄
testVo.setAnimalName("小猫"+i);//动物名称
testVo.setColor("黄色");//动物颜色
subvoList.add(testVo);
}
if(subvoList!=null){
log.info("推送中间表信息:"+ JSONObject.toJSONString(subvoList));
DataBaseDao dataManager=new DataBaseDao();
try{
dataManager.beginTransaction();//读取配置文件信息,取得连接数据库的参数
if(subvoList != null){
dataManager.insertSubVO(subvoList);//插入表数据
}
dataManager.commitTransaction();//提交
}catch (Exception e) {
log.error("异常信息:", e);
msg = "异常:"+e.getMessage();
try {
dataManager.rollbackTransaction();//回滚
} catch (SQLException e1) {
log.error("回滚异常", e1);
msg = "异常:"+e1.getMessage();
}
throw new Exception(e);
}
}
System.out.println(msg);//输出推送的响应信息
}
}
6、需要引入的pom依赖
<!--日志捕获-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1</version>
</dependency>
<!--StringsUtil工具依赖-->
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<!--mysql的驱动依赖-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.25</version>
</dependency>
<!--Json工具包-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.41</version>
</dependency>
7、在数据库中创建好该中间库及中间表

8、然后执行主方法,则可以将数据推送的中间库中


浙公网安备 33010602011771号