最近做toB、toG业务,普遍要去适配各种国产数据库,所以不得不用hibernate,过去这么多年一直都是用mybatis+mysql,现在重拾hibernate,专注跨数据库,感兴趣的加关注。

需求背景:

最近做一个数据库备份还原功能,需要支持跨库同步,比如mysql的数据及表结构整库批量同步到SqlServer(虽然Navicat有此功能,但是Navicat不支持一些新的国产数据库,况且,这个Navicat不能集成到项目里,用户使用不方便)。

功能分析:

1、需要同步表结构,不同的数据库DDL语句不兼容性。但是,hibernate框架中,entity已经定义了表结构,hibernate会帮我们适配各种数据库,所以不用备份表结构(sql: create table xxx ...),直接通过hibernate在数据库生成表;

2、常见的数据备份是备份insert into table ... 这样的sql语句。这样做,备份文件体积大,且不是批量插入,性能一般,特殊格式的字段在不同数据库还存在兼容问题。所以我们可以通过hibernate,只备份数据,将数据转为json格式存储,然后用hibernate将数据入库。

实现思路:

1、通过entityManager获取实体entity;

2、通过entity查询对应表所有数据;

3、解析前端传参,组装新的数据库链接;

4、根据数据库链接和获取到的实体,创建hibernate工厂(通过entity创建表);

5、再次通过遍历实体,组装批量insert sql(ps:hibernate批量插入性能很差,原则是还是saveOrUpdate);

6、从创建的hibernate工厂获取sessionFactory,执行批量插入sql;

关键代码:

1、通过批量jpa备份数据

@Resource
private EntityManager entityManager; //注入entityManager // ---------------------------------
// 通过entityManager获取所有实体
Set<EntityType<?>> entityTypes = entityManager.getMetamodel().getEntities();
// 遍历实体
entityTypes.parallelStream().forEach((EntityType<?> entity) -> {
  // 根据实体创建 JpaRepository
  SimpleJpaRepository simpleJpaRepository = new SimpleJpaRepository(entity.getJavaType(), entityManager);
  // 直接读表数据
  List<?> list = simpleJpaRepository.findAll();
  // 可以将list转为json存储...以下省略...
});

2、通过jpa手动创建表

 private void initEntityManager() {
Map<String, String> settings = new HashMap<>();
settings.put(AvailableSettings.DRIVER, "com.mysql.jdbc.Driver");
settings.put(AvailableSettings.DIALECT, "com.ut.msfw1a.common.core.hibernate.dialect.MsfwMySQLDialect");
        settings.put(AvailableSettings.URL, "jdbc:mysql://127.0.0.1"); // 填入要还原的数据库jdbc信息
settings.put(AvailableSettings.USER, "root");
settings.put(AvailableSettings.PASS, "password");
settings.put(AvailableSettings.ORDER_INSERTS, "true");
settings.put(AvailableSettings.ORDER_UPDATES, "true");
settings.put(AvailableSettings.STATEMENT_BATCH_SIZE, "10000");
settings.put(AvailableSettings.SHOW_SQL, "false");
settings.put(AvailableSettings.BATCH_VERSIONED_DATA, "ture");
settings.put(AvailableSettings.HBM2DDL_AUTO, "update");
settings.put(AvailableSettings.PHYSICAL_NAMING_STRATEGY, "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");// 表命名规则
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(settings).build();
MetadataSources metadataSources = new MetadataSources(serviceRegistry);
entityTypes.forEach((EntityType<?> type) -> {//entityTpyes是备份的时候从entity中取到的
metadataSources.addAnnotatedClass(type.getJavaType()); // 添加要还原的entity
});
Metadata metadata = metadataSources.getMetadataBuilder().build(); // 创建hibernate工厂,这一步,会自动生成表
SessionFactory sessionFactory = metadata.buildSessionFactory();
sessionFactory.openSession();
entityManager = sessionFactory.createEntityManager(); // 这样就根据jdbc信息创建了一个自己的entityManager
}

3、还原数据

存数据的时候,json数据文件用表名存储

可以这样根据表名获取到对应的entity

Optional<EntityType<?>> entityTypeOptional = entityTypes.stream().filter(et -> et.getName().equals(tableName)).findFirst();
if (!entityTypeOptional.isPresent()) {
return;
}
EntityType<?> entityType = entityTypeOptional.get();
根据表名,和新创建的entityManager还原数据
SimpleJpaRepository simpleJpaRepository = new SimpleJpaRepository(entity.getJavaType(), entityManager);
simpleJpaRepository.batchSave(list)

最新文章

  1. ENode 2.8 最新架构图简介
  2. python多行字符串
  3. onselectstart和onselect的使用
  4. html/css基础篇——link和@inport详解以及脚本执行顺序探讨
  5. Python学习资料整理以及书籍、开发工具推荐
  6. Oracle学习系列3
  7. @font-face的用法
  8. ural1028 Stars
  9. ArcGIS 网络分析[2.2] 服务区分析
  10. 【Android 应用开发】BluetoothDevice详解
  11. 解决Kali用户名密码正确但是无法登陆的问题
  12. Golang 语言的单元测试和性能测试(也叫 压力测试)
  13. ASP.NET 多环境下配置文件web.config的灵活配置
  14. 统计一个数据库中,无记录的表的sql语句
  15. bzoj1497 [NOI2006]最大获利 最大权闭合子图
  16. Excel中单元格、超级链接形成超级链接单元格
  17. Ueditor百度编辑器中的 setContent()方法的使用
  18. AS3 巧用事件api简化鼠标拖动流程
  19. JS三种消息框的使用
  20. Spark源码分析 &ndash; BlockManager

热门文章

  1. CTF隐写术总结
  2. 02.JavaScript学习笔记1
  3. Vuex极速入门
  4. uniapp微信小程序 选择日期时间
  5. Windows缓冲区溢出实验
  6. [常用工具] OpenCV获取网络摄像头实时视频流
  7. python之路36 MySQL查询关键字
  8. ★k倍区间【第八届蓝桥杯省赛C++B组,第八届蓝桥杯省赛JAVAB组】
  9. [C++]C++11:Function与Bind
  10. Typora软件下载与markdown语法的使用