代码生成器

笔者由于觉得很多东西都用工具可以做到很便利 公司由于换成Springboot和用Springdata JPA开发 所以本人觉得什么都要手写效率不高(觉得超级烦好不好)故使用freemaker生成了一些通用的代码

 

这里生成用到了两种方式 一种用模板 一种直接在内存生成(字符串拼接) 

这里用maven来构建项目 后面会等基本功能完善好会扩展到项目里面 这里只能当初单独的生成工程来使用了

https://gitee.com/TangHuihuang/process  源码放在码云

大概思路在下面

1. jdbc连接数据库 循环查找出表


2. 取得表的列 加入colnames


3. 取得表的列名类型


4. 在内存生成bean java文件和Vo的java文件


5.生成service和dao和controller 用模板生成


6.编译java文件 获得class对象 

 

 

 

7.生成页面 完成

 

 

 

 

先上效果图

话不多话 直接撸码

工程结构

annotation包:

首先是自定义注解

package annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)  
@Target(ElementType.FIELD)//
public @interface Caption {
	
	String value() default "";
}

这是用来生成字段对应的文字跟数据库的字段注释对应 后面用来生成jsp页面的label标签的值

javaclass包下 

:自定义classLoader 由于我要寻找自己的路径的class 所以继承了ClassLoader 来装饰 这里参考某个博客的写法 但是当时没有记下来~

package javaclass;

import java.io.IOException;

import javax.tools.*;


public class ClassFileManager extends ForwardingJavaFileManager {

    private JavaClassFileObject classFileObject;
    /**
     * Creates a new instance of ForwardingJavaFileManager.
     *
     * @param fileManager delegate to this file manager
     */
    public ClassFileManager(JavaFileManager fileManager) {
        super(fileManager);
    }

    /**
     * Gets a JavaFileObject file object for output
     * representing the specified class of the specified kind in the given location.
     */
    @Override
    public JavaFileObject getJavaFileForOutput(Location location, String className, JavaFileObject.Kind kind, 
    FileObject sibling) throws IOException {
        classFileObject = new JavaClassFileObject(className, kind);
        return classFileObject;
    }

    @Override
    //获得一个定制ClassLoader,返回我们保存在内存的类
    public ClassLoader getClassLoader(Location location) {
        return new ClassLoader() {
            @Override
            protected Class<?> findClass(String name) throws ClassNotFoundException {
                byte[] classBytes = classFileObject.getClassBytes();
                return super.defineClass(name, classBytes, 0, classBytes.length);
            }
        };
    }
}
package javaclass;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
import java.nio.file.WatchEvent.Kind;
import javax.tools.*;

public class JavaClassFileObject extends SimpleJavaFileObject {
    //用于存储class字节
    ByteArrayOutputStream outputStream;

    public JavaClassFileObject(String className, Kind kind) {
        super(URI.create("string:///" + className.replace('.', '/') + kind.extension), kind);
        outputStream = new ByteArrayOutputStream();
    }

    @Override
    public OutputStream openOutputStream() throws IOException {
        return outputStream;
    }

    public byte[] getClassBytes() {
        return outputStream.toByteArray();
    }
}
package javaclass;
import java.net.URI;

import javax.tools.*;

/**
 * A file object used to represent source coming from a string.
*/
public class JavaSourceFromString extends SimpleJavaFileObject {
	/**
	 * The source code of this "file".
	 */
	final String code;
	/**
	 * Constructs a new JavaSourceFromString.
	 * @param name the name of the compilation unit represented by this file object
	 * @param code the source code for the compilation unit represented by this file object
	 */
	public JavaSourceFromString(String name, String code) {
	    super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);
	    this.code = code;
	}
	
	@Override
	public CharSequence getCharContent(boolean ignoreEncodingErrors) {
	    return code;
	}
}

 

package javaclass;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class MyClassLoader extends ClassLoader {
	
	  private String mLibPath;
	  
	  public MyClassLoader(String path) {
	        // TODO Auto-generated constructor stub
	        mLibPath = path;
	    }
	  
	  @Override
	    protected Class<?> findClass(String name) throws ClassNotFoundException {
	        // TODO Auto-generated method stub

	        String fileName = getFileName(name);

	        File file = new File(mLibPath,fileName);

	        try {
	            FileInputStream is = new FileInputStream(file);

	            ByteArrayOutputStream bos = new ByteArrayOutputStream();
	            int len = 0;
	            try {
	                while ((len = is.read()) != -1) {
	                    bos.write(len);
	                }
	            } catch (IOException e) {
	                e.printStackTrace();
	            }

	            byte[] data = bos.toByteArray();
	            is.close();
	            bos.close();

	            return defineClass(name,data,0,data.length);

	        } catch (IOException e) {
	            // TODO Auto-generated catch block
	            e.printStackTrace();
	        }

	        return super.findClass(name);
	    }

	    //获取要加载 的class文件名
	    private String getFileName(String name) {
	        // TODO Auto-generated method stub
	        int index = name.lastIndexOf('.');
	        
	        if(index == -1){ 
	        	System.out.println(name);
	            return name+".class";
	        }else{
	        	System.out.println(name);
	            return name.substring(index+1)+".class";
	        }
	    }

}

 

 

说下util包:用到的

jdbc数据库链接

package util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DB {
	
	public static String  path = "";   
    public static String url = "";  
    public static String driver = "";  
    public static String user = "";  
    public static String password = "";  
    static{
    	 path = PathUitl.getFilePath("all.properties");
    	 if(path==null){
    		 throw new NullPointerException("获取配置文件路径错误!找不到配置");
    	 }
    	 String jdbcPropertiesPath = PathUitl.getClasspath()+PropertyUtil.getPro(path, "jdbc.url");
    	
    	 driver = PropertyUtil.getPro(jdbcPropertiesPath, "jdbc.classname");
    	 url = PropertyUtil.getPro(jdbcPropertiesPath, "jdbc.url");
    	 user =  PropertyUtil.getPro(jdbcPropertiesPath, "jdbc.username");
    	 password = PropertyUtil.getPro(jdbcPropertiesPath, "jdbc.password");
    }
    	

	public static PreparedStatement getPStmt(Connection connection,String sql) throws SQLException{
		/*Statement st=connection.createStatement();
		ResultSet rs=st.executeQuery(sql);*/
		PreparedStatement pst=connection.prepareStatement(sql);
	//	pst.execute();
		return pst;
	}

	public static void close(PreparedStatement pstmt) throws SQLException {
		if(pstmt!=null){
			pstmt.close();
		}
		
	}

	public static Connection getConn() throws SQLException {
		Connection conn=DriverManager.getConnection(url, user, password);
		return conn;
	}

	public static void close(Connection conn) {
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	
}

 

package util;

import java.io.File;

public class FileUtil {

	public static boolean checkDir(File dir){
		  return dir.exists()&&dir.isDirectory();
	}
}
package util;

import java.io.File;

/**
 * 用separator()方法代替路径中的”/”或”\” 。
 * 用pathSeptarator()方法代替路径中的 ” : ” 或 ” ;” 。
 * @author kaizen
 *
 */
public class PathUitl {

	 	/**
	   * 
	   * @return 获取绝对路径
	   * 然后在项目路径后面拼接"properties/sysConfig.properties"; 
	   */
	 public static String getClasspath()
	  {
	    String path = (String.valueOf(Thread.currentThread().getContextClassLoader().getResource(""))).replaceAll("file:/", "").replaceAll("%20", " ").trim();
	    if (path.indexOf(":") != 1) {
	      path = File.separator + path;
	    }
	    return path;
	  }
	 
	  public static String getPorjectPath()
	  {
	    String nowpath = "";
	    nowpath = System.getProperty("user.dir") + "/";
	    return nowpath;
	  }
	  
	  public static String getFilePath(String fileName)
	  {
	    String nowpath = "";
	    nowpath =ClassLoader.getSystemResource(fileName).toString().replaceAll("file:/", "");
	    return nowpath;
	  }
	  
	 
	  public static void main(String[] args) {
			System.out.println( PathUitl.getFilePath("jdbc.properties"));//D:/eclipse_workspace/test/target/classes/jdbc.properties
	    	//String jdbcPropertiesPath = PathUitl.getClasspath()+PropertyUtil.getPro(path, "jdbc.url");

		}
	  
}

 

package util;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;

public class PropertyUtil {
	private static Properties prop;  
    
    public static void load(String path){  
        //这里的path是项目文件的绝对路径  
        //先获取项目绝对路径:Thread.currentThread().getContextClassLoader().getResource("").getPath();  
        //然后在项目路径后面拼接"properties/sysConfig.properties";  
        prop= new Properties();// 属性集合对象     
        FileInputStream fis = null;    
        try {    
            System.out.println(path);  
            fis = new FileInputStream(path);  
            prop.load(fis);  
        } catch (FileNotFoundException e) {    
            e.printStackTrace();    
        } catch (IOException e) {    
            e.printStackTrace();    
        }finally{
        	try {
        		if(null!=fis){
        			fis.close();
        		}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}// 关闭流    
        }   
    }  
      
    //参数为要修改的文件路径  以及要修改的属性名和属性值    
    public static Boolean updatePro(String path,String key,String value){  
        if(prop==null){  
            load(path);  
            System.out.println("修改前重新加载一遍");  
        }  
        System.out.println("获取添加或修改前的属性值:"+key+"=" + prop.getProperty(key));  
        prop.setProperty(key, value);    
        FileOutputStream fos = null;
        // 文件输出流     
        try {    
        	fos = new FileOutputStream(path);     
            // 将Properties集合保存到流中     
            prop.store(fos, "Copyright (c) Boxcode Studio");     
            
        } catch (FileNotFoundException e) {    
            // TODO Auto-generated catch block    
            e.printStackTrace();    
            return false;    
        } catch (IOException e) {    
            // TODO Auto-generated catch block    
            e.printStackTrace();    
            return false;    
        }finally{
        	try {
        		if(null!=fos){
        			fos.close();
        		}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}// 关闭流     
        }   
        System.out.println("获取添加或修改后的属性值:"+key+"=" + prop.getProperty(key));  
        return true;    
    }    
      
  //参数为要修改的文件路径  以及要修改的属性名和属性值    
    public static String getPro(String path,String key){    
        if(prop==null){  
            load(path);  
            System.out.println("重新加载一遍");  
        }  
        FileInputStream fis = null;    
        try {    
            fis = new FileInputStream(path);    
            prop.load(fis);// 将属性文件流装载到Properties对象中     
        } catch (FileNotFoundException e) {    
            e.printStackTrace();    
        } catch (IOException e) {    
            e.printStackTrace();    
        }finally{
        	try {
        		if(null!=fis){
        			fis.close();
        		}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}// 关闭流    
        }      
        System.out.println("查询到的"+key+"的值:"+prop.getProperty(key));  
        return prop.getProperty(key);    
    }    
    
    public static void main(String[] args) {
    	String path = PathUitl.getFilePath("all.properties");
    	String vaule = PropertyUtil.getPro(path, "jdbc.url");
    	System.out.println(vaule);// /jdbc.properties
	}
}
package util;

public class StringUtil {

	
	 /**
     * 功能:将输入字符串的首字母改成大写
     * 
     * @param str
     * @return
     */
    public static String initcap(String str) {
        char[] ch = str.toCharArray();
        if (ch[0] >= 'a' && ch[0] <= 'z') {
            ch[0] = (char) (ch[0] - 32);
        }
        return new String(ch);
    }
    /**
     * 功能:将输入字符串的首字母改成小写
     * 
     * @param str
     * @return
     */
    public static String initLowerCase(String str) {
        char[] ch = str.toCharArray();
        if (ch[0] >= 'A' && ch[0] <= 'Z') {
            ch[0] = (char) (ch[0] + 32);
        }
        return new String(ch);
    }
    /**
     *  字符转换成大写的字符String
     * @param ch
     * @return
     */
    public static String initChar(char ch){
    	 if (ch >= 'a' && ch <= 'z') {
             ch = (char) (ch- 32);
         }
         return String.valueOf(ch);
    }
    
    public static String initCapAndUnderline(String str){
    	str = str.substring(0, 1).toUpperCase()+str.substring(1);
    	
    	int i = str.indexOf("_");
    	while(i!=(-1)){
    			if(str.length()-1>i){
    				str = str.substring(0,i)+initChar(str.charAt(i+1))+str.substring(i+2);
    			}else{
    				str = str.substring(0,i);
    			}
    			i = str.indexOf("_");
    	}
    	
    	return str;
    	
    }
    
    public static String initUnderline(String str){
    	int i = str.indexOf("_");
    	while(i!=(-1)){
    			if(str.length()-1>i){
    				str = str.substring(0,i)+initChar(str.charAt(i+1))+str.substring(i+2);
    			}else{
    				str = str.substring(0,i);
    			}
    			i = str.indexOf("_");
    	}
    	
    	return str;
    	
    }
}


test包下:

 

生成类在这里

 

package test;

import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLClassLoader;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import javax.tools.JavaCompiler;
import javax.tools.StandardJavaFileManager;
import javax.tools.ToolProvider;

import javaclass.MyClassLoader;
import util.DB;
import util.FileUtil;
import util.PathUitl;
import util.PropertyUtil;
import util.StringUtil;

public class ReverseEntity2 {
	

    private static String packageOutPath;// 指定实体生成所在包的路径
    private static String authorName;// 作者名字
    private static String tablename;// 表名
    private static String databasename;// 数据库名
    private List<String> tablenames;// 拿到对应数据库中所有的实体类(实体类需要与其他表明做区分)
    private List<String> colnames; // 列名集合
    private List<String> colTypes; // 列名类型集合
    private List<String> colAnnotation;//注释
    
    public static final String ENTER = "\n";//换行

    
    
    private boolean f_util = false; // 是否需要导入包java.util.*
    private boolean f_sql = false; // 是否需要导入包java.sql.*
    
	public static String  path = "";   //存放配置文件的路径的配置文件
	private static String jdbcPropertiesPath = "";//获取jdbc的配置文件路径

    static{
    	 path = PathUitl.getFilePath("all.properties");
    	 if(path==null){
    		 throw new NullPointerException("获取配置文件路径错误!找不到配置");
    	 }
    	 jdbcPropertiesPath = PathUitl.getClasspath()+PropertyUtil.getPro(path, "jdbc.url");
    	 databasename = PropertyUtil.getPro(jdbcPropertiesPath, "databasename");
    	 packageOutPath = PropertyUtil.getPro(jdbcPropertiesPath, "packageOutPath");
    	 tablename =  PropertyUtil.getPro(jdbcPropertiesPath, "tablename");
    	 authorName = PropertyUtil.getPro(jdbcPropertiesPath, "authorName");
    }
    	 
    	 
    
    // 创建多个实体类
    private void genEntity(List<String> tablenames, Connection conn) {
        // 使用第归生成文件
        for (String tablename : tablenames) {
            this.genEntity(tablename, conn);
        }
    }

    // 创建单个实体类
    private void genEntity(String tablename, Connection conn) {
        String sql = "select * from " + tablename;
        
        DatabaseMetaData dbmd = null;  
        try {
	         dbmd = conn.getMetaData();
	         ResultSet resultSet = dbmd.getTables(null, "%", tablename, new String[] { "TABLE" });  
	        
	         while (resultSet.next()) {  
	        	 
	        	 String table=resultSet.getString("TABLE_NAME");  
                 System.out.println(table);
                 
                 if(table.equals(tablename))
                 {
                	 ResultSet rs = conn.getMetaData().getColumns(null,  conn.getMetaData().getUserName(), tablename, "%");  
                	 if(rs!=null)
                	 {
                		 colnames = new ArrayList<String>();
         	            
                		 colTypes = new ArrayList<String>();
         	            
                		 colAnnotation = new ArrayList<String>();
                		 
                		 while(rs.next())
                		 {  
                			 colnames.add(rs.getString("COLUMN_NAME"));
                			 colTypes.add(rs.getString("TYPE_NAME"));
                			 if(null!=rs.getString("REMARKS")){
                				 colAnnotation.add(rs.getString("REMARKS"));
                			 }else{
                				 colAnnotation.add(rs.getString(" "));
                			 }
                		 }
                	 }
                	 
                 }
	        	 
	         }
           
            if (colTypes.contains("datetime")) {
                f_util = true;
            }
            if (colTypes.contains("image")
                    || colTypes.contains("text")) {
                f_sql = true;
            }
            System.out.println(colnames);
            System.out.println(colTypes);
        } catch (SQLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } finally {
        }
        
        // 在内存中生成代码
        String entityContent = parse(tablename);
        String voContent = parseVo(tablename);

        // 写入到文件中
        try {
           // File directory = new File("");
           // String outputPath = directory.getAbsolutePath() + "/src/"
                   // + this.packageOutPath.replace(".",File.separator) + StringUtil.initCapAndUnderline(tablename) +File.separator;
            
            String entityOutputPath = PathUitl.getClasspath()
                    /*+ this.packageOutPath.replace(".",File.separator) +File.separator*/
                    +  StringUtil.initCapAndUnderline(tablename) +File.separator;
            
            // 检测路径是否存在,不存在就创建路径
            File entityPath = new File(entityOutputPath);
            
            if(!FileUtil.checkDir(entityPath)){
            	entityPath.mkdirs();
            }
            // 创建文件
            String entityOutputPathJava = entityOutputPath+StringUtil.initCapAndUnderline(tablename) + ".java";
            String voOutputPathJava = entityOutputPath+StringUtil.initCapAndUnderline(tablename) + "Vo.java";
             System.out.println(entityOutputPathJava);
            File entityFile = new File(entityOutputPathJava);
            File voFile = new File(voOutputPathJava);

            
            
            if (!entityFile.exists()) {
            	entityFile.createNewFile();
            }
            if (!voFile.exists()) {
            	voFile.createNewFile();
            }
            
            // 写出到硬盘
            FileWriter fw = new FileWriter(entityFile);
            PrintWriter pw = new PrintWriter(fw);
            
            FileWriter vofw = new FileWriter(voFile);
            PrintWriter vopw = new PrintWriter(vofw);

         
            pw.println(entityContent);
            pw.flush();
            pw.close();
            vopw.println(voContent);
            vopw.flush();
            vopw.close();
            
            //编译
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
            StandardJavaFileManager fileManager = compiler.getStandardFileManager(null,null, null);
            Iterable fileObject = fileManager.getJavaFileObjects(entityOutputPathJava);
            JavaCompiler.CompilationTask task = compiler.getTask(
                    null, fileManager, null, null, null, fileObject);
            task.call();
            fileManager.close();
            
            //获得实例
            MyClassLoader myClassLoader = new MyClassLoader(entityOutputPath);
            //URLClassLoader classLoader = new URLClassLoader(new URL[]{new URL("file:" +  PathUitl.getClasspath()+ this.packageOutPath.replace(".",File.separator) +File.separator+ initCapAndUnderline(tablename) +File.separator)});
           //这里与Bean  packger的路径一样
            Class beanClass = myClassLoader.loadClass(this.packageOutPath+".bean."+StringUtil.initCapAndUnderline(tablename));
            Object obj = beanClass.newInstance();
            
            
          /*  SimpleJavaFileObject fileObject = new JavaSourceFromString(initCapAndUnderline(tablename),entityContent);
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
            JavaFileManager fileManager = new ClassFileManager(compiler.getStandardFileManager(null, null, null));
            JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, null, null, null, Arrays.asList(fileObject));
            task.call();
            
            //获得ClassLoader,加载class文件
            ClassLoader classLoader = fileManager.getClassLoader(null);
            Class beanClass = classLoader.loadClass(initCapAndUnderline(tablename));*/
            
            //生成dao,Service,vo
            Process.processDao(this.packageOutPath,StringUtil.initCapAndUnderline(tablename),entityOutputPath);
            Process.processService(this.packageOutPath,StringUtil.initCapAndUnderline(tablename),entityOutputPath);
            Process.processMService(this.packageOutPath,StringUtil.initCapAndUnderline(tablename), entityOutputPath, obj);
            Process.processServiceImpl(this.packageOutPath,StringUtil.initCapAndUnderline(tablename),entityOutputPath);
            Process.processController(this.packageOutPath,StringUtil.initCapAndUnderline(tablename),entityOutputPath);
            Process.processMController(this.packageOutPath,StringUtil.initCapAndUnderline(tablename),entityOutputPath);

            
            //生成jsp页面
            Process.processJsp(obj,entityOutputPath);
            beanClass=null;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private String parseVo(String tablename2) {
    	 StringBuffer sb = new StringBuffer();
         sb.append("package " + this.packageOutPath + ".vo;\r\n");
         // 判断是否导入工具包
         if (f_util) {
             sb.append("import java.util.Date;\r\n");
         }
         if (f_sql) {
             sb.append("import java.sql.*;\r\n");
         }
         sb.append("import annotation.*;\r\n");
        
         sb.append("\r\n");
         // 注释部分
         sb.append("   /**\r\n");
         sb.append("    * " + tablename + " VO类\r\n");
         sb.append("    * " + new Date() + " " + this.authorName + "\r\n");
         sb.append("    */ \r\n");
         // 实体部分 class
         sb.append("\r\n\r\npublic class " + StringUtil.initCapAndUnderline(tablename) + "Vo {\r\n");
         sb.append(ENTER);
         processAllAttrsWithOutAnno(sb);// 属性
         processAllMethod(sb);// get set方法
         sb.append("}\r\n");

         
         return sb.toString();
	}

	private void getAllEntityTable(Connection conn, List<String> tablenames) {
        ResultSet rs = null;
        try {
            DatabaseMetaData dmd = (DatabaseMetaData) conn.getMetaData();
            /*
             * TABLE_CAT String => 表类别(可为 null) 
             * TABLE_SCHEM String => 表模式(可为null) 
             * TABLE_NAME String => 表名称 
             * TABLE_TYPE String => 表类型
             */
            rs = dmd.getTables(null, null, "%", null);
            while (rs.next()) {
                tablenames.add(rs.getString("TABLE_NAME"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 
     * @param tablename
     * @return
     */
    private String parse(String tablename) {
        StringBuffer sb = new StringBuffer();
        sb.append("package " + this.packageOutPath + ".bean;\r\n");
        // 判断是否导入工具包
        if (f_util) {
            sb.append("import java.util.Date;\r\n");
        }
        if (f_sql) {
            sb.append("import java.sql.*;\r\n");
        }
        sb.append("import annotation.*;\r\n");
        sb.append("import javax.persistence.Column;\r\n");
        sb.append("import javax.persistence.Entity;\r\n");
        sb.append("import javax.persistence.GeneratedValue;\r\n");
        sb.append("import javax.persistence.Id;\r\n");
        sb.append("import javax.persistence.Table;\r\n");
       
        sb.append("\r\n");
        // 注释部分
        sb.append("   /**\r\n");
        sb.append("    * " + tablename + " 实体类\r\n");
        sb.append("    * " + new Date() + " " + this.authorName + "\r\n");
        sb.append("    */ \r\n");
        // 实体部分 class
        sb.append("\r\n@Table(name = \""+tablename+"\")\r\n");
        sb.append("\r\n\r\npublic class " + StringUtil.initCapAndUnderline(tablename) + "{\r\n");
        sb.append(ENTER);
        processAllAttrs(sb);// 属性
        processAllMethod(sb);// get set方法
        sb.append("}\r\n");

        
        return sb.toString();
    }

    /**
     * 功能:生成所有属性(含有注解)
     * 
     * @param sb
     */
    private void processAllAttrs(StringBuffer sb) {

        for (int i = 0; i < colnames.size(); i++) {
        	if(null!=colAnnotation.get(i)&&!colAnnotation.get(i).equals("")){
        		
        		sb.append("\t@Caption(\""+colAnnotation.get(i)+"\")\n");
        	}
        	if(colnames.get(i).equals("seq_id")){
    			sb.append("\t@Id\n");
    			sb.append("\t@GeneratedValue\n");
    			sb.append("\t@Column(name = \""+colnames.get(i)+"\",unique=true,nullable=false)\n");
    		}else{
    			sb.append("\t@Column(name = \""+colnames.get(i)+"\")\n");
    		}
            sb.append("\tprivate " + sqlType2JavaType(colTypes.get(i)) + " "
                    + StringUtil.initUnderline(colnames.get(i)) + ";\r\n");
            sb.append("\n");
        }
        sb.append("\n");

    }
    
    /**
     * 功能:生成所有属性(无注解)
     * 
     * @param sb
     */
    private void processAllAttrsWithOutAnno(StringBuffer sb) {

        for (int i = 0; i < colnames.size(); i++) {
        	if(null!=colAnnotation.get(i)&&!colAnnotation.get(i).equals("")){
        		
        		sb.append("\t@Caption(\""+colAnnotation.get(i)+"\")\n");
        	}
            sb.append("\tprivate " + sqlType2JavaType(colTypes.get(i)) + " "
                    + StringUtil.initUnderline(colnames.get(i)) + ";\r\n");
            sb.append("\n");
        }
        sb.append("\n");

    }

    /**
     * 功能:生成所有方法
     * 
     * @param sb
     */
    private void processAllMethod(StringBuffer sb) {

        for (int i = 0; i < colnames.size(); i++) {
            sb.append("\tpublic void set" + StringUtil.initCapAndUnderline(colnames.get(i)) + "("
                    + sqlType2JavaType(colTypes.get(i)) + " " + StringUtil.initUnderline(colnames.get(i))
                    + "){\r\n");
            sb.append("\t\tthis." + StringUtil.initUnderline(colnames.get(i)) + "=" + StringUtil.initUnderline(colnames.get(i))
                    + ";\r\n");
            sb.append("\t}\r\n");
            sb.append("\tpublic " + sqlType2JavaType(colTypes.get(i)) + " get"
                    + StringUtil.initCapAndUnderline(colnames.get(i)) + "(){\r\n");
            sb.append("\t\treturn " + StringUtil.initUnderline(colnames.get(i)) + ";\r\n");
            sb.append("\t}\r\n");
        }

    }

   
    
    

    /**
     * 功能:获得列的数据类型
     * 
     * @param sqlType
     * @return
     */
    private String sqlType2JavaType(String sqlType) {

        if (sqlType.equalsIgnoreCase("bit")) {
            return "Boolean";
        } else if (sqlType.equalsIgnoreCase("tinyint")) {
            return "Byte";
        } else if (sqlType.equalsIgnoreCase("smallint")) {
            return "Short";
        } else if (sqlType.equalsIgnoreCase("int")) {
            return "Integer";
        } else if (sqlType.equalsIgnoreCase("bigint")) {
            return "Long";
        } else if (sqlType.equalsIgnoreCase("float")) {
            return "Float";
        } else if (sqlType.equalsIgnoreCase("decimal")
                || sqlType.equalsIgnoreCase("numeric")
                || sqlType.equalsIgnoreCase("real")
                || sqlType.equalsIgnoreCase("money")
                || sqlType.equalsIgnoreCase("smallmoney")) {
            return "Double";
        } else if (sqlType.equalsIgnoreCase("varchar")
                || sqlType.equalsIgnoreCase("char")
                || sqlType.equalsIgnoreCase("nvarchar")
                || sqlType.equalsIgnoreCase("nchar")
                || sqlType.equalsIgnoreCase("text")) {
            return "String";
        } else if (sqlType.equalsIgnoreCase("datetime")) {
            return "Date";
        } else if (sqlType.equalsIgnoreCase("image")||
        		sqlType.equalsIgnoreCase("blob")||sqlType.equalsIgnoreCase("binary")) {
            return "byte[]";
        }

        return null;
    }

    /**
     * 出口 TODO
     * 
     * @param args
     */
    public static void main(String[] args) {
    	//String a ="a_a_b_v_";
    	//System.out.println("this is "+StringUtil.initCapAndUnderline(a));
        new ReverseEntity2().start();

    }

    private void start() {
        // 创建连接
        Connection conn = null;
		try {
			conn = DB.getConn();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

        if (databasename != null && !databasename.equals("")
                && tablename != null && !tablename.equals("")) {
            System.out.println("databasename 和 tablename 不能同时存在");
        } else {
            // 如果配置文件中有数据库名字,则可以拿到其中所有的实体类
            if (databasename != null && !databasename.equals("")) {
                // 获取所有实体表名字
                tablenames = new ArrayList<String>();
                getAllEntityTable(conn, tablenames);
                System.out.println("tablenames"+tablenames);
                // 为每个实体表生成实体类
                genEntity(tablenames, conn);
            } else {
            	String[] tablenames = tablename.split(",");
                // 为指定实体表生成实体类
            	for (int i = 0; i < tablenames.length; i++) {
            		genEntity(tablenames[i], conn);
				}
            }

            // 关闭数据库连接
            if (conn != null) {
                DB.close(conn);
            }
        }

    }
}

 

 

根据模板生成的细节在这里

package test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import annotation.Caption;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import util.PathUitl;
import util.StringUtil;

/**
 * version 1.0
 * @author kaizen
 *
 */
public class Process {
	
	 public static final String prefix="${bean.";
     public static final String suffix="}";
     public static final String jspFilePrefix="/jsp/";
     public static final String ftlFilePrefix="/templetes/";
     public static final String ENTER = "\n";//换行

   //创建一个合适的Configration对象 
     private static Configuration configuration = new Configuration();
     
     static{
    	 
	     try 
	     {
			configuration.setDirectoryForTemplateLoading(new File(PathUitl.getClasspath()));
			configuration.setObjectWrapper(new DefaultObjectWrapper());  
	        configuration.setDefaultEncoding("UTF-8");   //这个一定要设置,不然在生成的页面中 会乱码  
	        
	     } catch (IOException e) {
	    	 // TODO Auto-generated catch block
	    	 e.printStackTrace();
	     }  
        
     }

	
	
	
	public static void processJsp(Object obj,String path){
		if(obj==null||path==null){
			throw new NullPointerException();
		}
		
		 try {  
	            
	            //获取或创建一个模版。  
	            Template template = configuration.getTemplate(jspFilePrefix+"input.jsp");
	            Template template2 = configuration.getTemplate(jspFilePrefix+"list.jsp");
	            Template template3 = configuration.getTemplate(jspFilePrefix+"view.jsp");
	            
	            Map<String, Object> inputParamMap = new HashMap<String, Object>();
	            Map<String, Object> listParamMap = new HashMap<String, Object>();
	           

	            
	            Map<String,Object> captions = new  HashMap<String, Object>();
	            Map<String,Object> listCaptions = new  HashMap<String, Object>();
	            
	            //List fields = new ArrayList();
	            Map<String, Object> fields = new HashMap<String, Object>();
	            
	            Field[] fs =  obj.getClass().getDeclaredFields();
	            for (Field f : fs) {
	            	Caption caption = f.getAnnotation(Caption.class);
	            	if(null!=caption){
	            		if(caption.value().equals("主键")){
		            		inputParamMap.put("seqId", f.getName());
		            		inputParamMap.put("seqIdValue",prefix+f.getName()+suffix);
		            	}else{
		            		captions.put(f.getName(),caption.value());
		            	}
	            		fields.put( f.getName(),prefix+f.getName()+suffix);
	            		listCaptions.put(prefix+f.getName()+suffix, caption.value());
	            	}
				}
	            //Input
	            inputParamMap.put("fields", fields); 
	            inputParamMap.put("captions", captions); 
	            inputParamMap.put("lowercaseBean", StringUtil.initLowerCase(obj.getClass().getSimpleName())); 
	            
	            //List
	            listParamMap.put("listCaptions", listCaptions); 
	            listParamMap.put("page", "page"); 
	            listParamMap.put("fields", fields);  
	            listParamMap.put("pageNumber", "${page.pageNumber}");
	            listParamMap.put("totalPages", "${page.totalPages}");
	            listParamMap.put("search", "search"); 
	            listParamMap.put("lowercaseBean", StringUtil.initLowerCase(obj.getClass().getSimpleName())); 
	            //File file = new File("");
	            //FileOutputStream fos = new FileOutputStream(file);
	            Writer writer  = new OutputStreamWriter(new FileOutputStream(path+StringUtil.initLowerCase(obj.getClass().getSimpleName())+"Input.jsp"),"UTF-8"); 
	            Writer writer2 = new OutputStreamWriter(new FileOutputStream(path+StringUtil.initLowerCase(obj.getClass().getSimpleName())+"List.jsp"),"UTF-8");
	            Writer writer3 = new OutputStreamWriter(new FileOutputStream(path+StringUtil.initLowerCase(obj.getClass().getSimpleName()+"View.jsp")),"UTF-8");

	            template.process(inputParamMap, writer);  
	            template2.process(listParamMap, writer2);
	            template3.process(inputParamMap, writer3); 
	            System.out.println("恭喜,生成成功~~");  
	        } catch (IOException e) {  
	            e.printStackTrace();  
	        } catch (TemplateException e) {  
	            e.printStackTrace();  
	        } 
	}
	
	public static void processDao(String packgerOutPath,String beanName,String path){
		
		//获取或创建一个模版。  
        try 
        {
			Template template = configuration.getTemplate(ftlFilePrefix+"dao.ftl");
           
			Map<String, Object> ParamMap = new HashMap<String, Object>();
            ParamMap.put("packageOutPath", packgerOutPath);
            ParamMap.put("bean", beanName);

            Writer writer  = new OutputStreamWriter(new FileOutputStream(path+"I"+beanName+"Dao.java"),"UTF-8"); 
            template.process(ParamMap, writer);  


			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void processService(String packgerOutPath,String beanName,String path){
		//获取或创建一个模版。  
        try 
        {
			Template template = configuration.getTemplate(ftlFilePrefix+"iservice.ftl");
           
			Map<String, Object> ParamMap = new HashMap<String, Object>();
            ParamMap.put("packageOutPath", packgerOutPath);
            ParamMap.put("bean", beanName);

            Writer writer  = new OutputStreamWriter(new FileOutputStream(path+"I"+beanName+"Service.java"),"UTF-8"); 
            template.process(ParamMap, writer);  

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void processMService(String packgerOutPath,String beanName,String path,Object obj){
		//获取或创建一个模版。  
        try 
        {
			Template template = configuration.getTemplate(ftlFilePrefix+"mservice.ftl");
			Map<String, Object> ParamMap = new HashMap<String, Object>();
			
			Map<String, Object> fields = new HashMap<String, Object>();
			 Field[] fs =  obj.getClass().getDeclaredFields();
	            for (Field f : fs) {
            		fields.put( f.getName(),"get"+StringUtil.initCapAndUnderline(f.getName()));
				}
            ParamMap.put("packageOutPath", packgerOutPath);
            ParamMap.put("bean", beanName);
            ParamMap.put("fields", fields);
            Writer writer  = new OutputStreamWriter(new FileOutputStream(path+"M"+beanName+"Service.java"),"UTF-8"); 
            template.process(ParamMap, writer);  

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	public static void processServiceImpl(String packgerOutPath,String beanName,String path){
		//获取或创建一个模版。  
        try 
        {
			Template template = configuration.getTemplate(ftlFilePrefix+"service.ftl");
           
			Map<String, Object> ParamMap = new HashMap<String, Object>();
            ParamMap.put("packageOutPath", packgerOutPath);
            ParamMap.put("bean", beanName);

            Writer writer  = new OutputStreamWriter(new FileOutputStream(path+beanName+"Service.java"),"UTF-8"); 
            template.process(ParamMap, writer);  


			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	public static void processController(String packgerOutPath,String beanName,String path){
		
		//获取或创建一个模版。  
        try 
        {
			Template template = configuration.getTemplate(ftlFilePrefix+"controller.ftl");
			Template template2 = configuration.getTemplate(ftlFilePrefix+"url.ftl");
			
			
			Map<String, Object> ParamMap = new HashMap<String, Object>();
            ParamMap.put("packageOutPath", packgerOutPath);
            ParamMap.put("bean", beanName);
            ParamMap.put("lowercaseBean", StringUtil.initLowerCase(beanName));

            Writer writer  = new OutputStreamWriter(new FileOutputStream(path+beanName+"Controller.java"),"UTF-8"); 
            Writer writer1  = new OutputStreamWriter(new FileOutputStream(path+"URL.java"),"UTF-8"); 

            template.process(ParamMap, writer);  
            template2.process(ParamMap, writer1); 
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public static void processMController(String packgerOutPath,String beanName,String path){
		
		//获取或创建一个模版。  
        try 
        {
			Template template = configuration.getTemplate(ftlFilePrefix+"mcontroller.ftl");
			Template template2 = configuration.getTemplate(ftlFilePrefix+"murl.ftl");

			Map<String, Object> ParamMap = new HashMap<String, Object>();
            ParamMap.put("packageOutPath", packgerOutPath);
            ParamMap.put("bean", beanName);
            ParamMap.put("lowercaseBean", StringUtil.initLowerCase(beanName));

            Writer writer  = new OutputStreamWriter(new FileOutputStream(path+"M"+beanName+"Controller.java"),"UTF-8"); 
            Writer writer1  = new OutputStreamWriter(new FileOutputStream(path+"Murl.java"),"UTF-8"); 

            template.process(ParamMap, writer);  
            template2.process(ParamMap, writer1); 

			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	


	/*public static void main(String[] args) {
	  System.out.println(PathUitl.getClasspath());
    System.out.println(PathUitl.getPorjectPath());
    //System.out.println(ClassLoader.getSystemResource("static.html"));
    System.out.println(Bean.class.getSimpleName());//Bean
    System.out.println(Bean.class.getName());//bean.Bean
    
   
    
    Bean bean = new Bean();
	 try {  
          //创建一个合适的Configration对象 
          Configuration configuration = new Configuration();  
          
        
         configuration.setDirectoryForTemplateLoading(new File(PathUitl.getClasspath()));  
          configuration.setObjectWrapper(new DefaultObjectWrapper());  
          configuration.setDefaultEncoding("UTF-8");   //这个一定要设置,不然在生成的页面中 会乱码  
          //获取或创建一个模版。  
          Template template = configuration.getTemplate(filePrefix+"input.jsp");
          Template template2 = configuration.getTemplate(filePrefix+"list.jsp");
          Template template3 = configuration.getTemplate(filePrefix+"view.jsp");
          
          Map<String, Object> inputParamMap = new HashMap<String, Object>();
          Map<String, Object> listParamMap = new HashMap<String, Object>();
         

          
          Map<String,Object> captions = new  HashMap<String, Object>();
          Map<String,Object> listCaptions = new  HashMap<String, Object>();
          
          //List fields = new ArrayList();
          Map<String, Object> fields = new HashMap<String, Object>();
          
          Field[] fs =  bean.getClass().getDeclaredFields();
          for (Field f : fs) {
          	Caption caption = f.getAnnotation(Caption.class);
          	if(caption.value().equals("主键")){
          		inputParamMap.put("seqId", f.getName());
          		inputParamMap.put("seqIdValue",prefix+f.getName()+suffix);
          	}else{
          		captions.put(f.getName(),caption.value());
          	}
          	
          	fields.put( f.getName(),prefix+f.getName()+suffix);
          	listCaptions.put(prefix+f.getName()+suffix, caption.value());
			}
          //Input
          inputParamMap.put("fields", fields);  
          inputParamMap.put("captions", captions); 
          //List
          listParamMap.put("listCaptions", listCaptions); 
          listParamMap.put("page", "page"); 
          listParamMap.put("fields", fields);  
          listParamMap.put("pageNumber", "${page.pageNumber}");
          listParamMap.put("totalPages", "${page.totalPages}");
          listParamMap.put("search", "search"); 
          
          Writer writer  = new OutputStreamWriter(new FileOutputStream(bean.getClass().getSimpleName()+"Input.jsp"),"UTF-8"); 
          Writer writer2 = new OutputStreamWriter(new FileOutputStream(bean.getClass().getSimpleName()+"List.jsp"),"UTF-8");
          Writer writer3 = new OutputStreamWriter(new FileOutputStream(bean.getClass().getSimpleName()+"View.jsp"),"UTF-8");

          template.process(inputParamMap, writer);  
          template2.process(listParamMap, writer2);
          template3.process(inputParamMap, writer3); 
          System.out.println("恭喜,生成成功~~");  
      } catch (IOException e) {  
          e.printStackTrace();  
      } catch (TemplateException e) {  
          e.printStackTrace();  
      } 
}*/
	
}

 

基本java代码都在上面了 有需要ftl模板的可以加我QQ:964388652 但是每个人实现都不同 熟悉一下freemarker就能写出简单的代码生成了 这里的代码就做了简单的划分 没有做得很完善

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值