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

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::