文档章节

一个简单的JFinal代码生成器

玛雅牛
 玛雅牛
发布于 2013/07/01 00:35
字数 810
阅读 2987
收藏 16
点赞 4
评论 11

抽空写了一个读取数据库信息,直接生成JFinal代码的生成器。

调用代码如下:


MyCodeMain main = new MyCodeMain();
		main.init();
		String dbName = "dbname";

		Table linkTable = new Table("链接","link");
		Table linkTypeTable = new Table("链接类型","link_type");
		Table siteTable = new Table("站点","site");

		TableInfoReader tir = new MySQLTableInfoReader();

		linkTable = tir.readTableInfo(dbName, linkTable);
		linkTypeTable = tir.readTableInfo(dbName, linkTypeTable);
		siteTable = tir.readTableInfo(dbName, siteTable);

		ModelClassCodeGenerater linkCg = new ModelClassCodeGenerater("com.lh.openapi.manager.model", linkTable);
		ModelClassCodeGenerater linkTypeCg = new ModelClassCodeGenerater("com.lh.openapi.manager.model", linkTypeTable);
		ModelClassCodeGenerater siteCg = new ModelClassCodeGenerater("com.lh.openapi.manager.model", siteTable);

		linkTypeCg.hasMany(linkTable);
		linkCg.belongsTo(linkTypeTable);

		siteCg.hasManyThrough(linkTypeTable, linkTable);

		siteCg.hasOneThrough(linkTypeTable, linkTable);


		linkCg.generate();
		linkTypeCg.generate();
		siteCg.generate();

		ControllerClassCodeGenerater ccg = new ControllerClassCodeGenerater("com.lh.openapi.manager.controller", linkTypeTable );
                ccg.setUseShiro(true);
                ccg.setUseFlash(true);
		ccg.generate();


生成的模型代码:


/*********************************************/
com.lh.openapi.manager.model;
import java.util.List;
import java.util.Map;
import java.util.Date;
import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Page;

public class LinkType extends Model<LinkType> {

	public static LinkType dao = new LinkType();

	/**
	 *自增id
	 */
	public static final String KEY_ID = "id";
	/**
	 *站点id
	 */
	public static final String KEY_SITE_ID = "site_id";
	/**
	 *优先级,值越高优先级越高
	 */
	public static final String KEY_PRIORITY = "priority";
	/**
	 *是否启用,1:启用,2:禁用
	 */
	public static final String KEY_IS_ENABLE = "is_enable";
	/**
	 *类型名。
	 */
	public static final String KEY_NAME = "name";

	/**
	 * 设定 自增id
	 * @param id 自增id
	 */
	public void setId( Integer id){
		set(KEY_ID, id);
	}

	/**
	 * 获取 自增id
	 * @return 自增id
	 */
	public Integer getId(){
		return getInt(KEY_ID);
	}

	/**
	 * 设定 站点id
	 * @param siteId 站点id
	 */
	public void setSiteId( Integer siteId){
		set(KEY_SITE_ID, siteId);
	}

	/**
	 * 获取 站点id
	 * @return 站点id
	 */
	public Integer getSiteId(){
		return getInt(KEY_SITE_ID);
	}

	/**
	 * 设定 优先级,值越高优先级越高
	 * @param priority 优先级,值越高优先级越高
	 */
	public void setPriority( Integer priority){
		set(KEY_PRIORITY, priority);
	}

	/**
	 * 获取 优先级,值越高优先级越高
	 * @return 优先级,值越高优先级越高
	 */
	public Integer getPriority(){
		return getInt(KEY_PRIORITY);
	}

	/**
	 * 设定 是否启用,1:启用,2:禁用
	 * @param isEnable 是否启用,1:启用,2:禁用
	 */
	public void setIsEnable( Integer isEnable){
		set(KEY_IS_ENABLE, isEnable);
	}

	/**
	 * 获取 是否启用,1:启用,2:禁用
	 * @return 是否启用,1:启用,2:禁用
	 */
	public Integer getIsEnable(){
		return getInt(KEY_IS_ENABLE);
	}

	/**
	 * 设定 类型名。
	 * @param name 类型名。
	 */
	public void setName( String name){
		set(KEY_NAME, name);
	}

	/**
	 * 获取 类型名。
	 * @return 类型名。
	 */
	public String getName(){
		return getStr(KEY_NAME);
	}


	public List<LinkType> findByExample(LinkType linkType){
		Map<String, Object> conds= new HashMap <String, Object>();
		//如果设定了 自增id
		if(linkType.getId()!=null){
			conds.put(KEY_ID, linkType.getId());
		}
		//如果设定了 站点id
		if(linkType.getSiteId()!=null){
			conds.put(KEY_SITE_ID, linkType.getSiteId());
		}
		//如果设定了 优先级,值越高优先级越高
		if(linkType.getPriority()!=null){
			conds.put(KEY_PRIORITY, linkType.getPriority());
		}
		//如果设定了 是否启用,1:启用,2:禁用
		if(linkType.getIsEnable()!=null){
			conds.put(KEY_IS_ENABLE, linkType.getIsEnable());
		}
		//如果设定了 类型名。
		if(linkType.getName()!=null && linkType.getName().length() > 0){
			conds.put(KEY_NAME, linkType.getName());
		}
		return dao.searchByMap(conds, "");
	}

	public LinkType findFristByExample(LinkType linkType){
		List<LinkType> mList = findByExample(linkType);
		return mList!=null && mList.size()>0 ? mList.get(0):null;
	}

	public List<Link> getAllLinksOfLinkType(){
		String sql = "select * from link where link_type_id=?";
		return Link.dao.find(sql,getId());
	}

	public Page<Link> getPageLinksOfLinkType(int pageNumber, int pageSize){
		return Link.dao.paginate(pageNumber, pageSize, "select *", " from link where link_type_id=?", getId());
	}
}



生成的控制器代码如下:


/*********************************************/
package com.lh.openapi.manager.controller;
import java.util.List;
import java.util.Map;

import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresPermissions;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jfinal.aop.Before;
import com.jfinal.core.Controller;
import com.jfinal.ext.flash.FlashInterceptor;
import com.jfinal.plugin.activerecord.Page;

@Before(FlashInterceptor.class)
@RequiresAuthentication
//@RequiresRoles("admin")
public class LinkTypeController  extends Controller {

	private static Logger log = LoggerFactory.getLogger(LinkTypeController.class);

	@RequiresPermissions("linktype:index")
	public void index(){
		setAttr("linkTypes", LinkType.dao.find("select * from link_type"));
		render("index.html");
	}

	@RequiresPermissions("linktype:new")
	public void newPage(){
		createToken("newToken", 120);
                setAttr("linkType",new LinkType());
		render("new.html");
	}

	@RequiresPermissions("linktype:create")
	public void create(){
		LinkType linkType = this.getModel(LinkType.class,"linkType");
		if(linkType.save()){
			setFlash("msg", "新增成功");
			redirect("show?id="+linkType.getId());
			return;
		}
		setFlash("msg", "新增失败");
		createToken("newToken", 120);
		keepModel(LinkType.class, "linkType");
		render("new.html");
	}

	@RequiresPermissions("linktype:show")
	public void show(){
		setAttr("linkType", LinkType.dao.findById(getParaToInt("id")));
		render("show.html");
	}

	@RequiresPermissions("linktype:edit")
	public void editPage(){
		setAttr("linkType", LinkType.dao.findById(getParaToInt("id")));
		createToken("editToken", 120);
		render("edit.html");
	}

	@RequiresPermissions("linktype:update")
	public void update(){
		LinkType linkType = this.getModel(LinkType.class,"linkType");
		if(linkType.update()){
			setFlash("msg", "更新成功");
			redirect("show?id="+linkType.getId());
			return;
		}
		setFlash("msg", "更新失败");
		createToken("editToken", 120);
		this.keepModel(LinkType.class, "linkType");
		render("edit.html");
	}

	@RequiresPermissions("linktype:delete")
	public void delete(){
		if(LinkType.dao.deleteById(getParaToInt("id"))){
			setFlash("msg", "删除成功");
			redirect("index");
			return;
		}
		setFlash("msg", "删除失败");
		redirect("index");
	}
} 


© 著作权归作者所有

共有 人打赏支持
玛雅牛

玛雅牛

粉丝 477
博文 108
码字总数 27153
作品 4
高级程序员
加载中

评论(11)

xiaoxin
xiaoxin
你写的这个是生成页面,所有增删改查的的代码吗
Tom-Lin
Tom-Lin
你经常 把 jfinal + httl 集成,你的代码生成器,是不是直接用 httl 做模板,然后直接调用 httl 的代码生成和编译?
Tom-Lin
Tom-Lin
什么时候分享一下你的代码生成器?发一个 demo 就行,很期待!
菜根乱谭
菜根乱谭
我不怎么看好脚手架生成,只能做些简单例子。不过如果集成到开发工具中,这个还是有些用处的。
小石头哥
小石头哥
我也写了个。不过结合前端,代码没有面向对象写法,只是直接后台输出,生成几个文件,然后改改
玛雅牛
玛雅牛

引用来自“vviqq”的评论

你好,想请教下,为何要写get set 方法,而不是用 model.getStr(" ") 等方法

为了让错误在编译期就能被发现,用model.getStr(" ")的话,错误可能只能在运行期发现。
vviqq
vviqq
你好,想请教下,为何要写get set 方法,而不是用 model.getStr(" ") 等方法
jeffsui
jeffsui
记着要分享哦!
玛雅牛
玛雅牛
还没有做完呢。半成品。
疯狂的逍遥
疯狂的逍遥
分享下!
Jboot v1.4.9 发布,核心 JFinal 升级到 3.4 最新版本

Jboot 是一个基于 JFinal 和 Undertow 开发的微服务框架。提供了 AOP、RPC、分布式缓存、限流、降级、熔断、统一配置中心、Opentracing 数据追踪、metrics 数据监控、分布式 session、代码生...

理工男海哥 ⋅ 05/03 ⋅ 0

Jboot v1.5.5 发布,修复 shiro 指令等若干bug

Jboot 是一个基于 JFinal 和 Undertow 开发的微服务框架。提供了 AOP、RPC、分布式缓存、限流、降级、熔断、统一配置中心、Opentracing 数据追踪、metrics 数据监控、分布式 session、代码生...

理工男海哥 ⋅ 06/01 ⋅ 0

Jboot v1.5.3 发布,修复 bug 和优化缓存

Jboot 是一个基于 JFinal 和 Undertow 开发的微服务框架。提供了 AOP、RPC、分布式缓存、限流、降级、熔断、统一配置中心、Opentracing 数据追踪、metrics 数据监控、分布式 session、代码生...

理工男海哥 ⋅ 05/17 ⋅ 0

JFinal 3.4 发布,将极速贯彻到 UI 层

jfinal 的终极目标是全面实现软件开发整个过程的极速开发,极大提升开发效率,极大降低学习成本,极大提升开发体验 jfinal 诞生头五年,已实现 WEB + ORM + AOP 层面的极速开发,赢得了大量开...

JFinal ⋅ 04/28 ⋅ 129

JAVA 极速WEB+ORM框架 - JFinal

JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、p...

JFinal ⋅ 2012/03/18 ⋅ 496

Jboot v1.5.7 发布,优化细节、正常更新

Jboot 是一个基于 JFinal 和 Undertow 开发的微服务框架。提供了 AOP、RPC、分布式缓存、限流、降级、熔断、统一配置中心、Opentracing 数据追踪、metrics 数据监控、分布式 session、代码生...

理工男海哥 ⋅ 06/15 ⋅ 0

Jboot v1.5.6 发布,升级 Dubbo 到最新版本并修复 bug

Jboot 是一个基于 JFinal 和 Undertow 开发的微服务框架。提供了 AOP、RPC、分布式缓存、限流、降级、熔断、统一配置中心、Opentracing 数据追踪、metrics 数据监控、分布式 session、代码生...

理工男海哥 ⋅ 06/08 ⋅ 5

Jboot v1.5.0 发布,升级 JFinal 和 优化细节

Jboot 是一个基于 JFinal 和 Undertow 开发的微服务框架。提供了 AOP、RPC、分布式缓存、限流、降级、熔断、统一配置中心、Opentracing 数据追踪、metrics 数据监控、分布式 session、代码生...

理工男海哥 ⋅ 05/09 ⋅ 0

JFinal 1.6可以无缝升级到最高哪个版本?

大约在JFinal 1.6的时候做了一个项目,一直运行至今。中途没升级也没做功能扩展,时至今日,需要做功能升级了,但是时隔太久远,基本不记得JFinal这个框架一路过来的升级过程了。所以想请求帮...

车开源 ⋅ 05/11 ⋅ 0

JFinal如何使用JNDI连接数据库

想用JNDI的方式连接数据库,但是JFinal中用的是DruidPlugin和ActiveRecordPlugin,没有看到用DataSource的地方?请问JFinal支持JNDI连接方式吗?怎么具体实现?...

zqq3436 ⋅ 06/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

BS与CS的联系与区别【简】

C/S是Client/Server的缩写。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、InFORMix或 SQL Server。客户端需要安装专用的客户端软件。 B/S是Brower/...

anlve ⋅ 53分钟前 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部