文档章节

一个简单的JFinal代码生成器

玛雅牛
 玛雅牛
发布于 2013/07/01 00:35
字数 810
阅读 3054
收藏 16

抽空写了一个读取数据库信息,直接生成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");
	}
} 


© 著作权归作者所有

共有 人打赏支持
玛雅牛

玛雅牛

粉丝 479
博文 113
码字总数 27287
作品 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
0
Jboot v1.6.3 发布,修复分布式 session 等若干问题

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

理工男海哥
07/20
0
0
Jboot v1.5.5 发布,修复 shiro 指令等若干bug

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

理工男海哥
06/01
0
0
Jboot v1.5.3 发布,修复 bug 和优化缓存

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

理工男海哥
05/17
0
0
OSC上关于Jfinal的提问整理(一)

看见Jfinal很火,就手痒痒了,想学一下,无奈入门较慢,没有找到比较全的文档。于是就经常看讨论区大家的提问与解答。后来就忽然萌生了整理下来的想法。其中的问题如果是@Jfinal 回答的,那我...

木川瓦兹
2013/04/23
0
21

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周日乱弹 —— 种族不同,禁止交往

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《苏菲小姐》- 鱼果 《苏菲小姐》- 鱼果 手机党少年们想听歌,请使劲儿戳(这里) @貓夏:下大雨 正是睡觉的好时候 临睡前...

小小编辑
今天
226
6
Python 搭建简单服务器

Python动态服务器网页(需要使用WSGI接口),基本实现步骤如下: 1.等待客户端的链接,服务器会收到一个http协议的请求数据报 2.利用正则表达式对这个请求数据报进行解析(请求方式、提取出文...

代码打碟手
今天
1
0
Confluence 6 删除垃圾内容

属性(profile)垃圾 属性垃圾的定义为,一个垃圾用户在 Confluence 创建了用户,但是这个用户在自己的属性页面中添加了垃圾 URL。 如果你有很多垃圾用户在你的系统中创建了属性,你可以使用...

honeymose
今天
1
0
qduoj~前端~二次开发~打包docker镜像并上传到阿里云容器镜像仓库

上一篇文章https://my.oschina.net/finchxu/blog/1930017记录了怎么在本地修改前端,现在我要把我的修改添加到部署到本地的前端的docker容器中,然后打包这个容器成为一个本地镜像,然后把这...

虚拟世界的懒猫
今天
1
0
UML中 的各种符号含义

Class Notation A class notation consists of three parts: Class Name The name of the class appears in the first partition. Class Attributes Attributes are shown in the second par......

hutaishi
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部