开源Java代码生成器 界面好看 全网最强 性能丰盛 (开源java cms)

开源Java代码生成器 界面好看 全网最强 性能丰盛 (开源java cms)

本文目录导航:

开源Java代码生成器(全网最强,界面好看,性能丰盛)

Java在线代码生成器:在线访问前端:React 16.8.6、Ant-design 4.24.12、Umi 3.5.41后端:Java 1.8、、knife4j(Swagger)2.0.9、Freemarker 2.3.31前端:tool4j-generator-ui后盾:tool4j-generator局部代码节选:可间接clone该名目到本地,无需修正任何内容即可运转后端:1.经常使用Maven装置依赖2.运转前端:3.切换到前端工程根目录4.装置依赖:npm i5.运转:umi dev大家也可以间接经常使用在线版本,经常使用环节中有任何疑问或倡导都可以留言反应。Java在线代码生成器:在线访问

Java代码生成器降级:减少少数据源形式允许

哈喽,小同伴们,一周不见了,在这段期间,我应用任务的闲暇期间降级了一版代码生成器,减少了之前呼声较高的少数据源形式,这样生成的代码可以成功灵活切换数据源的性能,少数据源在名目当中还算比拟罕用的,例如主从读写分别,多库操作等都须要在同一个名目中操作多个数据库,本次降级正是处置了这个痛点,生成代码之后,可以经过注解的形式灵敏切换数据源,并且允许多库事务分歧性,上方就让咱们一同看一下详细的成成成果,顺便讲一下灵活少数据源的外部原理!为了成功少数据源形式,代码生成器对界面启动了调整,如下:主界面减少了选用数据源的性能,并且如今数据库消息须要点击数据源性能来启动性能,点击后会弹出如下窗口:在这里咱们可以性能数据库消息,性能终了后点击保留,在主界面即可启动选用,在主界面被选用的数据源将在生成的代码中作为自动数据源经常使用。

勾选少数据源形式可以生成少数据源形式代码,不勾选则与之前一样,生成的是惯例复数据源名目。

总体跟原来区别不大,经常使用少数据源形式生成代码基本步骤如下:以下为代码生成器生成的局部代码展现:少数据源形式下会在 config 包下生成少数据源关系的性能类及切面,假设大家有共性化需求可以经过修正 DynamicDataSourceAspect 切面来成功灵活切换逻辑,现有切换逻辑基本足够。

少数据源其实还可以经过代码分包的形式成功,这种形式成功起来易于了解:性能多个数据源,扫描不同的包,创立属于自己的 sqlSessionFactory 和 txManager(事务治理器),在经常使用的时刻可以经过调用不同包下的 mapper 来成功少数据源的成果,然而这种形式的弊病也较为显著,分包稍有不慎便会出错,并且假构想要成功不同数据源下的事务分歧性也较为费事,在同一个 service 方法中操作多个数据库因此受限。

灵活少数据源则不会有以上疑问,因此代码生成器选用了灵活少数据源的生成形式,应用 aop 成功数据源的灵活切换,并且可以保障多库操作事务分歧性,前面会详细解说。

在 idea 中运转生成的代码,启动终了登录,点击左侧菜单查问:检查后盾日志,发现会切换不同的数据库口头sql:上方以 springboot 为例,讲一下少数据源外部原理。

灵活少数据源的外部原理其实就是 aop,只不过复杂的是 aop 的成功环节。

mybatis 为咱们提供了一个形象类 AbstractRoutingDataSource,经过承袭此类,重写 determineCurrentLookupKey 方法可以依据前往值选择以后经常使用哪个数据源,因此咱们创立类 DynamicDataSource 承袭 AbstractRoutingDataSource 偏重写 determineCurrentLookupKey 方法:先不忙着成功,假构想要正确婚配数据源,咱们还须要向 DynamicDataSource 类中注册数据源,所以须要先对数据源启动性能,这里注册两个数据源 db1(mysql) 和 db2(oracle),咱们经常使用枚举值 DB1 和 DB2 作为数据源 db1 和 db2 的 key:注册数据源 db1 和 db2:经过以上性能,咱们成功向 DynamicDataSource 中注册了 db1 和 db2,如何能力失掉以后程序运转中的数据源呢?这就须要咱们用到 ThreadLocal,ThreadLocal 可以向以后线程中 set 和 get 值并且不受其余线程影响,而咱们主机的每一个恳求都由一个任务线程来处置(nio 形式也是一个恳求一个任务线程处置,只是在接纳恳求的时刻经常使用了 io 多路复用),所以可以经常使用 ThreadLocal 存储以后任务线程的数据源,ThreadLocal 在很多开源框架中都有经常使用,重要用于线程隔离。

创立 DynamicDataSourceHolder 类,存储以后线程中的数据源:而后,成功 determineCurrentLookupKey 方法,一行代码即可:最后一步,咱们要成功数据源的灵活切换,则须要自己成功一个数据源灵活切面,扭转以后线程中的数据源,咱们可以经常使用注解来辅佐成功,在切面中经过扫描方法上的注解来得悉详细切换到哪个数据源。

创立 DBType 注解:创立数据源灵活切面 DynamicDataSourceAspect:在数据源切面上须要减少 @Order 注解,值取1,这是由于之前咱们性能了灵活数据源事务,spring 会因此生成事务代理并且会优先于切面口头,事务代理一旦生成,数据源便被固定,这样咱们在切面中切换数据源就会有效,所以切面逻辑须要在事务代理之前口头才可失效。

切面性能完后咱们只有要在 service 的方法上经常使用 DBType 注解便可以灵活切换数据源,如下:至此,灵活少数据源基本成功终了!经常使用灵活少数据源的同时,也要留意保障事务分歧性,大家或者遇到过这种状况,传统复数据源运行中,同一个 service ,在没有开启事务的方法里调用开启事务的方法会造成事务失效,这是由于 spring 只会对相反的 service 代理一次性,否则假设在没有开启事务的方法中再次开启自身代理会造成循环依赖疑问产生,相似 “有限套娃”:自己代理的方法调用自己代理的另一个方法,并且另一个方法还须要自己的代理。

处置此类疑问的方法很便捷,让调用方开启事务即可,少数据源形式中雷同实用。

除此之外,少数据源形式中还存在如下场景:serviceA 中的 A 和 B 方法都开启了事务,但操作的是不同的数据库(ip不同),这个时刻 A 调用 B,经常使用的是 A 的代理,对 B 不实用,便会报错,对此咱们可以把 B 方法移入另一个 serviceB 中,在 serviceA 中注入 serviceB ,在 A 方法中经常使用 serviceB 调用 B 方法,这样口头到 B 方法的时刻经常使用的便是 serviceB 的代理,看起来没有疑问,但还有一点遗漏,那就是事务的流传行为。

咱们都知道,Spring 中自动的事务流传行为是 required:假设须要开启事务,则开启事务,假设曾经开启事务,则参与以后事务。

上文中,口头 B 方法的时刻只管经常使用的是 serviceB 的代理,然而由于其事务流传行为是 required,A 方法口头的时刻曾经开启了事务,所以造成 B 方法参与到了 A 方法的事务中,但 A 和 B 属于两个不同的数据库,经常使用相反的事务治理器肯定会产生疑问。

为了处置此疑问,咱们可以把事务流传行为改为 required_new:假设须要开启事务,则开启事务,并且总是开启新的事务。

这样口头 B 方法的时刻会开启新的事务,经常使用的便是 B 所在数据库的事务治理器,B 方法也就可以反常口头了,并且假设 B 产生意外,假设 A 不被动捕捉,则 A,B 都会回滚。

兴许有人会问,复数据源形式下经常使用 required 为什么不会有上述疑问呢,由于复数据源形式下经常使用的是同一个数据库,在事务口头环节中,以后事务是共享且通用的,所以没疑问。

除此之外,经常使用 required 不用频惨重开事务,也肯定水平上优化了系统性能,少数据源形式下由于不同数据库之间事务是齐全隔离的,所以才须要经常使用 required_new 重开事务,当然,也须要依据业务详细场景详细剖析,这里探讨的只是较为通用的状况。

代码生成器少数据源形式下经常使用的事务流传行为正是 required_new,全局性能类如下:到此为止,咱们才算成功了一个完整的灵活少数据源性能,可见是有许多技术细节潜藏在外面的,好友们可以经常使用代码生成器生成少数据源形式下的代码自行运转体会。

本文到这里就完结了,成功这个少数据源生成性能其实也算花了一番心理,正着写代码容易,反上来生成是真不容易,并且由于最开局做的时刻没有思考到少数据源的状况,造成最开局的设计全都是针对单个数据库的,这次强行在外面包了一层,总归是成功了,在这个环节中,顺便也温习了一下 Spring 的循环依赖,Bean 加载周期等老生常谈的疑问,也算有所收获。

作为开发人员,咱们要多关注一些性能底层的物品,而不是便捷的 api 调用,这样能力始终打破瓶颈,取得生长。

码字不易,各位看官可以点赞,评论,关注哦,咱们下次再见!关注群众号 螺旋编程极客 失掉代码生成器最新灵活,同时第一期间解锁更多精彩内容!

java代码生成器怎样用

zip包,而后智能下载上去

1.预先定义好模板

2.界面输入关系参数

3.解析模板生成代码并下载

最后放出源代码:

import ;import ;import ;import ;import ;

import ;import ;

import ;import ;import ;import ;import ;import ;import ;

/*** 类称号:FreemarkerController* 创立人:Harries* 创立期间:2015年1月12日* @version*/@Controller@RequestMapping(value=”/createCode”)public class CreateCodeController extends BaseController {

/*** 生成代码*/@RequestMapping(value=”/proCode”)public void proCode(HttpServletResponse response) throws Exception{PageData pd = new PageData();pd = ();

/* ============================================================================================= */String packageName = (“packageName”); //包名 ========1String objectName = (“objectName”); //类名 ========2String tabletop = (“tabletop”); //表前缀 ========3tabletop = null == tabletop?””(); //表前缀转大写String zindext = (“zindex”); //属性总数int zindex = 0;if(null != zindext && !””(zindext)){zindex = (zindext);}List<String[]> fieldList = new ArrayList<String[]>(); //属性汇合 ========4for(int i=0; i< zindex; i++){((“field”+i)(“,fh,”)); //属性放到汇合外面}

(()+”admin/ftl”); //生成代码前,先清空之前生成的代码/* ============================================================================================= */

String filePath = “admin/ftl/code/”; //寄存门路String ftlPath = “createCode”; //ftl门路

/*生成controller*/(“”, root, “controller/”+packageName+”/”+()+”/”+objectName+””, filePath, ftlPath);

/*生成service*/(“”, root, “service/”+packageName+”/”+()+”/”+objectName+””, filePath, ftlPath);

/*生成mybatis xml*/(“”, root, “mybatis_mysql/”+packageName+”/”+objectName+””, filePath, ftlPath);(“”, root, “mybatis_oracle/”+packageName+”/”+objectName+””, filePath, ftlPath);

/*生成SQL脚本*/(“mysql_SQL_”, root, “mysql数据库脚本/”+tabletop+()+””, filePath, ftlPath);(“oracle_SQL_”, root, “oracle数据库脚本/”+tabletop+()+””, filePath, ftlPath);

/*生成jsp页面*/(“jsp_list_”, root, “jsp/”+packageName+”/”+()+”/”+()+”_”, filePath, ftlPath);(“jsp_edit_”, root, “jsp/”+packageName+”/”+()+”/”+()+”_”, filePath, ftlPath);

/*生成说明文档*/(“”, root, “说明”, filePath, ftlPath);

//(“oracle_SQL_”, root); 控制台打印

/*生成的所有代码紧缩成zip文件*/(()+”admin/ftl/code”, ()+”admin/ftl/”);

/*下载代码*/(response, ()+”admin/ftl/”, “”);

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

25阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

25阅读