推送数据到中间库

推送数据到中间库

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、在数据库中创建好该中间库及中间表

1650621562999

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

1650621615333

posted @ 2022-04-22 18:05  晴天阴天下雨天  阅读(1091)  评论(0)    收藏  举报