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

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

mysql8.0.43使用InnoDB Cluster配置主从复制

《mysql8.0.43使用InnoDBCluster配置主从复制》本文主要介绍了mysql8.0.43使用InnoDBCluster配置主从复制,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录1、配置Hosts解析(所有服务器都要执行)2、安装mysql shell(所有服务器都要执行)3、