将表转javabean(基于mysql)

工做中,老是遇到编写javabean的工做,每次都写得恶心,并且表和字段是下划线的,例如:created_date;而javabean是驼峰的,例如:createdDate。那么,就须要以下的工具类了。java

/** 
 * 从数据库表反射出实体类,自动生成实体类 
 * @author lqx 
 * 
 */  
public class GenEntityMysql {  
      
    private String packageOutPath = "com.funsmart.model";//指定实体生成所在包的路径  
    private String namespacePrefix= "com.funsmart.dao"; //指定mapper文件的命名空间
    private String mapperOutPath= "com.funsmart.mapper"; //指定mapper文件的存放路径
    private String authorName = "lqx";//做者名字  
    private String tablename = "";//表名
    private String className = "";//类名
    private String[] colnames; // 列名数组  
    private String[] colTypes; //列名类型数组  
    private int[] colSizes; //列名大小数组  
    private boolean f_util = false; // 是否须要导入包java.util.*  
    private boolean f_sql = false; // 是否须要导入包java.sql.*  
    private boolean f_jpa = false; // 是否须要生成基于注解的JPA实体对象  
    
    //数据库链接  
    private static final String URL ="jdbc:mysql://127.0.0.1:3306/demo";  
    private static final String NAME = "root";  
    private static final String PASS = "root";  
    private static final String DRIVER ="com.mysql.jdbc.Driver";  
  
    /* 
     * 构造函数 
     */  
    public GenEntityMysql(){  
        
    }  
    
    /**
     * 生成全部的表转成JavaBean
     */
    public void genAllTablToBean(){
    	List<String> list=getTableName();  
        for(int p=0;p<list.size();p++){  
            tablename=list.get(p);
            className = getClassName(tablename);
            //建立链接  
            Connection con;  
            //查要生成实体类的表  
            String sql = "select * from " + tablename;  
            PreparedStatement pStemt = null;  
            try {  
                try {  
                    Class.forName(DRIVER);  
                } catch (ClassNotFoundException e1) {  
                    e1.printStackTrace();  
                }  
                con = DriverManager.getConnection(URL,NAME,PASS);  
                pStemt = con.prepareStatement(sql);  
                ResultSetMetaData rsmd = pStemt.getMetaData();  
                int size = rsmd.getColumnCount();   //统计列  
                colnames = new String[size];  
                colTypes = new String[size];  
                colSizes = new int[size];  
                for (int i = 0; i < size; i++) {  
                    colnames[i] = rsmd.getColumnName(i + 1);  
                    colTypes[i] = rsmd.getColumnTypeName(i + 1);  
                      
                    if(colTypes[i].equalsIgnoreCase("datetime")){  
                        f_util = true;  
                    }  
                    if(colTypes[i].equalsIgnoreCase("image") || colTypes[i].equalsIgnoreCase("text")){  
                        f_sql = true;  
                    }  
                    colSizes[i] = rsmd.getColumnDisplaySize(i + 1);  
                }  
                  
                String content = parse(colnames,colTypes,colSizes);  
                  
                try {  
                    File directory = new File("");  
                    String outputPath = directory.getAbsolutePath()+ "/src/main/java/"+this.packageOutPath.replace(".", "/")+"/"+initcap(className) + ".java";  
                    FileWriter fw = new FileWriter(outputPath);  
                    PrintWriter pw = new PrintWriter(fw);  
                    pw.println(content);  
                    pw.flush();  
                    pw.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
                  
            } catch (SQLException e) {  
                e.printStackTrace();  
            } finally{  
    //          try {  
    //              con.close();  
    //          } catch (SQLException e) {  
    //              // TODO Auto-generated catch block  
    //              e.printStackTrace();  
    //          }  
            }  
        }  
        System.out.println("生成完毕!");  
    }
    
    /**
     * 单表
     * 将表转成JavaBean
     */
    public void genTablToBean(String tableName){
//    	List<String> list=getTableName();  
//        for(int p=0;p<list.size();p++){  
            tablename=tableName;
            className = getClassName(tablename);
            //建立链接  
            Connection con;  
            //查要生成实体类的表  
            String sql = "select * from " + tablename;  
            PreparedStatement pStemt = null;  
            try {  
                try {  
                    Class.forName(DRIVER);  
                } catch (ClassNotFoundException e1) {  
                    e1.printStackTrace();  
                }  
                con = DriverManager.getConnection(URL,NAME,PASS);  
                pStemt = con.prepareStatement(sql);  
                ResultSetMetaData rsmd = pStemt.getMetaData();  
                int size = rsmd.getColumnCount();   //统计列  
                colnames = new String[size];  
                colTypes = new String[size];  
                colSizes = new int[size];  
                for (int i = 0; i < size; i++) {  
                    colnames[i] = rsmd.getColumnName(i + 1);  
                    colTypes[i] = rsmd.getColumnTypeName(i + 1);  
                      
                    if(colTypes[i].equalsIgnoreCase("datetime")){  
                        f_util = true;  
                    }  
                    if(colTypes[i].equalsIgnoreCase("image") || colTypes[i].equalsIgnoreCase("text")){  
                        f_sql = true;  
                    }  
                    colSizes[i] = rsmd.getColumnDisplaySize(i + 1);  
                }  
                  
                String content = parse(colnames,colTypes,colSizes);  
                  
                try {  
                    File directory = new File("");  
                    String outputPath = directory.getAbsolutePath()+ "/src/main/java/"+this.packageOutPath.replace(".", "/")+"/"+initcap(className) + ".java";  
                    FileWriter fw = new FileWriter(outputPath);  
                    PrintWriter pw = new PrintWriter(fw);  
                    pw.println(content);  
                    pw.flush();  
                    pw.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
                  
            } catch (SQLException e) {  
                e.printStackTrace();  
            } finally{  
    //          try {  
    //              con.close();  
    //          } catch (SQLException e) {  
    //              // TODO Auto-generated catch block  
    //              e.printStackTrace();  
    //          }  
            }  
//        }  
        System.out.println("生成完毕!");  
    }
    
    
    
    /** 
      * Java方法 获得当前数据库下全部的表名  
      * @param con 
      */  
    private List<String> getTableName() {  
         List<String> list=new ArrayList<String>();  
         try {    
             DatabaseMetaData meta = DriverManager.getConnection(URL,NAME,PASS).getMetaData();    
             ResultSet rs = meta.getTables(null, null, null,new String[]{"TABLE"});  
             while (rs.next()) {  
            	 String tableName = rs.getString(3);
            	 // 获取表名
            	 if(StringUtils.isNotBlank(tableName)){
            		 list.add(tableName);    
            	 }
             }    
           }catch(Exception e){    
               e.printStackTrace();    
           }  
        return list;  
     }  
    /**
     * 将表名转为类名
     * @param tableName
     * @return
     */
    private String getClassName(String tableName){
    	// 将表名前缀t_去掉
		 tableName = StringUtils.removeStart(tableName, "t_");
		 tableName = FieldUtils.camelName(tableName);
		 return tableName;
    }
    /** 
     * 功能:生成实体类主体代码 
     * @param colnames 
     * @param colTypes 
     * @param colSizes 
     * @return 
     */  
    private String parse(String[] colnames, String[] colTypes, int[] colSizes) {  
        StringBuffer sb = new StringBuffer();  
        sb.append("package " + this.packageOutPath + ";\r\n");  
        sb.append("\r\n");  
          
        //判断是否导入工具包  
        if(f_util){  
            sb.append("import java.util.Date;\r\n");  
        }  
        if(f_sql){  
            sb.append("import java.sql.*;\r\n");  
        }  
          
        //jpa  
        if(f_jpa){  
            sb.append("import javax.persistence.Entity;\r\n");  
            sb.append("import javax.persistence.GeneratedValue;\r\n");  
            sb.append("import javax.persistence.GenerationType;\r\n");  
            sb.append("import javax.persistence.Id;\r\n\r\n");  
        }  
          
        //注释部分  
        sb.append("/**\r\n");  
        sb.append(" * "+className+" 实体类\r\n");  
        sb.append(" * "+new Date()+"\r\n");  
        sb.append(" * @"+this.authorName+"\r\n");  
        sb.append(" */ \r\n");  
          
        if(f_jpa){  
            sb.append("@Entity\r\n");  
        }  
        //实体部分  
        sb.append("public class " + initcap(className) + "{\r\n\r\n");  
        processAllAttrs(sb);//属性  
        processAllMethod(sb);//get set方法  
        sb.append("}\r\n");  
          
        //System.out.println(sb.toString());  
        return sb.toString();  
    }  
      
    /** 
     * 功能:生成全部属性 
     * @param sb 
     */  
    private void processAllAttrs(StringBuffer sb) {  
        for (int i = 0; i < colnames.length; i++) {
        	String fieldStr = colnames[i];
        	if(fieldStr.indexOf("_") != -1){
        		fieldStr = FieldUtils.camelName(fieldStr);
        	}
            sb.append("\tprivate " + sqlType2JavaType(colTypes[i]) + " " + fieldStr + ";\r\n");  
        }  
        sb.append("\r\n");  
    }  
  
    /** 
     * 功能:生成全部方法 
     * @param sb 
     */  
    private void processAllMethod(StringBuffer sb) {  
          
        for (int i = 0; i < colnames.length; i++) {  
            
        	String fieldStr = colnames[i];
        	if(fieldStr.indexOf("_") != -1){
        		fieldStr = FieldUtils.camelName(fieldStr);
        	}
        	
            if(f_jpa){  
                if(i==0){  
                    sb.append("\t@Id\r\n");  
                    sb.append("\t@GeneratedValue(strategy = GenerationType.AUTO)\r\n");  
                    sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + initcap(fieldStr) + "(){\r\n");  
                }else{  
                    sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + initcap(fieldStr) + "(){\r\n");  
                }  
            }else{  
                sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + initcap(fieldStr) + "(){\r\n");  
            }  
            sb.append("\t\treturn " + fieldStr + ";\r\n");  
            sb.append("\t}\r\n\r\n");  
            sb.append("\tpublic void set" + initcap(fieldStr) + "(" + sqlType2JavaType(colTypes[i]) + " " + fieldStr + "){\r\n");  
            sb.append("\t\tthis." + fieldStr + "=" + fieldStr + ";\r\n");  
            sb.append("\t}\r\n\r\n");  
        }  
          
    }  
      
    /** 
     * 功能:将输入字符串的首字母改为大写 
     * @param str 
     * @return 
     */  
    private 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 sqlType 
     * @return 
     */  
    private String sqlType2JavaType(String sqlType) {  
          
        if(sqlType.equalsIgnoreCase("bit")){  
            return "boolean";  
        }else if(sqlType.equalsIgnoreCase("tinyint")){  
            return "int";  
        }else if(sqlType.equalsIgnoreCase("smallint")){  
            return "int";  
        }else if(sqlType.equalsIgnoreCase("int")||sqlType.equalsIgnoreCase("INT UNSIGNED")){  
            //INT UNSIGNED无符号整形  
            return "int";  
        }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")){  
            return "Blod";  
        }         
        return null;  
    }  
      
    /** 
     * 出口 
     * TODO 
     * @param args 
     */  
    public static void main(String[] args) {  
        new GenEntityMysql().genTablToBean("t_city");  
    }  
}

下划线转驼峰的工具类mysql

/**
 * 字段的工具类
 * 将驼峰转下划线
 * 将下划线转驼峰
 * User: linqx
 * Time: 2015-07-22 22:58
 */
public class FieldUtils {
    /**
     * 将驼峰式命名的字符串转换为下划线大写方式。若是转换前的驼峰式命名的字符串为空,则返回空字符串。</br>
     * 例如:HelloWorld->HELLO_WORLD
     * @param name 转换前的驼峰式命名的字符串
     * @return 转换后下划线大写方式命名的字符串
     */
    public static String underscoreName(String name) {
        StringBuilder result = new StringBuilder();
        if (name != null && name.length() > 0) {
            // 将第一个字符处理成大写
            result.append(name.substring(0, 1).toUpperCase());
            // 循环处理其他字符
            for (int i = 1; i < name.length(); i++) {
                String s = name.substring(i, i + 1);
                // 在大写字母前添加下划线
                if (s.equals(s.toUpperCase()) && !Character.isDigit(s.charAt(0))) {
                    result.append("_");
                }
                // 其余字符直接转成大写
                result.append(s.toUpperCase());
            }
        }
        return result.toString();
    }

    /**
     * 将下划线大写方式命名的字符串转换为驼峰式。若是转换前的下划线大写方式命名的字符串为空,则返回空字符串。</br>
     * 例如:HELLO_WORLD->HelloWorld
     * @param name 转换前的下划线大写方式命名的字符串
     * @return 转换后的驼峰式命名的字符串
     */
    public static String camelName(String name) {
        StringBuilder result = new StringBuilder();
        // 快速检查
        if (name == null || name.isEmpty()) {
            // 不必转换
            return "";
        } else if (!name.contains("_")) {
            // 不含下划线,仅将首字母小写
            return name.substring(0, 1).toLowerCase() + name.substring(1);
        }
        // 用下划线将原始字符串分割
        String camels[] = name.split("_");
        for (String camel :  camels) {
            // 跳过原始字符串中开头、结尾的下换线或双重下划线
            if (camel.isEmpty()) {
                continue;
            }
            // 处理真正的驼峰片断
            if (result.length() == 0) {
                // 第一个驼峰片断,所有字母都小写
                result.append(camel.toLowerCase());
            } else {
                // 其余的驼峰片断,首字母大写
                result.append(camel.substring(0, 1).toUpperCase());
                result.append(camel.substring(1).toLowerCase());
            }
        }
        return result.toString();
    }
}

就是这样啦。git

java学习和交流群:22160972sql

相关文章
相关标签/搜索