java实现同步sqlserver中的表数据到mysql的方案

dataX同步SQLserver到MySQL数据 DataX本身作为数据同步框架,将不同数据源的同步抽象为从源头数据源读取数据的Reader插件,以及向目标端写入数据的Writer插件,理论上DataX框架可以支持任意数据源类型的数据同步工作。同时DataX插件体系作为一套生态系统, 每接入一套新数据源该新加入的数据源即可实现和现有的数据源互通。 阅读详情

场景

项目框架情况:

          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<String, Object> 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<Map<String, Object>> getListMap(String sql, Object... params) {
        try {
            QueryRunner runner = new QueryRunner();
            return runner.query(connection, sql, new MapListHandler(), params);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    /**
     * 根据sql和对象,查询结果并以对象形式返回
     *
     * @param sql
     * @param type
     * @return
     */
    public <T> T getBean(String sql, Class<T> type) {
        try {
            QueryRunner runner = getQueryRunner();
            return runner.query(sql, new BeanHandler<T>(type));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    /**
     * 根据sql和对象,查询结果并以对象形式返回
     *
     * @param sql
     * @param type
     * @return
     */
    public <T> T getBean(Connection connection, String sql, Class<T> type) {
        try {
            QueryRunner runner = new QueryRunner();
            return runner.query(connection, sql, new BeanHandler<T>(type));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }


    /**
     * 根据sql和对象,查询结果并以对象形式返回
     *
     * @param sql
     * @param type
     * @param params
     * @return
     */
    public <T> T getBean(Connection connection, String sql, Class<T> type, Object... params) {
        try {
            QueryRunner runner = new QueryRunner();
            return runner.query(connection, sql, new BeanHandler<T>(type), params);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }


    /**
     * 根据sql查询list对象
     *
     * @param sql
     * @param type
     * @return
     */
    public <T> List<T> getListBean(Connection connection, String sql, Class<T> type) {
        try {
            QueryRunner runner = new QueryRunner();
            return runner.query(connection, sql, new BeanListHandler<T>(type));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    /**
     * 根据sql查询list对象
     *
     * @param sql
     * @param type
     * @param params
     * @return
     */
    public <T> List<T> getListBean(String sql, Class<T> type, Object... params) {
        try {
            QueryRunner runner = getQueryRunner();
            return runner.query(sql, new BeanListHandler<T>(type), params);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    /**
     * 根据sql查询list对象
     *
     * @param sql
     * @param type
     * @param params
     * @return
     */
    public <T> List<T> getListBean(Connection connection, String sql, Class<T> type, Object... params) {
        try {
            QueryRunner runner = new QueryRunner();
            return runner.query(connection, sql, new BeanListHandler<T>(type), params);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    /**
     * 保存操作
     *
     * @param sql
     * @param params
     * @return
     */
    public int save(String sql, Object... params) {
        try {
            QueryRunner runner = getQueryRunner();
            return runner.update(connection, sql, params);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return 0;
    }

    /**
     * 保存操作
     *
     * @param sql
     * @param params
     * @return
     */
    public int save(Connection connection, String sql, Object... params) {
        try {
            QueryRunner runner = new QueryRunner();
            return runner.update(connection, sql, params);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return 0;
    }

    /**
     * 更新操作
     *
     * @param sql
     * @param params
     * @return
     */
    public int update(String sql, Object... params) {
        try {
            QueryRunner runner = getQueryRunner();
            return runner.update(sql, params);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return 0;
    }

    /**
     * 更新操作
     *
     * @param sql
     * @param params
     * @return
     */
    public int update(Connection connection, String sql, Object... params) {
        try {
            QueryRunner runner = new QueryRunner();
            return runner.update(connection, sql, params);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return 0;
    }

    /**
     * 删除操作
     *
     * @param sql
     * @param params
     * @return
     */
    public int delete(String sql, Object... params) {
        try {
            QueryRunner runner = getQueryRunner();
            return runner.update(sql, params);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return 0;
    }

    /**
     * 删除操作
     *
     * @param sql
     * @param params
     * @return
     */
    public int delete(Connection connection, String sql, Object... params) {
        try {
            QueryRunner runner = new QueryRunner();
            return runner.update(connection, sql, params);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return 0;
    }

    /**
     * 批量操作,包括批量保存、修改、删、	 *
     *
     * @param sql
     * @param params
     * @return
     */
    public int[] batch(String sql, Object[][] params) {
        try {
            QueryRunner runner = getQueryRunner();
            return runner.batch(sql, params);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    /**
     * 批量操作,包括批量保存、修改、删处	 *
     *
     * @param sql
     * @param params
     * @return
     */
    public int[] batch(Connection connection, String sql, Object[][] params) {
        try {
            QueryRunner runner = new QueryRunner();
            return runner.batch(connection, sql, params);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }

    /**
     * �?��事务
     */
    public void beginTransaction(Connection conn) {
        try {
            conn.setAutoCommit(false);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 回滚事务
     */
    public void rollback(Connection conn) {
        try {
            conn.rollback();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 提交事务
     */
    public void commit(Connection conn) {
        try {
            conn.commit();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
        try {

            Connection conn = DbConnUtil.createConnDist();
            DbBuilder b = new DbBuilder(conn);
            System.out.println(b.save("insert into demo_test(id,kitchen) values(?,?)", "11", "11"));
            DbConnUtil.close(conn);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

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<Map<String, Object>> remoteList = sqlserver.getListMap(sql, null);//获取远程金蝶数据
            if (remoteList != null && !remoteList.isEmpty()) {
                List<CategoryEntity> insertList = new ArrayList<>();
                List<CategoryEntity> updateList = new ArrayList<>();
                //查询mysql现有品类
                List<CategoryEntity> mysqlCategoryList = categoryService.queryList(new HashMap<>());
                if (mysqlCategoryList != null && !mysqlCategoryList.isEmpty()) {//已存在数据时,对比更新
                    //1、现有数据分析整理
                    Map<String, CategoryEntity> mysqlCategoryMap = new HashMap<>();
                    for (CategoryEntity category : mysqlCategoryList) {
                        mysqlCategoryMap.put(category.getId() + "", category);
                    }
                    //获取现有id
                    Set<String> ids = mysqlCategoryMap.keySet();
                    log.info("ids.size() " + ids.size());

                    //2、开始对比数据
                    //遍历金蝶数据
                    for (Map item : remoteList) {
                        try {
                            String id = item.get("FItemID") + "";
                            if (ids.contains(id)) {//已存在的品类 更新
                                updateList.add(copyCategoryInfo(item, mysqlCategoryMap.get(id)));
                            } else {//新增的品类
                                insertList.add(copyCategoryInfo(item, new CategoryEntity()));
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

                } else {//初始化全量插入
                    for (Map item : remoteList) {
                        try {
                            insertList.add(copyCategoryInfo(item, new CategoryEntity()));
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
                try {
                    if (!insertList.isEmpty()) {
                        log.info(("saveBatch category " + insertList.size()));
                        categoryService.saveBatch(insertList);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

                try {
                    if (!updateList.isEmpty()) {
                        log.info(("batchUpdate category " + updateList.size()));
                        categoryService.batchUpdate(updateList);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭
            DbConnUtil.close(connSqlserver);
        }

    }

    /**
     * 更新品类信息
     *
     * @param item
     * @param categoryEntity
     * @return
     */
    private CategoryEntity copyCategoryInfo(Map item, CategoryEntity categoryEntity) {
        categoryEntity.setId(Integer.parseInt(item.get("FItemID") + ""));
        categoryEntity.setName(item.get("FName") + "");
        categoryEntity.setParentId(Integer.parseInt(item.get("FParentID") + ""));
        categoryEntity.setSortOrder(Integer.parseInt(item.get("FShortNumber") + ""));
        String fDeleted = item.get("FDeleted") + "";
        if (StringUtils.isNotBlank(fDeleted) && "1".equals(fDeleted)) {
            categoryEntity.setIsShow(0);
        } else {
            categoryEntity.setIsShow(1);
        }
        categoryEntity.setLevel(item.get("FLevel") + "");
        categoryEntity.setFlevel(Integer.parseInt(item.get("FLevel") + ""));
        categoryEntity.setFullnumber(item.get("FFullNumber") + "");
        categoryEntity.setFullname(item.get("FFullName") + "");
        categoryEntity.setUuid(item.get("UUID") + "");
        //拼接ModifyTime
        byte[] fModifyTimes = (byte[]) item.get("FModifyTime");
        StringBuilder modifyTime = new StringBuilder();
        for (byte b : fModifyTimes) {
            modifyTime.append(b);
        }
        categoryEntity.setModifyTime(modifyTime.toString());//添加更新版本信息
        categoryEntity.setIsGood((boolean) item.get("FDetail") ? "1" : "0");
        return categoryEntity;
    }


    /**
     * 更新产品
     */
    public void updateGoods() {
        //打开链接
        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" +
                    " i.FItemID," +
                    " c.FName," +
                    " i.FParentID," +
                    " i.FShortNumber," +
                    " i.FDeleted," +
                    " i.FLevel," +
                    " i.FFullNumber," +
                    " i.FFullName," +
                    " i.UUID," +
                    " i.FModifyTime," +
                    " c.FOrderPrice," +
                    " c.FOrderPrice," +
                    " c.FOrderPrice," +
                    " c.FModel " +
                    "FROM " +
                    " t_item i" +
                    " LEFT JOIN t_icitemcore c ON i.FItemID = c.FItemID " +
                    "WHERE " +
                    " i.FItemClassID = 4 " +
                    " AND i.FDetail = 1 ;";
//                    " AND i.FDetail = 1 "+
//                    " AND i.FItemID = 291;";
            List<Map<String, Object>> remoteList = sqlserver.getListMap(sql, null);//获取远程金蝶数据
            if (remoteList != null && !remoteList.isEmpty()) {
                List<GoodsEntity> insertList = new ArrayList<>();
                List<GoodsEntity> updateList = new ArrayList<>();
                //查询mysql现有产品
                List<GoodsEntity> mysqlGoodsList = goodsService.queryAllGoods();
                if (mysqlGoodsList != null && !mysqlGoodsList.isEmpty()) {//已存在数据时,对比更新
                    //1、现有数据分析整理
                    Map<String, GoodsEntity> mysqlGoodsMap = new HashMap<>();
                    for (GoodsEntity goods : mysqlGoodsList) {
                        mysqlGoodsMap.put(goods.getId() + "", goods);
                    }
                    //获取现有id
                    Set<String> ids = mysqlGoodsMap.keySet();

                    //2、开始对比数据
                    //遍历金蝶数据
                    for (Map item : remoteList) {
                        try {
                            String id = item.get("FItemID") + "";
                            if (ids.contains(id)) {//已存在的品类
                                //更新
                                updateList.add(copyGoodsInfo(item, mysqlGoodsMap.get(id)));
                            } else {//新增的品类
                                insertList.add(copyGoodsInfo(item, new GoodsEntity()));
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }

                } else {//初始化全量插入
                    for (Map item : remoteList) {
                        try {
                            insertList.add(copyGoodsInfo(item, new GoodsEntity()));
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
                try {
                    if (!insertList.isEmpty()) {
                        log.info(("saveBatch goods " + insertList.size()));
                        goodsService.saveBatch(insertList);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

                try {
                    if (!updateList.isEmpty()) {
                        log.info(("batchUpdate goods " + updateList.size()));
                        goodsService.batchUpdate(updateList);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭
            DbConnUtil.close(connSqlserver);
        }

    }


    /**
     * 更新产品信息
     *
     * @param item
     * @param goodsEntity
     * @return
     */
    private GoodsEntity copyGoodsInfo(Map item, GoodsEntity goodsEntity) {
        goodsEntity.setId(Integer.parseInt(item.get("FItemID") + ""));
        goodsEntity.setName(item.get("FName") + "");
        goodsEntity.setCategoryId(Integer.parseInt(item.get("FParentID") + ""));
        goodsEntity.setSortOrder(Integer.parseInt(item.get("FShortNumber") + ""));
        String fDeleted = item.get("FDeleted") + "";
        if (StringUtils.isNotBlank(fDeleted) && "1".equals(fDeleted)) {
            goodsEntity.setIsDelete(0);
        } else {
            goodsEntity.setIsDelete(1);
        }
        goodsEntity.setFlevel(Integer.parseInt(item.get("FLevel") + ""));
        goodsEntity.setFullnumber(item.get("FFullNumber") + "");
        goodsEntity.setFullname(item.get("FFullName") + "");
        goodsEntity.setUuid(item.get("UUID") + "");
        //拼接ModifyTime
        byte[] fModifyTimes = (byte[]) item.get("FModifyTime");
        StringBuilder modifyTime = new StringBuilder();
        for (byte b : fModifyTimes) {
            modifyTime.append(b);
        }
        goodsEntity.setModifyTime(modifyTime.toString());//添加更新版本信息
        goodsEntity.setCounterPrice(new BigDecimal(item.get("FOrderPrice") + ""));
        goodsEntity.setRetailPrice(new BigDecimal(item.get("FOrderPrice") + ""));
        goodsEntity.setUnitPrice(new BigDecimal(item.get("FOrderPrice") + ""));
        goodsEntity.setModel(item.get("FModel") + "");
        return goodsEntity;
    }


}

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

利用python实现mysql数据库向sqlserver的同步 我们经常需要将大量数据保存起来以备后续使用,数据库是一个很好的解决方案。在众多数据库中,MySQL数据库算是入门比较简单、语法比较简单,同时也比较实用的一个。在这篇博客中,将以MySQL数据库为例,介绍一下如何使用Python操作数据库。 本科阶段曾学过使用Java对MySQL数据库进行操作,基本思路是先连接数据库,然后执行SQL语句对数据库进行操作,最后打印结果并断开连接。使用Python操作数... 阅读详情

相关推荐

使用flink1.17 实时同步数据(mysql到sqlserver 或 sqlserver 到sqlserver)

​介绍两种数据库用 flink1.17 做数据实时同步的操作。第一种:mysql 同步到 sqlserver;第二种:sqlserver 同步到 sqlserver。

FrankHsiang的专栏 4576

Java如何实时的监控sql server 2005 表的操作

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33675507的博客 499

mysql实时同步工具|sqlserver同步工具|常见的数据库同步工具

SyncNavigator是一款功能强大的数据库同步软件,适用于SQLSERVER, MySQL,具有自动/定时同步数据、无人值守、故障自动恢复、同构/异构数据库同步、断点续传和增量同步等功能,支持Windows xp以上所有操作系统,适用于大容量数据库快速同步。 安装包下载地址:https://www.syncnavigator.cn/Setup.zip 帮助文档地址:https://www.syncnavigator.cn/Help_zh-CN.chm Web文档地址:https://www...

weixin_46503877的博客 1998

sqlserver mysql java_java程序如何将sqlserver的表和数据导入到mysql

/*** 还原数据库* @param fileName* @return*/public synchronized static boolean restoreDataBase ( String fileName ){String strBKPath = "" ;boolean success = false ;Res...

weixin_35958783的博客 594

基于FlinkCDC的Mysql向 SQLServer实时增量同步方案

基于FlinkCDC的MySQL向SQLServer实时增量同步方案 CDC实现类 package com.flinkcdc; import com.alibaba.fastjson.JSONObject; import com.alibaba.ververica.cdc.connectors.mysql.MySQLSource; import com.alibaba.ververica.cdc.debezium.DebeziumDeserializationSchema; import com.alib

寒暄的博客 1462

记一次MySQL数据迁移到SQLServer全过程

🚀 优质资源分享 🚀 学习路线指引(点击解锁) 知识定位 人群定位 🧡 Python实战微信订餐小程序 🧡 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 💛Python量化交易实战💛 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 为什么要做迁移? 由于系统版本、数据库的升级,导致测试流程阻塞,为了保证数据及系统版本的一致性,我又迫切需要想用这套环境做性能测试,所以和领导、开发请示,得到批准后,便

weixin_45566993的博客 3702

【转】java 实现mysql数据库实时增量数据同步

MySQL数据库同步小工具(Java实现) https://blog.youkuaiyun.com/jlq_diligence/article/details/80923997 Java实现Mysql数据同步 https://blog.youkuaiyun.com/优快云_HELIU/article/details/83898906 用java代码来定时增量同步数据库表的实现代码 https://...

qq_30517167的博客 6568

微信聊天记录解密,必须是root的手机

手机上安装x-plore软件,将/data/data目录的相关EnMicroMsg.db auth_info_key_prefs.xml拷贝到/storge/emulated/0目录后才可以拷贝到电脑。路径:/data/data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml。但是是加密过的 需要解密 解密密码生成规则是手机IMEI+微信UIN md5(32位小写)后的前7位。安卓手机要root测试版本微信要7或者8版本都可以。选择message表。

venus60的专栏 1007

java服务端监听_Java 实现实时监听文件夹是否有新文件增加并上传服务器功能

本文中主要陈述一种实时监听文件夹中是否有文件增加的功能,可用于实际文件上传功能的开发。主要实现方式:(1)利用Timer的定时循环执行代码的功能;(2)利用WatchService实时监听文件夹是否有新文件增加,通过阻塞式IO流实现文件上传服务器。代码如下:private static String path = "E:\\Kankan";public static void getFile() ...

weixin_39827315的博客 595

基于STM32F103C8T6单片机设计CAN接口8路继电器控制板硬件(原理图+PCB)+软件源码

基于STM32F103C8T6单片机设计CAN接口8路继电器控制板硬件(原理图+PCB)+软件源码,仅供学习及设计参考。

GJZGRB的博客 1416

蓝牙6.0的‘新雷达’:Channel Sounding信道探测,真能比UWB更香吗?

本文探讨了蓝牙6.0的Channel Sounding信道探测技术在室内定位领域的应用潜力。通过与UWB技术的对比分析,揭示了其在成本、功耗和兼容性方面的优势,特别是在智能门锁、物品追踪等场景中的商业价值。Channel Sounding技术不仅具备亚米级精度,还能通过现有蓝牙设备实现零边际成本部署,为物联网应用提供了新的解决方案。

weixin_29288313的博客 333

监听sqlserver变化同步mysql_sqlserver数据实时同步到mysql

1.安装安装mysqlconnector2.配置mysqlconnectorODBC数据管理器-系统DSN-添加-mysql ODBC 5.3 ANSI driver-填入data source name如jt,mysql的ip、用户名、密码即可3.新建链接服务器exec sp_addlinkedserver@server='jt', --ODBC里面data source name@srvpro...

weixin_42140710的博客 562

【腾讯小龙虾WorkBuddy专栏02】保姆级安装教程!彻底分清WorkBuddy/CodeBuddy,最新积分活动&会员体系全攻略

【腾讯小龙虾WorkBuddy专栏02】保姆级安装教程!彻底分清WorkBuddy/CodeBuddy,最新积分活动&会员体系全攻略

AI人人懂 2596

实现SQL Server到MySQL的表增量同步

前序本教程是为了实现SQLSERVER数据库表中数据增量同步到MySQL数据库,并每天定时执行一次。 注:只实现了新增与更新数据,源库中删除的数据未实现同步 1、前期准备开始之前,请记得自行安装JDBC,安装步骤百度搜索即可 Kettle的安装,请参考我的《Kettle安装部署》教程 配置步骤2、配置“输入”--配置源数据库2.1、新建转换打开Kettle软体,新建一个转换任务,...

weixin_49071459的博客 626

Android Framework 开发工程师职位深度解析与面试指南

摘要:博泰车联网科技(上海)股份有限公司招聘Android Framework开发工程师,负责车载系统的底层开发与优化。岗位要求5年以上经验,深入掌握Android Framework机制(WindowManager、PowerManager等模块),熟悉高通平台中间件架构及NDK/JNI开发,具备性能优化(启动时间、ANR处理)、OTA升级等能力。需熟练使用Android Studio、Git等工具,有车载开发经验者优先。工作内容包括Framework定制开发、问题排查及技术文档编写。

郑伟强dev的专栏 552

第4章-上下文管理-对话历史记忆系统与窗口优化-《Agentic AI 智能体应用开发》

当上下文窗口接近极限时,需要对已有内容进行压缩。压缩不是简单的截断——你需要保留核心语义,去除冗余。# Python: 对话摘要压缩# 使用 Haiku 做摘要任务,成本最低"""将一段对话历史压缩为摘要"""system="你是一个对话摘要专家。请生成简洁但有信息量的摘要。",f"'用户'

AI天才研究院 246

使用ETLCloud的库表同步组件实现异构数据表批量迁移:从SQLServer到MySQL

基于 ETLCloud 库表同步组件实现异构数据表批量迁移,完成从 SQLServer 到 MySQL 库表数据迁移实践,简单、直接、有效;此外,也记录了几个迁移过程中与配置相关的问题及解决方法。与以前使用的 CS 类型的迁移工具相比, ETLCloud 界面更友好、更容易上手,而且社区版的功能已经足够强大。ETLCloud:重构企业数据融合架构,解决各种复杂、即时、高合规的数据集成需求,一站式覆盖:任务开发、任务编排调度、血缘关系分析、数据质量管理、数据服务开发、任务监控。

Heartsuit的博客 1937

Android 13.0 双屏时触摸失效问题排查与修复

摘要:本文记录了RK3588 Android12开发板上主屏触摸失效问题的排查与解决过程。通过分析发现,USB触摸设备被错误关联到辅屏(displayId=3)而非主屏(displayId=0)。解决方案是修改TouchInputMapper.cpp,强制触摸设备使用INTERNAL viewport(主屏),并保持设备在viewport不活跃时仍启用。该修改涉及约40行代码,有效解决了多显示器环境下触摸设备错误映射的问题,同时提供了详细的调试方法和注意事项。

ip0417的博客 353

Java如何连接MySQL、SQLserver数据库

Java如何连接MySQL、SQLserver数据库 关于Java与数据库的连接,总体上大同小异,差别不是太大,这里我们以MySQL数据库为例。Java与数据库连接,总体上可以概括为六个步骤,分别是: 1.注册驱动 2.建立连接 3.创建Statement 4.执行查询 5.遍历查询所有数据 6.释放资源 在进行与数据库的连接之前,我们需要先导入驱动 如图所示,在你的工程目录下建...

qq_42190335的博客 1778

YOLOv11改进 | 主干/Backbone篇 | 轻量级移动端网络ShuffleNetV2(附代码+修改教程)

本文给大家带来的改进内容是ShuffleNetV2,这是一种为移动设备设计的高效CNN架构。其在ShuffleNetV1的基础上强调除了FLOPs之外,还应考虑速度、内存访问成本和平台特性。(我在YOLOv11n上修改该主干降低了GFLOPs,但是参数量还是有一定上涨,其非常适合轻量化的读者来使用,同时精度也有一定程度的上涨)。本文通过介绍其主要框架原理,然后教你如何添加该网络结构到网络模型中。

Snu77的博客 3387

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Mysql、SqlServer、Oracle、DB2关系型数据库的区别

Mysql、SqlServer、Oracle三大数据库的区别一、MySQL二、SQL Server三、OracleOracle数据库的工作原理四、DB2 一、MySQL 优点: 1,体积小、速度快、总体拥有成本低,开源; 2,支持多种操作系统; 3,是开源数据库,提供的接口支持多种语言连接操作 ; 4,MySQL的核心程序采用完全的多线程编程。线程是轻量级的进程,它可以灵活地为用户提供服务,而不过多的系统资源。用多线程和C语言实现的mysql能很容易充分利用CPU; 5,MySql有一个非常灵活而且安全的权

tyler880的专栏 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Kettle数据同步 SQLServer到MySQL

Kettle原理和JDBC类似,可以以代码思路思考。 MySQL 连接jar包 mysql-connector-java-5.1.34.jar SQLServer 连接jar包 sqljdbc42.jar,jstl-1.2.jar Oracle 连接jar包 ojdbc6.jar Kettle数据同步有两种方式: ①时间戳方式:在原表中找出时间最大的一条,目标表中where date&g...

weixin_44399790的博客 4141

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

dbswitch异构同步实战:SQLServer多版本到MySQL的企业级数据整合方案

本文通过一个企业级实战案例,详细介绍了如何使用dbswitch工具实现从多版本SQLServer到MySQL的异构数据同步。文章深入分析了dbswitch在应对SQLServer多版本兼容性、表名映射、字段过滤等复杂需求时的优势,并提供了从Docker部署、多实例规划到任务配置、批量操作及避坑指南的完整解决方案,为企业数据整合提供了高效、灵活的参考方案。

moss5的博客 671

MYSQL数据库和MSSQL数据库有什么区别?如何进行备份和还原?

MYSQL数据库和MSSQL数据库有什么区别?如何进行备份和还原?

2409_89014517的博客 1655

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

在线QQ客服:1922638专业的SQL Server、MySQL数据库同步软件这里实现方式事先说明下,采用json+文本流方式,即读取数据库信息至文本流中,格式采用json,之后读取文本中json数据至数据库中,实现度还不完全,不过也提供了一种解决方案,目前可支持同类型数据库表同步,使用后可根据个人需要进行不同表数据库同步进行修改,仅贡献个人代码给各位大神。再次说明下由于各个数据库中关于数字的类...

weixin_39805195的博客 782
上一篇: 公众号开发--模板消息推送中文乱码问题
下一篇: java 不通过数据源直连数据库操作数据
grootblockchain
博客等级 码龄11年 55粉丝 101原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值