不知道大家有没有同感,日常工作中,有好多重复的工作,大多数都是在复制粘贴,只是操作的对象实体不同,每个模块最后变成了只是修改一下其中的属性,剩下的增删改查完全都是一样的,但就是修改这些属性简直是烦的要死,一个类里面要是有20个属性那简直要疯了。所以本人想到一个投机取巧的办法,想用代码去生成代码,目前处于初级阶段,希望以后各路大神一起研究,完善出一款开源的代码生成器。
以spring+springMVC+mybatis的项目为例子。
使用方法:把要操作的实体类属性部分,复制到一个txt文件中,如下我放在桌面的read.txt中
/**
*
*/
private static final long serialVersionUID = 1L;
//主键ID
private Integer discountRuleID;
//金额范围最小值
private BigDecimal minMoney;
//金额范围最大值
private BigDecimal maxMoney;
//折扣
private Float discount;
//创建人
private Integer creator;
//创建时间
private Date createTime;
//修改人
private Integer modifier;
//修改时间
private Date modifyTime;
//状态(0 无效 1有效)
private Short status;
//描述
private String remark;
代码生成器类:
package com.test.生成代码;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
/**
* @Description:
* @author 周振伟
* @mail
* @version 1.0
* @copyright
* @date 2016-8-26 下午03:24:46
*/
public class CodeMachine {
public static void main(String[] args) {
String filePath ="C:\\Users\\dell\\Desktop\\read.txt";
String res =getColumnstr(filePath); //获取属性名称以逗号隔开的字符串
System.out.println(sqlStr_insert(res,"pss_settlement_consumeraccountauditinfo")); //获取插入sql
System.out.println(sqlStr_update(res,"a")); //获取更新sql
//System.out.println(getPage_list(res, "res")); //获取列表页面的代码
//System.out.println(getPage_modify(res, "t")); //获取修改页面的代码
//System.out.println(getRequestHandlerParam(filePath)); //通过request获得页面的属性
//System.out.println(setObjParam(res, "marketIncome")); //获取设置对象参数代码
}
/**
* 把以逗号分隔的字段名称,转换为mybatis插入语句格式
* @param str
* @return
*/
public static String sqlStr_insert(String str,String tableName){
String strs[] =str.split(",");
String resultStr ="";
for(String s : strs){
resultStr=resultStr+"#{"+s+"},";
}
resultStr ="INSERT INTO " +tableName+" ( "+str.substring(0,str.length()-1)+" )\n"+"VALUES (\n"+resultStr.substring(0,resultStr.length()-1)+"\n)";
return resultStr;
}
/**
* 把以逗号分隔的字段名称,转换为mybatis更新语句格式
*/
public static String sqlStr_update(String columnStr,String otherName){
String strs[] = columnStr.split(",");
String resultStr = "";
for(String s : strs){
resultStr=resultStr +otherName+"."+s+" = " +"#{"+s+"},\n";
}
return resultStr;
}
/**
* 把类的属性拼装成以逗号分隔的字符串
* @param filePath
* @return
*/
public static String getColumnstr(String filePath){
String res ="";
try {
String encoding="GBK";
File file=new File(filePath);
if(file.isFile() && file.exists()){ //判断文件是否存在
InputStreamReader read = new InputStreamReader(
new FileInputStream(file),encoding);//考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
while((lineTxt = bufferedReader.readLine()) != null){
if(lineTxt.contains("private")){
if(lineTxt.contains("//")){
lineTxt=lineTxt.substring(0,lineTxt.indexOf("//"));
}
String strs []=lineTxt.trim().split("\\s+");
res=res+strs[2];
}
}
read.close();
}else{
System.out.println("找不到指定的文件");
}
} catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}
res =res.replace(";", ",");
return res;
}
/**
* controller中获取页面属性
* @param filePath
* @return
*/
public static String getRequestHandlerParam(String filePath){
String res ="";
try {
String encoding="GBK";
File file=new File(filePath);
if(file.isFile() && file.exists()){ //判断文件是否存在
InputStreamReader read = new InputStreamReader(
new FileInputStream(file),encoding);//考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
while((lineTxt = bufferedReader.readLine()) != null){
if(lineTxt.contains("private")){
if(lineTxt.contains("//")){
lineTxt=lineTxt.substring(0,lineTxt.indexOf("//"));
}
String strs []=lineTxt.trim().split("\\s+");
res=res+strs[1]+" "+strs[2].substring(0,strs[2].length()-1)+" = RequestHandler.get"+strs[1]+"(request,\""+strs[2].substring(0,strs[2].length()-1)+"\");\n";
}
}
read.close();
}else{
System.out.println("找不到指定的文件");
}
} catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}
return res;
}
/**
* 生成list页面代码
* @return
*/
public static String getPage_list(String columnStr,String objName){
String strs[] =columnStr.split(",");
String resultStr ="";
for(String s : strs){
resultStr=resultStr+"<td style=\"width:10px;\" align=\"center\">${"+objName+"."+s+"}</td>\n";
}
return resultStr;
}
/**
* 生成modify页面代码
* @return
*/
public static String getPage_modify(String columnStr,String objName){
String strs[] =columnStr.split(",");
String resultStr ="";
for(String s : strs){
resultStr=resultStr+"<input type=\"text\" id=\""+s+"\" name=\""+s+"\" value=\"${"+objName+"."+s+"}\" />\n";
}
return resultStr;
}
/**
* 生成设置对象参数代码
* @return
*/
public static String setObjParam(String columnStr,String objName){
String strs[] =columnStr.split(",");
String resultStr ="";
for(String s : strs){
resultStr=resultStr+objName+".set"+toUpperCaseFirstOne(s)+"("+s+");\n";
}
return resultStr;
}
//首字母转小写
public static String toLowerCaseFirstOne(String s)
{
if(Character.isLowerCase(s.charAt(0)))
return s;
else
return (new StringBuilder()).append(Character.toLowerCase(s.charAt(0))).append(s.substring(1)).toString();
}
//首字母转大写
public static String toUpperCaseFirstOne(String s)
{
if(Character.isUpperCase(s.charAt(0)))
return s;
else
return (new StringBuilder()).append(Character.toUpperCase(s.charAt(0))).append(s.substring(1)).toString();
}
}
现阶段还比较简陋,生成的代码直接去控制台复制出来就好,以后会优化,不过这样还真的提升了不少效率,希望对你们也有所帮助!