暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

低代码利器-动态建表

匠工精神 2021-10-06
1679

代码,如火如荼,相信大家都听说过,有可能已经在践行了。因着疫情,加速企业的数字化转型,效率显得越来越重要,几年前,我们内部就在开始践行这样的思想,因为我们发现好多业务需求有着相似性,如何更快的响应业务的需求,加快产品的迭代。简单说一个场景,业务数字化时,需要把业务数据吸进系统,然后提供增删改查和导入、导出的基本功能,看起来一个简单的功能,但是如果是每次都开发加测试,至少两个人天,而如果用表单引擎,几分钟就能配置好。你说这样的效率有没有提升~


在低代码的建设过程中,需要在页面上创建表模型添加修改字段。涉及到动态生成表结构,动态生成模型实体类动态查询表字段等等,当然如果纯拼接sql来处理也可以,但会很麻烦。今天介绍一个动态建表的利器-jpa。相信很多人用过jpa,通过注解就能建表,修改起来也很方便。但今天介绍这个技术,运行时持久化实体没有必要一定表示成像POJO类或者JavaBean对象那样的形式,Hibernate也支持动态模型在运行期使用Map和像Dom4j的树模型那样的实体表示。

在我们的方案设计里,把低代码的核心库和业务库是分开的,而且支持SAAS化的自定义数据库,解决使用方担心数据安全的问题。所以我们支持自定义数据源:

这个数据源是通过页面配置来动态创建的,然后创建我们需要的

entityManagerFactory


接下来通过字符串来定义hibernate的配置:

最后是核心的代码:


当前端每次保存/更新表单的时候,调用该方法即可。

 /**
* 根据前端传过来的数据动态建表
* @param metadataForm
*/
public void generateDynamicDdl(MetadataForm metadataForm) {
String xml = "";
SessionFactory sessionFactory = createEntityManagerFactoryBean(lowCodeDataSource).getObject().unwrap(SessionFactory.class);
StandardServiceRegistry serviceRegistry = sessionFactory.getSessionFactoryOptions().getServiceRegistry();
MetadataSources metadataSources = new MetadataSources(serviceRegistry);
sessionFactory.getSessionFactoryOptions();
if (Objects.nonNull(metadataForm)) {
String entityName = metadataForm.getTable().toUpperCase();
String tableName = metadataForm.getTable();
if(CollectionUtils.isNotEmpty(metadataForm.getFields())) {
StringBuilder property = new StringBuilder();
for(MetadataField field: metadataForm.getFields()) {
property.append(" <property ");
property.append("name="+"\""+field.getField()+"\"");
property.append(" type="+"\""+Constants.javaTypeMap.get(field.getColumnType())+"\"");
property.append(" column="+"\""+field.getField()+"\"");
property.append("/>\n");
}
String dynamicComment = property.toString();
xml = XML_MAPPING.replace(Constants.ENTITY_NAME,entityName).replace(Constants.TABLE_NAME,tableName)
.replace(Constants.DYNAMIC_COMPONENT,dynamicComment);
}
}
//读取映射文件
metadataSources.addInputStream(new ByteArrayInputStream(xml.getBytes()));
StrategySelector strategySelector = serviceRegistry.getService( StrategySelector.class );
Metadata metadata = metadataSources.getMetadataBuilder().applyPhysicalNamingStrategy(
strategySelector.resolveStrategy(
PhysicalNamingStrategy.class,
org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl.class
)
).build();
// Metadata metadata = metadataSources.buildMetadata();
创建数据库Schema,如果不存在就创建表,存在就更新字段,不会影响已有数据
SchemaExport schemaExport = new SchemaExport();
schemaExport.createOnly(EnumSet.of(TargetType.DATABASE), metadata);
metadata.buildSessionFactory();
}

总结

低代码的建设过程中有好多有趣好玩的东西,难点在于我们的思想,你如能想到,就能实现。前期需要多去学习目前市场上主流的低代码平台有哪些,看看他们是如何处理的,这样能拓宽我们的思路。通过本篇的分享也希望给同样困惑的小伙伴一点灵感,帮助你们更好的落地低代码。也欢迎有想法的小伙伴来聊。后面有机会再带大家一起探讨学习~

文章转载自匠工精神,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论