文档章节

jfinal的generator对sqlite的扩展支持

chmin
 chmin
发布于 2016/04/14 23:29
字数 1215
阅读 109
收藏 1
点赞 1
评论 0

首先是参数设置页,和demo差不多

package top.chmin.config;

import javax.sql.DataSource;

import com.jfinal.kit.PathKit;
import com.jfinal.kit.PropKit;
import com.jfinal.plugin.activerecord.dialect.Sqlite3Dialect;
import com.jfinal.plugin.c3p0.C3p0Plugin;

/**
 * chmin
 */
public class MySqliteModelGenerator {
	protected StringBuilder basePack = new StringBuilder();
	protected StringBuilder basePath = new StringBuilder();
	protected StringBuilder modelPack = new StringBuilder();
	protected StringBuilder modelPath = new StringBuilder();

	/**
	 * 获取数据库数据源
	 * 
	 * @return
	 */
	public DataSource getDataSource() {
		PropKit.use("config.txt");
		C3p0Plugin cp = new C3p0Plugin(PropKit.get("jdbcurl"),
				PropKit.get("username"), PropKit.get("password"),
				PropKit.get("driverClass"));
		cp.start();
		return cp.getDataSource();
	}

	/**
	 * 依次输入model所在的包,如top.chmin.model则输入generator("top","chmin","model")
	 * 
	 * @param pack
	 */
	public void generator(String... pack) {
		modelPath.append(PathKit.getWebRootPath()).append("/../src/");

		for (int i = 0; i < pack.length; i++) {
			modelPack.append(pack[i]);
			modelPath.append(pack[i]);
			if (i != pack.length - 1) {
				modelPack.append(".");
				modelPath.append("/");
			}
		}

		basePack.append(modelPack.toString()).append(".").append("base");
		basePath.append(modelPath.toString()).append("/").append("base");
		SqliteGenerator gernerator = new SqliteGenerator(getDataSource(),
				basePack.toString(), basePath.toString(), modelPack.toString(),
				modelPath.toString());
		gernerator.setGenerateDaoInModel(true);
		gernerator.setDialect(new Sqlite3Dialect());
		gernerator.addExcludedTable("sqlite_sequence");
		gernerator.generate();
	}

	public static void main(String[] args) {
		new MySqliteModelGenerator().generator("top", "chmin", "model");
	}
}

然后是MetaBuilder扩展,数据库以date或time结尾的integer类型字段,会映射为Date类型。

package top.chmin.config;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import com.jfinal.plugin.activerecord.generator.ColumnMeta;
import com.jfinal.plugin.activerecord.generator.MetaBuilder;
import com.jfinal.plugin.activerecord.generator.TableMeta;

/**
 * chmin 2016年4月14日 下午3:22:15
 */
public class SqliteMetaBuilder extends MetaBuilder {

	public SqliteMetaBuilder(DataSource dataSource) {
		super(dataSource);
	}
	
	@override
	protected void buildColumnMetas(TableMeta tableMeta) throws SQLException {
		String sql = dialect.forTableBuilderDoBuild(tableMeta.name);
		Statement stm = conn.createStatement();
		ResultSet rs = stm.executeQuery(sql);
		ResultSetMetaData rsmd = rs.getMetaData();

		for (int i = 1; i <= rsmd.getColumnCount(); i++) {
			ColumnMeta cm = new ColumnMeta();
			cm.name = rsmd.getColumnName(i);
			int type = rsmd.getColumnType(i);
			// 修改的部分开始
			if (type == Types.INTEGER) {
				if (dateOrTime(cm.name)) {
					cm.javaType = "Date";
				} else {
					cm.javaType = "Integer";
				}
			} else {
				cm.javaType = "String";
			}
			// 修改的部分结束
			cm.attrName = buildAttrName(cm.name);

			tableMeta.columnMetas.add(cm);
		}

		rs.close();
		stm.close();
	}

	protected boolean dateOrTime(String string) {
		if (string.length() > 4) {
			string = string.substring(string.length() - 4);
			if ("date".equalsIgnoreCase(string)
					|| "time".equalsIgnoreCase(string)) {
				return true;
			}
		}
		return false;
	}
}

接着是Generator扩展,更新了部分方法,同时将不适宜的构造方法标注为过时。

package top.chmin.config;

import java.util.List;

import javax.sql.DataSource;

import com.jfinal.plugin.activerecord.generator.BaseModelGenerator;
import com.jfinal.plugin.activerecord.generator.Generator;
import com.jfinal.plugin.activerecord.generator.ModelGenerator;
import com.jfinal.plugin.activerecord.generator.TableMeta;

/**
 * chmin 2016年4月14日 下午2:59:43
 */
public class SqliteGenerator extends Generator {
	
	protected String modelPackageName;
	protected String modelOutputDir;

	public SqliteGenerator(DataSource dataSource, String baseModelPackageName,
			String baseModelOutputDir, String modelPackageName,
			String modelOutputDir) {
		this(dataSource, new SqliteBaseModelGenerator(baseModelPackageName,
				baseModelOutputDir), new ModelGenerator(modelPackageName,
				baseModelPackageName, modelOutputDir));
		this.modelPackageName = modelPackageName;
		this.modelOutputDir = modelOutputDir;
	}

	@Deprecated
	public SqliteGenerator(DataSource dataSource, String baseModelPackageName,
			String baseModelOutputDir) {
		this(dataSource, new SqliteBaseModelGenerator(baseModelPackageName,
				baseModelOutputDir));
	}

	@Deprecated
	public SqliteGenerator(DataSource dataSource, BaseModelGenerator baseModelGenerator) {
		super(dataSource, baseModelGenerator);
		this.metaBuilder = new SqliteMetaBuilder(dataSource);
	}

	@Deprecated
	public SqliteGenerator(DataSource dataSource,
			BaseModelGenerator baseModelGenerator, ModelGenerator modelGenerator) {
		super(dataSource, baseModelGenerator, modelGenerator);
		this.metaBuilder = new SqliteMetaBuilder(dataSource);
	}

	@Override
	public void generate() {
		this.mappingKitGenerator = new SqliteMappingKitGenerator(modelPackageName, modelOutputDir);
		List<TableMeta> tableMetas = metaBuilder.build();
		if (tableMetas.size() == 0) {
			return ;
		}
		
		baseModelGenerator.generate(tableMetas);
		
		if (modelGenerator != null) {
			modelGenerator.generate(tableMetas);
		}
		
		if (mappingKitGenerator != null) {
			mappingKitGenerator.generate(tableMetas);
		}
		
		if (dataDictionaryGenerator != null && generateDataDictionary) {
			dataDictionaryGenerator.generate(tableMetas);
		}
		
	}
}

最后是BaseModelGenerator扩展,添加Date类型时的getset方法支持。

package top.chmin.config;

import java.util.List;

import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.generator.BaseModelGenerator;
import com.jfinal.plugin.activerecord.generator.ColumnMeta;
import com.jfinal.plugin.activerecord.generator.TableMeta;

/**
 * chmin 2016年4月14日 下午3:07:33
 */
public class SqliteBaseModelGenerator extends BaseModelGenerator {
	
	protected String importTemplate =
			"import com.jfinal.plugin.activerecord.Model;%n" +
			"import com.jfinal.plugin.activerecord.IBean;%n%n";
	protected String importTemplate2 =
			"import com.jfinal.plugin.activerecord.Model;%n" +
			"import com.jfinal.plugin.activerecord.IBean;%n" +
			"import java.util.Date;%n%n";
	
	protected String classDefineTemplate =
			"/**%n" +
			" * Generated by JFinal, update by chmin, do not modify this file.%n" +
			" */%n" +
			"@SuppressWarnings(\"serial\")%n" +
			"public abstract class %s<M extends %s<M>> extends Model<M> implements IBean {%n%n";
	
	protected String setterTemplate =
			"\tpublic void %s(%s %s) {%n" +
				"\t\tset(\"%s\", %s);%n" +
			"\t}%n%n";
	protected String setterTemplate2 =
			"\tpublic void %s(%s %s) {%n" +
				"\t\tset(\"%s\", %s.getTime());%n" +
			"\t}%n%n";
	protected String getterTemplate =
			"\tpublic %s %s() {%n" +
				"\t\treturn get(\"%s\");%n" +
			"\t}%n%n";
	protected String getterTemplate2 =
			"\tpublic %s %s() {%n" +
				"\t\treturn new Date(getInt(\"%s\"));%n" +
			"\t}%n%n";
	public SqliteBaseModelGenerator(String baseModelPackageName,
			String baseModelOutputDir) {
		super(baseModelPackageName, baseModelOutputDir);
	}

	@Override
	public void generate(List<TableMeta> tableMetas) {
		for (TableMeta tableMeta : tableMetas)
			genBaseModelContent(tableMeta);
		wirtToFile(tableMetas);
	}
	
	@Override
	protected void genBaseModelContent(TableMeta tableMeta) {
		StringBuilder ret = new StringBuilder();
		genPackage(ret);
		genImport(ret, tableMeta);
		genClassDefine(tableMeta, ret);
		for (ColumnMeta columnMeta : tableMeta.columnMetas) {
			genSetMethodName(columnMeta, ret);
			genGetMethodName(columnMeta, ret);
		}
		ret.append(String.format("}%n"));
		tableMeta.baseModelContent = ret.toString();
	}
	
	@Override
	protected void genClassDefine(TableMeta tableMeta, StringBuilder ret) {
		ret.append(String.format(classDefineTemplate, tableMeta.baseModelName, tableMeta.baseModelName));
	}
	
	@Override
	protected void genSetMethodName(ColumnMeta columnMeta, StringBuilder ret) {
		String setterMethodName = "set" + StrKit.firstCharToUpperCase(columnMeta.attrName);
		// 如果 setter 参数名为 java 语言关键字,则添加下划线前缀 "_"
		String argName = javaKeyword.contains(columnMeta.attrName) ? "_" + columnMeta.attrName : columnMeta.attrName;
		String setter = null;
		if("Date".equals(columnMeta.javaType)){
			setter = String.format(setterTemplate2, setterMethodName, columnMeta.javaType, argName, columnMeta.name, argName);
		} else {
			setter = String.format(setterTemplate, setterMethodName, columnMeta.javaType, argName, columnMeta.name, argName);
		}
		ret.append(setter);
	}

	@Override
	protected void genGetMethodName(ColumnMeta columnMeta, StringBuilder ret) {
		String getterMethodName = "get" + StrKit.firstCharToUpperCase(columnMeta.attrName);
		String getter = null;
		if("Date".equals(columnMeta.javaType)){
			getter = String.format(getterTemplate2, columnMeta.javaType, getterMethodName, columnMeta.name);
		} else {
			getter = String.format(getterTemplate, columnMeta.javaType, getterMethodName, columnMeta.name);
		}
		ret.append(getter);
	}
	
	protected void genImport(StringBuilder ret, TableMeta tableMeta) {
		if(hasDate(tableMeta)){
			ret.append(String.format(importTemplate2));
		} else {
			ret.append(String.format(importTemplate));
		}
	}
	
	protected boolean hasDate(TableMeta tableMeta){
		for (ColumnMeta columnMeta: tableMeta.columnMetas){
			if("Date".equals(columnMeta.javaType)){
				return true;
			}
		}
		return false;
	}
}

下面以一个简单表进行演示不同:

DROP TABLE IF EXISTS "main"."login";
CREATE TABLE "login" (
"id"  INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"code"  TEXT,
"openid"  TEXT,
"createTime"  INTEGER
);

先看一下默认生成的basemodel中的样子

package top.chmin.model.base;

import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.IBean;

/**
 * Generated by JFinal, do not modify this file.
 */
@SuppressWarnings("serial")
public abstract class BaseLogin<M extends BaseLogin<M>> extends Model<M> implements IBean {

	public void setId(java.lang.String id) {
		set("id", id);
	}

	public java.lang.String getId() {
		return get("id");
	}

	public void setCode(java.lang.String code) {
		set("code", code);
	}

	public java.lang.String getCode() {
		return get("code");
	}

	public void setOpenid(java.lang.String openid) {
		set("openid", openid);
	}

	public java.lang.String getOpenid() {
		return get("openid");
	}

	public void setCreateTime(java.lang.String createTime) {
		set("createTime", createTime);
	}

	public java.lang.String getCreateTime() {
		return get("createTime");
	}

}

再看一下修改后的样子

package top.chmin.model.base;

import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.IBean;
import java.util.Date;

/**
 * Generated by JFinal, update by chmin, do not modify this file.
 */
@SuppressWarnings("serial")
public abstract class BaseLogin<M extends BaseLogin<M>> extends Model<M> implements IBean {

	public void setId(Integer id) {
		set("id", id);
	}

	public Integer getId() {
		return get("id");
	}

	public void setCode(String code) {
		set("code", code);
	}

	public String getCode() {
		return get("code");
	}

	public void setOpenid(String openid) {
		set("openid", openid);
	}

	public String getOpenid() {
		return get("openid");
	}

	public void setCreateTime(Date createTime) {
		set("createTime", createTime.getTime());
	}

	public Date getCreateTime() {
		return new Date(getInt("createTime"));
	}

}

差别反正很好看出来的

© 著作权归作者所有

共有 人打赏支持
chmin
粉丝 2
博文 9
码字总数 5714
作品 0
程序员
给JFinal添加 Sqlite 数据库支持

Sqlite 的单文件便携性、高性能在开发中方便性无与伦比,即使部署在中小型应用中也胜任有余。 在JFinal中添加对 Sqlite 的支持 Step by Step: 1、点击 http://www.xerial.org/maven/reposi...

子午
2012/07/31
0
4
jFinal+AngularJs未来javaEE开发的趋势——程序员的福音

最近有意无意、机缘巧合之下认识了两个新的WEB框架,其中一个是后端框架叫JFinal,看名字就让人觉得为之一振,最后的、最终的,没错它的意思就是“我是JavaEE的终极框架”,没有比这更好的啦...

moz1q1
2014/08/05
0
2
基于JFinal实现的权限管理系统 JFinalUIB

项目用到了众多的开源组件,还有一些是网络分享的学习示例代码片段,感谢他们!!! JFinal高级学习交流QQ群:309647612 代码库地址:http://git.oschina.net/dongcb678/JfinalUIB.git 项目背景...

littleant
2014/06/03
0
35
JAVA 极速WEB+ORM框架 - JFinal

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

JFinal
2012/03/18
0
496
JFinal针对ORACLE的timestamp字段解决办法

JFinal是个比较不错的的框架,但JFinal起源时使用mysql数据库,因此在对数据库支持方面还没有达到完美。 本人使用JFinal有一段时间的,由于项目的数据库普遍采用oracle,在使用oracle过程中遇...

真的农夫三拳
2013/06/23
0
6
JFinal 3.4 发布,将极速贯彻到 UI 层

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

JFinal
04/28
0
129
jfinal-ext3 最新版本来袭:基于 JFinal 3.x

更新内容: 基于jfinal3.x; 扩展Model; 重新定义Generator的Teamplate; MappingKit文件在在应用启动时自动加载,不需要在手动MappingKit.mapping(arp); 升级conf/jf-app-cfg.conf配置; ...

Jobsz
昨天
0
0
OSC上关于Jfinal的提问整理(一)

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

木川瓦兹
2013/04/23
0
21
使用Freesql简单地实现多条件查询

在实际应用中我们经常会遇到多条件查询的情景,以往的解决方案是在java中对各个参数值进行非空之类的判断,再进行sql及参数的拼凑。 其实还有更简单的解决方法的--用Freemarker。Freemarker可...

jse7en
2014/03/23
0
4
用JFinal有一段时间了,做了一些扩展

jfinal-ext-rich,放在github上(https://github.com/richxnh/jfinal-ext-rich),主要有以下功能: DisruptorPlugin 基于LMAX Disruptor的扩展,用于异步并发事件编程 用法: MyConfig中 Disr...

rich_xu
2013/05/03
0
11

没有更多内容

加载失败,请刷新页面

加载更多

下一页

防火墙实例

3、一个包过滤防火墙实例 环境:redhat9 加载了string time等模块 eth0 接外网──ppp0 eth1 接内网──192.168.0.0/24 #!/bin/sh modprobe ipt_MASQUERADE modprobe ip_conntrack_ftp modp...

李超小牛子
2分钟前
0
0
TensorFlow 作用域与操作符的受限范围

variable_scope 影响变量和操作符 name_scope 只影响操作符 with tf.name_scope(""),使用空字符串将作用域返回到顶层 tf.variable_scope("") 相当于添加一个空层 import tensorflow as tf...

阿豪boy
12分钟前
0
0
Java面试基础篇——第六篇:常见Map类的区别

常见的map类有: HashMap, ConcurrentHashMap (Jdk1.8) , LinkedHashMap, TreeMap, Hashtable。 其中我们最常用的莫过于HashMap, 和并发情况下使用的ConcurrentHashMap了,它们的主要区别就在...

developlee的潇洒人生
14分钟前
0
0
崛起于Springboot2.X之前端模版freemaker(23)

1、配置文件 spring: freemarker: allow-request-override: false cache: true check-template-location: true charset: UTF-8 content-type: text/html ......

木九天
30分钟前
1
0
spring-boot:run启动时,指定spring.profiles.active

Maven启动指定Profile通过-P,如mvn spring-boot:run -Ptest,但这是Maven的Profile。 如果要指定spring-boot的spring.profiles.active,则必须使用mvn spring-boot:run -Drun.profiles=test......

夜黑人模糊灬
32分钟前
0
0
大数据分析挖掘技术学习:Python文本分类

引言 文本分类作为自然语言处理任务之一,被广泛应用于解决各种商业领域的问题。文本分类的目的是将 文本/文档 自动地归类为一种或多种预定义的类别。常见的文本分类应用如下: • 理解社交媒...

加米谷大数据
37分钟前
0
0
istio-0.8 指标监控,prometheus,grafana

配置: https://istio.io/docs/tasks/telemetry/metrics-logs/ https://istio.io/docs/tasks/telemetry/tcp-metrics/ envoy拦截请求>上报mixer>对接prometheus>grafana 效果截图: promethe......

xiaomin0322
38分钟前
0
0
公众号推荐

阿里技术 书籍:《不止代码》

courtzjl
41分钟前
0
0
关于改进工作效率

1.给不同的业务线建立需求群,所有的数据需求都在群里面提。 2.对于特别难搞定的事情,到对应的技术哪去做,有问题随时沟通。 3.定期给工作总结形成方法论。 4.学习新的技术,尝试用新的方法...

Avner
48分钟前
0
0
关于thinkphp 框架开启路径重写,无法获取Authorization Header

今天遇到在thinkphp框架中获取不到header头里边的 Authorization ,后来在.htaccess里面加多一项解决,记录下: <IfModule mod_rewrite.c> Options +FollowSymlinks -Multiviews Rewrite......

殘留回憶
52分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部