场景
项目框架情况:
SpringMVC + MybatisPlus + msyql...
需求:
从sqlserver数据库中同步产品和产品类别两个表的数据。
思路
1、利用 java自带的java.sql.Connection 与sqlserver数据库建立连接。
2、通过Apache的dbutils工具类QueryRunner( org.apache.commons.dbutils.QueryRunner)来获取sqlserver中的对应数据。
3、分析转化上述数据至我们需要的数据。
4、通过本地项目中的mysql数据源(或者步骤1中同样的方式),与msyql建立连接。
5、批量插入、更新mysql中的数据。
代码
1、数据源连接工具类DbConnUtil
package com.platform.syncdatabase.util;
import com.platform.utils.ResourceUtil;
import java.sql.Connection;
import java.sql.DriverManager;
public class DbConnUtil {
private static String sqlserverDriverClassName = ResourceUtil.getConfigByName("hy.jindie.sqlserverDriverClassName");
private static String sqlserverDbUrl = ResourceUtil.getConfigByName("hy.jindie.sqlserverDbUrl");
private static String sqlserverDbUser = ResourceUtil.getConfigByName("hy.jindie.sqlserverDbUser");
private static String sqlserverDbPwd = ResourceUtil.getConfigByName("hy.jindie.sqlserverDbPwd");
/**
* 从这里取数据
*
* @return
*/
public static Connection createConnSrc() {
Connection conn = null;
try {
Class.forName(sqlserverDriverClassName).newInstance();
conn = DriverManager.getConnection(sqlserverDbUrl, sqlserverDbUser, sqlserverDbPwd);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 存入的目标数据库
*
* @return
*/
public static Connection createConnDist() {
Connection conn = null;
try {
String driverClassName = "com.mysql.jdbc.Driver";
String dbUrl = "jdbc:mysql://192.168.1.110:3306/haoyuan?useUnicode=true&characterEncoding=UTF-8";
String dbUser = "root";
String dbPwd = "1234567890";
Class.forName(driverClassName).newInstance();
conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
public static void close(Connection conn) {
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
2、Apache dbutils QueryRunner数据操作工具类的封装类DbBuilder
package com.platform.syncdatabase;
import com.platform.syncdatabase.util.DbConnUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import java.sql.Connection;
import java.util.List;
import java.util.Map;
public class DbBuilder {
Connection connection = null;
public DbBuilder(Connection conn) {
this.connection = conn;
}
public QueryRunner getQueryRunner() {
return new QueryRunner();
}
/**
* 根据传入的sql,查询记录,以Map形式返回第一行记录 注意:如果有多行记录,只会返回第一行,所以使用场景需要注意,可以使用根据主键来查询的场景
*
* @param sql
* @param params
* @return
*/
public Map getFirstRowMap(String sql, Object... params) {
try {
QueryRunner runner = new QueryRunner();
return runner.query(connection, sql, new MapHandler(), params);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* 根据传入的sql查询数据,以List Map形式返回
*
* @param sql
* @param params
* @return
*/
public List
3、数据同步类DoDataSycn,以下同步中对mysql中已存在的数据进行更新时可以先与sqlserver中的数据对比版本变化,只更新有变化的数据即可。此处由于sqlserver数据库的数据版本信息不可用所以取消了对比,而是全量更新。
package com.platform.syncdatabase;
import com.platform.entity.CategoryEntity;
import com.platform.entity.GoodsEntity;
import com.platform.service.CategoryService;
import com.platform.service.GoodsService;
import com.platform.syncdatabase.util.DbConnUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.sql.Connection;
import java.util.*;
@Slf4j
public class DoDataSycn {
@Autowired
CategoryService categoryService;
@Autowired
GoodsService goodsService;
/**
* 更新品类
*/
public void updateCategory() {
//打开链接
Connection connSqlserver = DbConnUtil.createConnSrc();
DbBuilder sqlserver = new DbBuilder(connSqlserver);
try {
//DO
//DO 1、遍历mysql数据。添加map id为key
//DO 2、遍历sqlserver数据获取新增数据添加插入map,获取修改过的数据添加update map
//DO 3、实现批量更新功能
String sql = "Select * from t_Item WHERE FItemClassID = 4";
List
4、项目properties配置文件中的sqlserver连接信心配置
#sqlserver连接信息
hy.jindie.sqlserverDriverClassName = net.sourceforge.jtds.jdbc.Driver
hy.jindie.sqlserverDbUrl = jdbc:jtds:sqlserver://192.168.1.111:1433;DatabaseName=haoyuan
hy.jindie.sqlserverDbUser = sa
hy.jindie.sqlserverDbPwd = 123213214123
在此鸣谢开源作者:在水一方发盐人 的开源代码。https://gitee.com/lostad/sqlserver_to_mysql/tree/master