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

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间