java是同步_[java代码实现数据库同步]java实现数据库同步

bc3f9276acf88283a0569b9b9ef9ee92.png

在线QQ客服:1922638

专业的SQL Server、MySQL数据库同步软件

这里实现方式事先说明下,采用json+文本流方式,即读取数据库信息至文本流中,格式采用json,之后读取文本中json数据至数据库中,实现度还不完全,不过也提供了一种解决方案,目前可支持同类型数据库表同步,使用后可根据个人需要进行不同表数据库同步进行修改,仅贡献个人代码给各位大神。

再次说明下由于各个数据库中关于数字的类型可能有所不同,所以这里提供了一个db2拓展实现作为demo,其他数据库可以效仿。

public abstract class DBTools {

protected Connection conn=null;

protected Statement stmt=null;

protected ResultSet rs=null;

protected String username;//数据库用户名

protected String password;//数据库密码

protected String dbname;//数据库名称

//数据库中的数字域

protected List numList=new ArrayList();

protected boolean connectDB(String dbname, String

user, String password)

throws

Exception {

//加载驱动程序以连接数据库

try {

Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);

conn=DriverManager.getConnection(“jdbc:odbc:” + dbname, user,

password);

//url=”jdbc:db2:njtcdata”;

}

//捕获加载驱动程序异常

catch (ClassNotFoundException

cnfex) {

System.err.println(“装载JDBC驱动程序失败。”);

cnfex.printStackTrace();

return

false;

}

//捕获连接数据库异常

catch (SQLException sqlex)

{

System.err.println(“无法连接数据库”);

sqlex.printStackTrace();

//

System.exit(1);//terminate program

return

false;

}

return true;

}

protected int executeSQL(String sql) throws

SQLException {

System.out.println(sql);

return

stmt.executeUpdate(sql);

}

protected ResultSet query(String sql) throws

Exception {

//先打印出SQL

System.out.println(sql);

try {

Statement

stmt=conn.createStatement(

ResultSet.TYPE_SCROLL_SENSITIVE,

ResultSet.CONCUR_READ_ONLY);

rs=stmt.executeQuery(sql);

} catch (Exception e) {

e.printStackTrace();

throw new

Exception(“执行查询语句错误!”, e);

}

return rs;

}

protected void colseConnect() throws Exception

{

if (stmt !=null)

stmt.close();

if (conn !=null)

conn.close();

if (rs !=null)

rs.close();

//conn.close();

}

protected String createFilePath() {

Date dt=new Date();

SimpleDateFormat sf=new

SimpleDateFormat(“yyyy-MM-dd-hh-mm-sss”);

String filename=System.getProperty(“user.dir”) + “\\src\\”

+

sf.format(dt) + “.txt”;

return filename;

}

protected String generalInsertSQL(String table,

JSONObject jobject,

JSONArray

columns) throws JSONException {

StringBuffer sb=new

StringBuffer();

sb.append(“insert into ” +

table + “(“);

for (int i=0; i

JSONObject

jcolumn=columns.getJSONObject(i);

String column=jcolumn.getString(“COLNAME”);

sb.append(column);

if (i !=columns.length()-1) {

sb.append(“,”);

}

}

sb.append(“) values(“);

for (int i=0; i

JSONObject

jcolumn=columns.getJSONObject(i);

String column=jcolumn.getString(“COLNAME”);

String

typecolumn=jcolumn.getString(“TYPENAME”);

String

datacolumn=jobject.getString(column).equals(“null”) null

:jobject.getString(column);

if(datacolumn==null)

{

sb.append(“null”);

}else if

(numList.contains(typecolumn)) {

//

是数字域

sb.append(datacolumn);

} else

{

//

文本域或者日期域

sb.append(“‘”

+ datacolumn + “‘”);

}

if (i !=columns.length()-1) {

sb.append(“,”);

}

}

sb.append(“)”);

return sb.toString();

}

protected String generalTextSQL(JSONArray

columns, String tablename,

String

condition) throws JSONException {

StringBuffer sb=new

StringBuffer();

sb.append(“select “);

for (int i=0; i

JSONObject

jcolumn=(JSONObject) columns.get(i);

String column=jcolumn.getString(“COLNAME”);

//String

strColumn=”case when ” + column

//+

” is null then ” else char(” + column + “) end

as “

//+

column;

String

strColumn=column;

sb.append(strColumn);

if (i !=columns.length()-1) {

sb.append(”

,”);

}

}

sb.append(”

from ” + tablename);

if (!condition.equals(“”))

{

//

添加控制条线

sb.append(”

where ” + condition);

}

return sb.toString();

}

public String readToFile(String table, String

condition) throws Exception {

String path=createFilePath();

File file=new File(path);

JSONArray columns=queryTableColumns(table);

if (columns==null) {

//

读取表失败

System.out.println(“读取表失败”);

return

null;

}

String sql=generalTextSQL(columns, table, condition);

ResultSet rs=query(sql);

FileOutputStream fout=new

FileOutputStream(file);

System.out.println(“开始读取表到文件中…”);

int index=0;

fout.write(“[“.getBytes());

while (rs.next()) {

StringBuffer

sb=new StringBuffer();

sb.append(“{“);

for (int i=0; i

JSONObject

jcolumn=(JSONObject) columns.get(i);

String

column=jcolumn.getString(“COLNAME”);

String

columndate=rs.getString(column);

String

addDateStr=””” + column + “”:”” + columndate + “””;

sb.append(addDateStr);

if

(i !=columns.length()-1) {

sb.append(“,”);

}

}

if(rs.isLast())

{

sb.append(“}”);

}else{

sb.append(“},”);

}

fout.write(sb.toString().getBytes());

index++;

}

fout.write(“]”.getBytes());

System.out.println(“读取完毕!”);

System.out.println(“读取总数据量为:”+index+”条!”);

System.out.println(“文件路径为!”);

System.out.println(path);

return path;

}

public boolean readToDatabase(String table,

String filePath) throws Exception

{

JSONArray columns=queryTableColumns(table);

if (columns==null) {

//

读取表失败

return

false;

}

//先打印出SQL

try {

conn.setAutoCommit(false);

Statement

stmt=conn.createStatement();

System.out.println(“开始读取文件…”);

File file=new File(filePath);

FileInputStream

filein=new FileInputStream(file);

byte[] in=new byte[999];

byte temp

;

int index=0;

while ((temp=(byte) filein.read()) !=-1 )

{

if(temp==123)

{

//{

index=0;

in[index++]=temp;

}else

if(temp==125)

{

//}

in[index++]=temp;

String

str=new String(in, “gbk”);

JSONObject

jobject=new JSONObject(str);

String

insertSQL=generalInsertSQL(table, jobject, columns);

System.out.println(insertSQL);

stmt.executeUpdate(insertSQL);

//重新更新in内存

in=null;

in=new byte[999];

}else

{

in[index++]=temp;

}

}

System.out.println(“读取文件完毕”);

System.out.println(“开始插入数据库…”);

conn.commit();

System.out.println(“插入数据库完毕!”);

} catch (Exception e) {

try {

conn.rollback();

} catch

(SQLException e2) {

//

TODO Auto-generated catch block

e2.printStackTrace();

}

e.printStackTrace();

try {

throw

new Exception(“执行查询语句错误!”, e);

} catch

(Exception e1) {

//

TODO Auto-generated catch block

e1.printStackTrace();

}

}

return true;

}

public abstract JSONArray

queryTableColumns(String table) throws Exception;

}public class TestTransDB2 extends DBTools{

public TestTransDB2(String dbname,String

username,String password)

{

numList.add(“INTEGER”);

numList.add(“DECIMAL”);

this.dbname=dbname;

this.username=username;

this.password=password;

try {

connectDB(dbname,

username, password);

} catch (Exception e) {

//TODO

Auto-generated catch block

e.printStackTrace();

}

}

public JSONArray queryTableColumns(String table)

throws Exception {

//检验表名是否存在

String sql=”Select

COLNAME,TYPENAME from SYSCAT.COLUMNS WHERE TABNAME='”+table+”‘

order by COLNO”;

//System.out.println(sql);

Statement stmt=conn.createStatement();

rs=stmt.executeQuery(sql);

JSONArray result=new

JSONArray();

while(rs.next())

{

JSONObject

jobject=new JSONObject();

String

COLNAME=rs.getString(“COLNAME”).toString();

String

TYPENAME=rs.getString(“TYPENAME”).toString();

jobject.put(“COLNAME”,

COLNAME);

jobject.put(“TYPENAME”,

TYPENAME);

result.put(jobject);

}

if(result.length()==0)

{

return

null;

}else

{

return

result;

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值