Jfinal自动生成带setter和getter等常用方法的Model文件方案--注mysql数据库版

本文主要是介绍Jfinal自动生成带setter和getter等常用方法的Model文件方案--注mysql数据库版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Jfinal自动生成带setter和getter等常用方法的Model文件方案


Jfinal的数据操作方式是get与set,但是要记住表名与字段名。笔者自己写了个Model生成工具:
1.自动生成类似JavaBean的setter与getter,免除了需要记住数据库结构与不能通过“.”来快速设置的麻烦。
2.自动生成批量插入数据new Model(xxxxxx);
3.自动生成批量修改数据setData(xxxxx);
4.生成一个分页方法,返回类型为Map可直接renderJson(Map);方法内提供一个where查询参数对,不需要设置为null即可(详细看程序,不长一看就懂)。
使用方法;
第一步:设置webConfig数据库映射(注意!一定要设置主键,R.user.userId其实就是主键的String名字,是怎么实现的请看http://blog.csdn.net/a7178077/article/details/41981557 )。


第二步:随意找个controller

使用方法:tableName是数据库表名的String[],直接传入表名就可以,created(数据表名数组,所有Model存放的包名)。

生成效果







哦。。对了。。别忘记加入包。.
.
.
.
..

修复了工具包内没有so文件的Bug


.
.
..
.
.
.
下载不花费资源。如果下载不了的。请把如下4个文件的代码放到一个包里引用就可以。
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;import com.jfinal.core.JFinal;
import com.jfinal.plugin.activerecord.DbKit;
import com.tools.so;public class AutoCreatedEntityName {public AutoCreatedEntityName() {}/**** 生成表实体*/@SuppressWarnings("rawtypes")private String getEntity(String tableName, Map<String,String> property,String packagename) {String ln = "\r\n";StringBuffer sb = new StringBuffer();sb.append(ln+"\t/***\t\r\n\t*表名:"+tableName+"\t\r\n\t*/");sb.append(ln + "\tpublic static final class " + FileNameManager.CamelCase(tableName.split("_")) + "{" + ln);sb.append("\t\tpublic static final String " + "tableName" + "=\"" + tableName+ "\";" + ln);Iterator i=property.entrySet().iterator();while(i.hasNext()){Map.Entry e=(Map.Entry)i.next();sb.append("\t\tpublic static final String "+ FileNameManager.CamelCase(e.getKey().toString().split("_")) + "=\"" + e.getKey().toString()+ "\";" + ln);}sb.append("\t\tpublic static final String[] all={");Iterator is=property.entrySet().iterator();while(is.hasNext()){Map.Entry e=(Map.Entry)is.next();sb.append("\r\n\t\t\t");sb.append(FileNameManager.CamelCase(e.getKey().toString().split("_")));sb.append(",");}sb.deleteCharAt(sb.length()-1);;sb.append("\r\n\t\t};\r\n");sb.append("\t\tpublic static final Integer size=" + property.size() + ";"+ ln);sb.append("\t}" + ln);try {new AutoCreatedModelFile(FileNameManager.CamelCase(tableName.split("_")),property,packagename);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return sb.toString();}@SuppressWarnings({ "rawtypes", "unchecked" })private String CreatedRFile(Map<String,Map<String,String>> map,String packagename){String ln = "\r\n";StringBuffer sb = new StringBuffer();sb.append(ln +"package "+packagename+";"+ln+"/***"+ln+" * 表文件结构。"+ln+" * 对应表文件名。"+ln+" * 在Model中不需要记住对应的表名。"+ln+" * 只用此文件中对应的名称。"+ln+" * 同时避免了字段名修改,删除后程序结构破坏。"+ln+" * @author 石啸天"+ln+" *"+ln+" */"+ln+"public final class R {"+ln);Iterator i=map.entrySet().iterator();while(i.hasNext()){//只遍历一次,速度快Map.Entry e=(Map.Entry)i.next();sb.append(getEntity(e.getKey().toString(),(Map<String,String>)e.getValue(),packagename));}sb.append(ln + "}");return sb.toString();}/**** 读取数组中全部的数据表生成对应R文件* @param tableName 表名数组*/public void created(String[] tableName,String packagename) {DataBeasTypeToJavaType dtj=new DataBeasTypeToJavaType();so.p("开始生成实体R文件");Connection conn = null;PreparedStatement colunmsPs = null;Map<String,Map<String,String>> all = new HashMap<String,Map<String,String>>();try {conn = DbKit.getConfig().getConnection();for(int i=0;i<tableName.length;i++){colunmsPs = conn.prepareStatement("desc " + tableName[i]);//字段列表Map<String,String> colunms = new HashMap<String,String>();ResultSet columnsRs = colunmsPs.executeQuery();// 获取对应表中的字段while (columnsRs.next()) {
//				colunms.add(columnsRs.getString(1));
//				so.p("字段   "+columnsRs.getString(1)+" "+columnsRs.getString(2).split(")")[0]);colunms.put(columnsRs.getString(1),dtj.get(columnsRs.getString(2).split("\\(")[0]));}so.p("表为 " + FileNameManager.CamelCase(tableName[i].split("_")));all.put(tableName[i],colunms);colunmsPs.close();}conn.close();
//			so.p(CreatedRFile(all,packagename));so.p(packagename);String[] pn=packagename.split("\\.");
//			so.p(pn[0]);StringBuffer file=new StringBuffer();String dir=JFinal.me().getServletContext().getRealPath("/");file.append(dir.substring(0, dir.length()-7)+"src");for(String p:pn){file.append("\\");file.append(p);}so.p(file.toString());FileWriter fileWriter=new FileWriter(file.toString()+"/"+"R.java");fileWriter.write(CreatedRFile(all,packagename));fileWriter.flush();fileWriter.close();so.p("生成完成");
//			return getEntity(tableName, property);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();
//			return null;}}}

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;import com.jfinal.core.JFinal;
import com.tools.so;/**** 自动生成带setter与getter方法的Model* @author 石啸天**/
public class AutoCreatedModelFile {public AutoCreatedModelFile(String tableName, Map<String,String> property,String packageName) throws IOException{//-----------------------拼装文件夹名String[] pn=packageName.split("\\.");StringBuffer file=new StringBuffer();String dir=JFinal.me().getServletContext().getRealPath("/");file.append(dir.substring(0, dir.length()-7)+"src");for(String p:pn){file.append("/");file.append(p);}so.p(file.toString());//-------------------------------------//---------------------创建文件String f=createdFile(file.toString()+"/"+tableName+"/",FileNameManager.upFirstName(tableName)+".java");FileWriter fileWriter=new FileWriter(f);fileWriter.write(getText(tableName,property,packageName));fileWriter.flush();fileWriter.close();}/**** 创建文本内容* @param tableName* @param property* @return*/private String getText(String tableName, Map<String,String> property,String packageName){String classname=FileNameManager.upFirstName(tableName);//参数对组String para=entrypara(property);String ln = "\r\n";String tab="\t\t";StringBuffer sb = new StringBuffer();sb.append(ln +"package "+packageName+"."+tableName+";"+ln+"import com.jfinal.plugin.activerecord.Model;"+ln+"import com.jfinal.plugin.activerecord.TableMapping;"+ln+"import com.jfinal.plugin.activerecord.Db;"+ln+"import java.util.HashMap;"+ln+"import java.util.List;"+ln+"import java.util.Map;"+ln+inputPackage(property)+"/***"+ln+" * 自动生成的Model"+ln+" * @author 石啸天"+ln+" *"+ln+" */"+ln+"@SuppressWarnings(\"serial\")"+ln+"public class "+classname+" extends Model<"+classname+">{"+ln);//空构造与有参构造sb.append(classTextStringLine(new String[]{"//--------------setter和getter---------------",entryBean(classname,property),"//-------------------------------------------","/***","*数据库操作实体","*/","public static final "+classname+" dao=new "+classname+"();","/**","* 表名","*/","public static final String tableName=\""+tableName+"\";","/**","* 表主键","*/","public static final String primaryKey=TableMapping.me().getTable(dao.getClass()).getPrimaryKey();","/***","* 空构造","*/","public "+classname+"(){}","/***","* 有参构造","*/","public "+classname+"(",para,"){","setData("+ln+tab+entryparas(property)+ln+tab+");","}","/***","*数据批量设置","*/","public "+classname+" setData(" +ln+"\t\t"+para +"){",setString(property),"return this;","}","/***","* 按ID逆序查询全部数据","* 出现SQL注入漏洞","* @param pageNumber 页码","* @param pageSize 每页记录数","* @return","* @throws Exception ","*/","public Map<String,Object> paginate(int pageNumber, int pageSize,String para,Object value) throws Exception {",classTextStringLine(new String[]{tab+"Object[] o=new Object[]{};",tab+"StringBuffer sb=new StringBuffer();",tab+"sb.append(\"from \"+tableName);",tab+"if(value!=null&&value!=null&&value!=\"\")",tab+"{",tab+tab+"o= new Object[]{value};",tab+tab+"sb.append(\" where \"+para+\"=?\");",tab+"}",tab+"sb.append(\" order by \"+primaryKey+\" DESC\");",//----------------------",//数据封装",tab+"Long num=Db.queryLong(\"select count(1) \"+sb.toString(),o);",tab+"List<?> data = paginate(pageNumber, pageSize, \"select *\", sb.toString(),o).getList();",tab+"Map<String,Object> m=new HashMap<String, Object>();",tab+tab+"m.put(\"data\", data);",tab+tab+"m.put(\"num\", num);",tab+"return m;","}"})}));sb.append(ln + "}");return sb.toString();}/**** 创建文件* @param path* @param filename* @return* @throws IOException*/private String createdFile(String path,String filename) throws IOException{//判断文件夹是否存在File dir=new File(path);if(!dir.exists())dir.mkdirs();so.p(dir.getPath());//判断文件是否存在File f=new File(dir.getPath()+"/"+filename);if(!f.exists()){f.createNewFile();}else{f.delete();f.createNewFile();}return f.getPath();}/**** 文本格式化* @param s* @return*/private String classTextStringLine(String[] s){StringBuffer sb=new StringBuffer();for(String k:s){sb.append("\t\t" +k+"\r\n");}return sb.toString();}/**** 构建类似Bean* @param classname* @param property* @return*/@SuppressWarnings("rawtypes")private String entryBean(String classname,Map<String,String> property){StringBuffer sb=new StringBuffer();sb.append("\r\n");/*//构建引用Iterator i=property.entrySet().iterator();while(i.hasNext()){//只遍历一次,速度快Map.Entry e=(Map.Entry)i.next();sb.append("\t\tpublic "+e.getValue().toString()+" "+ FileNameManager.CamelCase(e.getKey().toString().split("_"))+";" + "\r\n");}*///构建setter和getterIterator k=property.entrySet().iterator();while(k.hasNext()){//只遍历一次,速度快Map.Entry e=(Map.Entry)k.next();String propetyname=FileNameManager.CamelCase(e.getKey().toString().split("_"));//settersb.append("\t\tpublic "+classname+" set"+ FileNameManager.upFirstNameNoLowerCase(propetyname)+"("+e.getValue()+" "+propetyname+"){" +"\r\n"+classTextStringLine(new String[]{
//							tab"\t\t" +"this." +propetyname+"="+propetyname+ ";","\t\t" +"set(\""+e.getKey()+"\","+propetyname+");","\t\t" +"return this;","\t\t" +"}"})+ "\r\n");sb.append("\t\tpublic "+e.getValue()+" get"+ FileNameManager.upFirstNameNoLowerCase(propetyname)+"(){" +"\r\n"+classTextStringLine(new String[]{"\t\t" +"return get(\""+e.getKey()+"\");","\t\t" +"}"})+ "\r\n");}return sb.toString();}/**** 构建传参的字符串* @param property* @return*/@SuppressWarnings("rawtypes")private String entrypara(Map<String,String> property){StringBuffer sb=new StringBuffer();//构建引用sb.append("\r\n");Iterator i=property.entrySet().iterator();while(i.hasNext()){//只遍历一次,速度快Map.Entry e=(Map.Entry)i.next();String propetyname=FileNameManager.CamelCase(e.getKey().toString().split("_"));sb.append("\t\t\t\t"+e.getValue().toString()+" "+ propetyname+","+"\r\n");}return sb.substring(4, sb.lastIndexOf(","));}@SuppressWarnings("rawtypes")private String entryparas(Map<String,String> property){StringBuffer sb=new StringBuffer();//构建引用sb.append("\r\n");Iterator i=property.entrySet().iterator();while(i.hasNext()){//只遍历一次,速度快Map.Entry e=(Map.Entry)i.next();String propetyname=FileNameManager.CamelCase(e.getKey().toString().split("_"));sb.append("\t\t\t\t"+propetyname+","+"\r\n");}return sb.substring(4, sb.lastIndexOf(","));}/**** 批量set* @param property* @return*/@SuppressWarnings("rawtypes")private String setString(Map<String,String> property){StringBuffer sb=new StringBuffer();//构建引用sb.append("\r\n");Iterator i=property.entrySet().iterator();while(i.hasNext()){//只遍历一次,速度快Map.Entry e=(Map.Entry)i.next();String propetyname=FileNameManager.CamelCase(e.getKey().toString().split("_"));sb.append("\t\t\t\tset(\""+e.getKey().toString()+"\","+ propetyname+");\r\n");}return sb.substring(4, sb.length()-2);}@SuppressWarnings("rawtypes")private String inputPackage(Map<String,String> property){StringBuffer sb=new StringBuffer();//构建引用sb.append("\r\n");Iterator i=property.entrySet().iterator();while(i.hasNext()){//只遍历一次,速度快Map.Entry e=(Map.Entry)i.next();String type=e.getValue().toString();String packages=null;	if(type.equals("BigInteger")){packages="import java.math.BigIntege;\r\nr";}else if(type.equals("BigDecimal")){packages="import java.math.BigDecimal;\r\n";}else if(type.equals("Date")){packages="import java.util.Date;\r\n";}else if(type.equals("Timestamp")){packages="import java.sql.Timestamp;\r\n";}else if(type.equals("Time")){packages="import java.sql.Time;\r\n";}else{ packages="";}sb.append(packages);}return sb.toString();}
}


修改这个文件可以兼容其他数据库
public class DataBeasTypeToJavaType {public String get(String type){if(type.equals("char")){return "String";}else if(type.equals("varchar")){return "String";}else if(type.equals("blob")){return "Byte[]";}else if(type.equals("text")){return "String";}else if(type.equals("int")){return "Integer";}else if(type.equals("tinyint")){return "Integer";}else if(type.equals("smallint")){return "Integer";}else if(type.equals("mediumint")){return "Integer";}else if(type.equals("bit")){return "Boolean";}else if(type.equals("bigint")){return "BigInteger";}else if(type.equals("decimal")){return "BigDecimal";}else if(type.equals("date")){return "Date";}else if(type.equals("datetime")){return "Timestamp";}else if(type.equals("timestamp")){return "Timestamp";}else if(type.equals("time")){return "Time";}else if(type.equals("year")){return "Date";}else if(type.equals("float")){return "Float";}else if(type.equals("double")){return "Double";}else if(type.equals("integer")){return "Long";}else{return null;}}
}

public class FileNameManager {/**** * 首字母大写处理* 注意:先所有字符小写化* */public static String upFirstName(String name){String s=null;if(name!=null){s=name.toLowerCase();String first=""+s.charAt(0);first=first.toUpperCase();s=first+s.substring(1, s.length());}return s;}/**** * 首字母大写处理* */public static String upFirstNameNoLowerCase(String name){String s=null;if(name!=null){s=name;String first=""+s.charAt(0);first=first.toUpperCase();s=first+s.substring(1, s.length());}return s;}/**** * 字符数组驼峰命名法处理* */public static String CamelCase(String n[]){String s=null;if(n!=null&&n.length>0){StringBuffer b=new StringBuffer();b.append(n[0].toLowerCase());for(int i=1;i<n.length;i++){b.append(upFirstName(n[i]));}s=b.toString();}return s;}/**** * 字符数组首字母大写处理* */public static String upFirstName(String n[]){String s=null;if(n!=null&&n.length>0){StringBuffer b=new StringBuffer();for(int i=0;i<n.length;i++){b.append(upFirstName(n[i]));}s=b.toString();}return s;}
}

修复了工具包内没有so文件的Bug,下载包点击这里!!

这篇关于Jfinal自动生成带setter和getter等常用方法的Model文件方案--注mysql数据库版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/400573

相关文章

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Apache Tomcat服务器版本号隐藏的几种方法

《ApacheTomcat服务器版本号隐藏的几种方法》本文主要介绍了ApacheTomcat服务器版本号隐藏的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1. 隐藏HTTP响应头中的Server信息编辑 server.XML 文件2. 修China编程改错误

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur