专栏首页帅哥哥写代码跨数据源拷贝表

跨数据源拷贝表

需求

做一个数据表自动介入功能。有一个系统页面可以进行数据源配置。选择源数据的某张表,在选择目标源数据库,就能实现从一个数据源拷贝表到另一个数据源。

思路

采用JdbcTemplate执行sql的方式。为了实现简单,目的数据源还是需要手动建表。

实现

通过数据源配置信息获取到数据源 package com.leadingsoft.resource_catalog.dao; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.sql.DataSource; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; public class DaoPlatform { public static NamedParameterJdbcTemplate jdbcDatasource(String driverClassName, String pass, >String url, String username) { DataSource dataSource = >DataSourceBuilder.create().driverClassName(driverClassName).url(url).username(username) .password(pass).build(); return new NamedParameterJdbcTemplate(dataSource); } public static void main(String[] args) { NamedParameterJdbcTemplate jdbcDatasource = >DaoPlatform.jdbcDatasource("com.microsoft.sqlserver.jdbc.SQLServerDriver", "", "jdbc:sqlserver://;databaseName=", ""); String sql2 = "select * from AD_CODE_"; Map<String, Object> paramMap2 = new HashMap<>(); List<Map<String, Object>> queryForList = jdbcDatasource.queryForList(sql2, paramMap2); System.out.println(queryForList); } } 数据源信息实体类-用于存储数据源配置信息 package com.leadingsoft.resource_catalog.model; import javax.persistence.Entity; import com.leadingsoft.common.model.AbstractModel; import lombok.Getter; import lombok.Setter; @Entity @Getter @Setter public class DataSourceParameter extends AbstractModel<Long> { private static final long serialVersionUID = 1L; private String driverClassName; private String pass; private String url; private String username; } 测试类 package com.leadingsoft.resource_catalog.controller; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.leadingsoft.resource_catalog.dao.DaoPlatform; import com.leadingsoft.resource_catalog.model.DataSourceParameter; import com.leadingsoft.resource_catalog.repository.DataSourceParameterRepository; @RestController @RequestMapping("test") public class TestController { @Autowired DataSourceParameterRepository dataSourceParameterRepository; @GetMapping() public void test() { DataSourceParameter model = dataSourceParameterRepository.findById(1l).get(); NamedParameterJdbcTemplate template = DaoPlatform.jdbcDatasource(model.getDriverClassName(), model.getPass(), model.getUrl(), model.getUsername()); String sql = "select * from bf_user_"; Map<String, Object> paramMap = new HashMap<>(); List<Map<String, Object>> all = template.queryForList(sql, paramMap); if (CollectionUtils.isNotEmpty(all)) { for (int i = 0; i < all.size(); i++) { StringBuffer sBuffer = new StringBuffer(); for (int j = 0; i < all.get(i).values().size(); j++) { if (j == 0) { sBuffer.append("("); // sBuffer.append(all.get(i).values().) } } } } System.out.println(all); DataSourceParameter model2 = dataSourceParameterRepository.findById(100l).get(); NamedParameterJdbcTemplate template2 = >DaoPlatform.jdbcDatasource(model2.getDriverClassName(), model2.getPass(), model2.getUrl(), model2.getUsername()); /* String sql2 = "select * from COUNTRY_CROSSOVER_INFO"; */ String sql2 = "insert into test values(1,'name'),(2,'ysh')"; Map<String, Object> paramMap2 = new HashMap<>(); // template2.update(sql2, paramMap2); // System.out.println(all2); } public static void main(String[] args) { List<Map<String, Object>> maps = new ArrayList<>(); Map<String, Object> map = new HashMap<>(); map.put("test2", "221"); map.put("test3", "222"); map.put("test4", "223"); map.put("test5", "224"); map.put("test", "225"); map.put("test6", "226"); maps.add(map); Map<String, Object> map2 = new HashMap<>(); map2.put("test2", "2211"); map2.put("test3", "2221"); map2.put("test4", "2231"); map2.put("test5", "2241"); map2.put("test", "2251"); map2.put("test6", "2261"); maps.add(map2); Map<String, Object> map3 = new HashMap<>(); map3.put("test2", "2211"); map3.put("test3", "2221"); map3.put("test4", "2231"); map3.put("test5", "2241"); map3.put("test", "2251"); map3.put("test6", "2261"); maps.add(map3); Map<String, Object> map4 = new HashMap<>(); map4.put("test2", "2211"); map4.put("test3", "2221"); map4.put("test4", "2231"); map4.put("test5", "2241"); map4.put("test", "2251"); map4.put("test6", "2261"); maps.add(map4); Map<String, Object> map5 = new HashMap<>(); map5.put("test2", "2211"); map5.put("test3", "2221"); map5.put("test4", "2231"); map5.put("test5", "2241"); map5.put("test", "2251"); map5.put("test6", "2261"); maps.add(map5); StringBuffer sBuffer = new StringBuffer(); for (int i = 1; i <= maps.size(); i++) { Map<String, Object> temp = maps.get(i - 1); Object[] obj = temp.values().toArray(); for (int k = 0; k < obj.length; k++) { if (k == 0) { sBuffer.append("('"); sBuffer.append(obj[k]); sBuffer.append("',"); } else if (k == obj.length - 1) { sBuffer.append("'"); sBuffer.append(obj[k]); sBuffer.append("'),"); } else { sBuffer.append("'"); sBuffer.append(obj[k]); sBuffer.append("',"); } } if (i % 2 == 0) { String string = sBuffer.substring(0, sBuffer.length() - 1); System.out.println(string); sBuffer.delete(0, sBuffer.length()); } if (i == maps.size()) { if (sBuffer.length() > 0) { String string = sBuffer.substring(0, sBuffer.length() - 1); System.out.println(string); sBuffer.delete(0, sBuffer.length()); } } } } } 上面是测试查找与插入语句的执行。最后的测试类是用于限制每次插入的行数。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 自定义工作流设计

    工作偶尔会遇到需要审批相关的系统,对于流程步骤相对固定的,一般会采取某些第三方的工作流来做对应的系统。目前唯一用过的就是activiti工作流。对它进行了简单的...

    用户5166330
  • vue整合pdfjs,实现pdf文件预览

    pdf格式的文件浏览器是可以直接打开的。所以只需要返回pdf文件的文件流,就可以直接预览文件,通过这种方式打开,整个页面全是pdf的文件内容。需求是要求预览时,...

    用户5166330
  • vue路由mode模式:history与hash的区别

    用户5166330
  • 从零学PyTorch:DataLoader构建高效的自定义数据集

    Torch中可以创建一个DataSet对象,并与dataloader一起使用,在训练模型时不断为模型提供数据Torch中DataLoader的参数如下

    深度学习与交通大数据
  • 前端路由那些事

    假设你浏览器访问的url地址是 http://127.0.0.1/#/test 那么通过 location.hash 获取的hash值为 #/test

    树酱
  • 闲谈IPv6-Loopback网口上的IPv6地址

    早年,我也写过关于Loopback的两篇文章: 用IP地址的用途理解Loopback接口: https://blog.csdn.net/dog250/arti...

    望天
  • pygame-KidsCanCode系列jumpy-part0-使用sprite

    开发新游戏时,把上面这个模板复制一份新的,然后改改里面update/draw这二个部分即可。为了方便新同学理解"模板"的处理流程,从视频中截了二张图:

    菩提树下的杨过
  • 在R语言中使用航空公司复杂网络对疫情进行建模

    在2014年的埃博拉疫情爆发期间,人们对该疾病蔓延至美国的情况非常关注。我们决定使用航空公司的航班数据探讨这个问题。

    拓端
  • Google的面试题长啥样?看完被吊打!

    作为一名Google的工程师和面试官,今天是我第二次发文分享科技公司面试建议了。这里先声明:本文仅代表我个人的观察、意见和建议。请勿当作来自Google或Alp...

    Java技术栈
  • 【云开发校园技术布道师】实战项目-题云

    作为学生,上课是你平时需要做的最多的事情,但是授课过程中往往存在一些比较麻烦的点,比如:课件中的练习题无法很好的传递、上课打卡签到的难度总是很大,如何利用碎片化...

    XavierT

扫码关注云+社区

领取腾讯云代金券