工具类——通过数据库表自动生成java bean

maven

        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
        </dependency>

ColumnAttribute 类

public class  ColumnAttribute {
    //字段名称
    private String columnName;
    //字段类型
    private String columType;
    //字段长度
    private int length;
    //小数点后
    private int scale;
    //是否为 nullable
    private int isNullable;
    // 是否为主键
    private boolean isPK;
    // 属性
    private String attributeName;
    // 属性类型
    private String attributeType;
    // 字段说明
    private String comment;


    public String getColumnName() {
        return columnName;
    }
    public void setColumnName(String columnName) {
        this.columnName = columnName;
    }
    public String getColumType() {
        return columType;
    }
    public void setColumType(String columType) {
        this.columType = columType;
    }
    public int isNullable() {
        return isNullable;
    }
    public void setNullable(int isNullable) {
        this.isNullable = isNullable;
    }
    public int getLength() {
        return length;
    }
    public void setLength(int length) {
        this.length = length;
    }
    public int getScale() {
        return scale;
    }
    public void setScale(int scale) {
        this.scale = scale;
    }
    public String getAttributeName() {
        return attributeName;
    }
    public void setAttributeName(String attributeName) {
        this.attributeName = attributeName;
    }
    public String getAttributeType() {
        return attributeType;
    }
    public void setAttributeType(String attributeType) {
        this.attributeType = attributeType;
    }
    public int getIsNullable() {
        return isNullable;
    }
    public void setIsNullable(int isNullable) {
        this.isNullable = isNullable;
    }
    public boolean isPK() {
        return isPK;
    }
    public void setPK(boolean isPK) {
        this.isPK = isPK;
    }
    public String getComment() {
        return comment;
    }
    public void setComment(String comment) {
        this.comment = comment;
    }

}

ColumnMapAttribute 类

public class ColumnMapAttribute {
    /**
     * @param s1 数据库里的表名
     * @return 去掉下划线并且第一个字母开始大写
     */
    public static String getBONameFormTable(String s1){
        String tableName="";
        String [] args=s1.split("_");
        for(int i=0;i<args.length;i++){
            String name=args[i];
            if(name!=null && !"".equals(name)){
                tableName=tableName+getStringFristUp(name);
            }
        }
        return tableName;
    }
    /**
     * @param s1 数据库里的字段
     * @return 去掉下划线并且第二个字母开始大写
     */
    public static String getAttibutreNameFormColumn(String s1){
        String columnName="";
        String [] args=s1.split("_");
        for(int i=0;i<args.length;i++){
            String name=args[i];
            if(name!=null && !"".equals(name)){
                if(i==0){
                    columnName=name.toLowerCase();
                }else{
                    columnName=columnName+getStringFristUp(name);
                }
            }
        }
        return columnName;
    }

    /**
     * 字符串首字母转大写,其他小写
     * @param s
     * @return
     */
    private static String getStringFristUp(String s){
        String result="";
        if(s!=null && !"".equals(s)){
            //
            char[] chr=s.toCharArray(); 
            for(int i=0;i<chr.length;i++) {
                //如果ASCII码>96(小写字母)
                if(i==0 && chr[i]>96){
                    chr[i]-=32;
                }
                //如果ASCII码<96(大写字母)
                if(i>0 && chr[i]<96){
                    chr[i]+=32; 
                }
                result=result+chr[i];
            }
        }
        return result;
    }

    /**
     * 字符串首字母转大写,其他不变
     * @param s
     * @return
     */
    public static String getFristUp(String s){
        String result="";
        if(s!=null && !"".equals(s)){
            //
            char[] chr=s.toCharArray(); 
            for(int i=0;i<chr.length;i++) {
                //如果ASCII码>96(小写字母)
                if(i==0 && chr[i]>96){
                    chr[i]-=32;
                }
                result=result+chr[i];
            }
        }
        return result;
    }
    /**
     * 
     * @param columnType oracle字段类型
     * @param size 长度
     * @param scan 小数点后面位数 主要判断number类型
     * @return
     */
    public static String getAttributeType(String columnType,int size,int scan){
        String attributeType="";
        // 可变字符
        if("VARCHAR2".equalsIgnoreCase(columnType)){
            attributeType="String";
        }else if("CHAR".equalsIgnoreCase(columnType)){
            attributeType="String";
        }else if("NUMBER".equals(columnType)){
            if(scan>0){
                attributeType="double";
            }else{
                if(size<=8){
                    attributeType="int";
                }else{
                    attributeType="int";
                }
            }
        }else if("DATE".equals(columnType)){
            attributeType="Date";
        }else if("BIGINT".equalsIgnoreCase(columnType)){
            attributeType="Long";
        }else if("INTEGER".equalsIgnoreCase(columnType)){
            attributeType="Integer";
        }else if("TINYINT".equalsIgnoreCase(columnType)){
            attributeType="Integer";
        }else if("INT".equalsIgnoreCase(columnType)){
            attributeType="Integer";
        }else if("varchar".equalsIgnoreCase(columnType)){
            attributeType="String";
        }else if("timestamp".equalsIgnoreCase(columnType)){
            attributeType="Date";
        }else if("decimal".equalsIgnoreCase(columnType)){
            attributeType="Double";
        }else if("datetime".equalsIgnoreCase(columnType)){
            attributeType="Date";
        }else if("boolean".equalsIgnoreCase(columnType)){
            attributeType="Boolean";
        }else if("double".equalsIgnoreCase(columnType)){
            attributeType="Double";
        }
        return attributeType;
    }

    public static void main(String args[]){
        String s="DsFFDSFDFdsad";
        String s2=getStringFristUp(s);
        System.out.println(s2);

    }
}

TableEntity 类

import java.util.List;

/**
 * 表的映射实体
 * @author Administrator
 *
 */
public class TableEntity {
    private String tableName;
    private String boName;
    private String primaryKeyName;
    private String primaryIdName;
    private List columnAttributes;
    private List importClassList;
    private String comment;

    public TableEntity() {
        super();
    }

    public String getBoName() {
        return boName;
    }
    public void setBoName(String boName) {
        this.boName = boName;
    }
    public List getColumnAttributes() {
        return columnAttributes;
    }
    public void setColumnAttributes(List columnAttributes) {
        this.columnAttributes = columnAttributes;
    }
    public List getImportClassList() {
        return importClassList;
    }
    public void setImportClassList(List importClassList) {
        this.importClassList = importClassList;
    }
    public String getTableName() {
        return tableName;
    }
    public void setTableName(String tableName) {
        this.tableName = tableName;
    }

    public String getPrimaryIdName() {
        return primaryIdName;
    }

    public void setPrimaryIdName(String primaryIdName) {
        this.primaryIdName = primaryIdName;
    }

    public String getPrimaryKeyName() {
        return primaryKeyName;
    }

    public void setPrimaryKeyName(String primaryKeyName) {
        this.primaryKeyName = primaryKeyName;
    }

    public String getComment() {
        return comment;
    }

    public void setComment(String comment) {
        this.comment = comment;
    }

}

TableToEntityMysql 类

import java.io.*;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * mysql自动生成
 */
public class TableToEntityMysql{

    /** 数据库连接URL*/ 
    private final static String DB_URL = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";

    /** 数据库连接驱动*/ 
    private final static String DB_DRIVER = "com.mysql.jdbc.Driver"; 

    /** 数据库用户名*/ 
    private final static String DB_USERNAME = "root";

    /** 数据库密码*/ 
    private final static String DB_PASSWORD = "123456";

    /** 生成java实体类存放目录*/
    private final static String FILEDIR = "D:\\beans_sharding_jdbc";


    /**
     * 生成bean前需修改的值
     */
    /**数据库名称**/
    public static String db_name="test";
    /**要生成bean的表名**/
    public static String table_name="user";
    /**生成的bean类package值**/
    public static String java_package_path="com.zhao.entity";



    /**功能:主调方法
     * @param args
     * @author zhaoy
     * @date 2017年11月2日
     */
    public static void main(String[] args) {
        /*
         * 单个表生成bean
         */
//      exportJava(table_name,java_package_path);
//      /**
//       * 批量表生成bean
//       */
        String[] tableArr={
                "user",
//              "tb_account_banks_card",
//              "tb_account_extract"
        };
        exportBeansBatch(tableArr);
    }

    /**
     * <p class="detail">
     * 功能:数据库表批量生成bean
     * </p>
     * @author zhaoy
     * @date 2017年11月2日 
     * @param tableNameArr 数据库表名字符串数组
     */
    public static void exportBeansBatch(String tableNameArr[]){
        for(int i=0; tableNameArr!=null && i<tableNameArr.length; i++){
            try{
                exportJava(tableNameArr[i],java_package_path);
            }catch(Exception e){
                System.out.println("第"+i+"个Bean生成失败,表名:"+tableNameArr[i]);
                e.printStackTrace();
            }
        }
    }

    /**
     * <p class="detail">
     * 功能:根据表名称单个生成bean实体类
     * </p>
     * @author zhaoy
     * @date 2017年11月2日 
     * @param tableName 数据库表名
     * @param packageName 生成的bean类顶部包路径(package后面部分)
     */
    public static void exportJava(String tableName,String packageName){
        System.out.println(tableName+"表对应的bean正在生成...");
        TableEntity entity=getTableEntity(tableName);
        String boName=entity.getBoName();
        List columnAttributes=entity.getColumnAttributes();
        StringBuffer buffer =  new StringBuffer();
        String filePath=FILEDIR+"//"+boName+".java";
        try {
            if(packageName==null || "".equals(packageName)){
                buffer.append("\n");
            }else{
                buffer.append("package "+packageName+";\n");
            }
            buffer.append("import javax.persistence.Column;\n");
            buffer.append("import static javax.persistence.GenerationType.IDENTITY;\n");
            buffer.append("import javax.persistence.Entity;\n");
            buffer.append("import javax.persistence.GeneratedValue;\n");
            buffer.append("import javax.persistence.Id;\n");
            buffer.append("import javax.persistence.Table;\n");
            buffer.append("import java.util.Date;\n");

            buffer.append("\n@Entity\n");
            buffer.append("@Table(name =\" "+tableName+"\")\n");
            buffer.append(" public class "+boName+" implements java.io.Serializable{\n");

            writeBOMessage(buffer,entity);
            writeSetGet(buffer,columnAttributes);

            buffer.append("}\n");
            File beanDir=new File(FILEDIR);
            if(!beanDir.isDirectory()){
                beanDir.mkdir();
            }
            File beanFile=new File(filePath);
            if(!beanFile.exists()){
                beanFile.createNewFile();
            }
            OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(filePath),"UTF-8");
            out.write(buffer.toString());
            out.flush();
            out.close();
            System.out.println(tableName+"表对应的bean生成成功:"+filePath);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    /**
     * 功能:获取数据库所有表名
     * @param tableName
     * @return
     * @author zhaoy
     * @date 2017年11月2日
     */
    public static TableEntity getTableEntity(String tableName){
        TableEntity entity=new TableEntity();
        List columnAttributes=new ArrayList();
        //当前用户有权限查看的所有表的表名
        PreparedStatement pstm=null;
        Connection con=null;
        ResultSetMetaData rsm=null; 
        String sql="SELECT * FROM "+tableName+" limit 0,1";

        try {
            con=getConnection();
            DatabaseMetaData dbMeta = con.getMetaData();
            ResultSet pkRSet=dbMeta.getPrimaryKeys(null,null,tableName);
            String primaryKey="";
            while(pkRSet.next()){
                primaryKey=pkRSet.getString(4);
                break;
            }
            entity.setPrimaryKeyName(primaryKey);
            entity.setPrimaryIdName(ColumnMapAttribute.getAttibutreNameFormColumn(primaryKey));
            pstm = con.prepareStatement(sql);
            pstm.executeQuery();
            rsm=pstm.getMetaData();
            for(int i=1;i<=rsm.getColumnCount();i++){
                ColumnAttribute columnAttribute=new ColumnAttribute();
                // 字段名
                String columnName=rsm.getColumnName(i);
                columnAttribute.setColumnName(columnName);
                if(columnName.equals(primaryKey)){
                    columnAttribute.setPK(true);
                }else{
                    columnAttribute.setPK(false);
                }
                // 字段类型
                String columnType=rsm.getColumnTypeName(i);
                if("CLOB".equals(columnType)){
                    continue;
                }
                columnAttribute.setColumType(columnType);
                // 字段长度
                int columnSize=rsm.getPrecision(i);
                columnAttribute.setLength(columnSize);
                // 获取指定列的小数点右边的位数。
                int scale=rsm.getScale(i);
                //System.out.println("字段名称: "+rsm.getColumnLabel(i)+"\n\t sql类型编号:"+rsm.getColumnType(i)+"\n\t sql类型名称:"+rsm.getColumnTypeName(i)+"\n\t scale:"+rsm.getScale(i)+"\n\t sql类型精确度:"+rsm.getPrecision(i)+"\n\t 最大字符个数:"+rsm.getColumnDisplaySize(i)+"\n\t java类型:"+rsm.getColumnClassName(i));
                columnAttribute.setScale(scale);
                // 是否必填
                int isNullable=rsm.isNullable(i);
                columnAttribute.setNullable(isNullable);
                columnAttribute.setAttributeName(ColumnMapAttribute.getAttibutreNameFormColumn(columnName));
                columnAttribute.setAttributeType(ColumnMapAttribute.getAttributeType(columnType,columnSize,scale));
                // 字段描述
                String coments=getColumnComments(con,tableName,columnName);
                columnAttribute.setComment(coments);

                columnAttributes.add(columnAttribute);
            }
            entity.setBoName(ColumnMapAttribute.getBONameFormTable(tableName));
            entity.setColumnAttributes(columnAttributes);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally{
            //closeConn(pstm,null,con);
        }
        return entity;
    }
    /**
     * 功能:获得字段说明
     * @param con
     * @param tableName
     * @param columnName
     * @return
     * @throws SQLException
     * @author zhaoy
     * @throws Exception 
     * @date 2017年11月2日
     */
    private static String getColumnComments(Connection con, String tableName, String columnName) throws SQLException {
        //String sql=" select t.TABLE_NAME,t.COLUMN_NAME,t.comments  from user_col_comments t where t.table_name=? and t.column_name=? ";
        String sql="SELECT t.`TABLE_NAME`,t.`COLUMN_NAME`,t.`COLUMN_COMMENT` FROM information_schema.columns t WHERE t.`TABLE_SCHEMA`='"+db_name+"' AND t.table_name='"+tableName+"' and t.`COLUMN_NAME`='"+columnName+"' ORDER BY t.table_schema,t.table_name";
        PreparedStatement pstm=con.prepareStatement(sql);

        ResultSet rt = pstm.executeQuery();
        String colDesc="";
        if(rt.next()){
            colDesc=rt.getString(3);
        }
        return colDesc;
    }
    /**
     * 功能:创建文件夹并返回写入此文件的FileWriter对象
     * @param name
     * @return
     * @author zhaoy
     * @date 2017年11月2日
     */
    private static FileWriter createFile(String name){
        File dir=new File(FILEDIR);
        if(!dir.exists()){
            dir.mkdirs();
        }
        String fileName=FILEDIR+"//"+name+".java";
        System.out.println(fileName);
        File file=new File(fileName);
        FileWriter writer=null;
        try {
            if(!file.exists()){
                file.createNewFile();
            }
            writer=new FileWriter(file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return writer;
    }
    /**
     * 功能:写入字段定义及构造函数-默认无参数,全部参数2个
     * @param writer
     * @param entity
     * @throws IOException
     * @author zhaoy
     * @date 2017年11月2日
     */
    private static void writeBOMessage(StringBuffer writer,TableEntity entity) throws IOException{
        String boName=entity.getBoName();
        String paimaryIdName=entity.getPrimaryIdName();
        String parimaryIdType="";
        List columnAttributes=entity.getColumnAttributes();
        // 所有成员变量的定义
        for(int i=0;columnAttributes!=null && i<columnAttributes.size();i++){
            writer.append("\n");
            ColumnAttribute columnAttribute=(ColumnAttribute)columnAttributes.get(i);
            if(paimaryIdName!=null && paimaryIdName.equals(columnAttribute.getAttributeName())){
                parimaryIdType=columnAttribute.getAttributeType();
            }
            writer.append("      /** "+columnAttribute.getComment()+" */\n");
            writer.append("      private "+columnAttribute.getAttributeType()+" "+columnAttribute.getAttributeName()+";\n");
        }
        writer.append("\n");
        // 无参构造方法
        writer.append("      public "+boName+" (){\n");
        writer.append("          super(); \n      }\n");
        // 全部参数构造方法
        // 主键构造方法
        if(paimaryIdName!=null && !paimaryIdName.equals("")){
            writer.append("      public "+boName+"("+parimaryIdType+" "+paimaryIdName+"){\n");
            writer.append("         this."+paimaryIdName+"="+paimaryIdName+";\n");
            writer.append("      }\n");

        }
    }
    /**
     * 功能:bo类set和get方法的生成,包括各个属性
     * @param writer
     * @param columnAttributes
     * @throws IOException
     * @author zhaoy
     * @date 2017年11月2日
     */
    private static void writeSetGet(StringBuffer writer,List columnAttributes) throws IOException{
        for(int i=0;i<columnAttributes.size();i++){
            writer.append("\n");
            ColumnAttribute columnAttribute=(ColumnAttribute)columnAttributes.get(i);
            String attributeName=columnAttribute.getAttributeName();
            String attributeNameUP=ColumnMapAttribute.getFristUp(attributeName);
            String attributeType=columnAttribute.getAttributeType();
            //set方法
            if(((ColumnAttribute)columnAttributes.get(i)).isPK()){
                writer.append("\t   @Id\n");
                writer.append("\t   @GeneratedValue(strategy = IDENTITY)\n");
                writer.append("\t   @Column(name = \"id\", unique = true, nullable = false)\n");
            }else{
                writer.append("\t   @Column(name =\""+((ColumnAttribute)columnAttributes.get(i)).getColumnName()+"\")\n");
            }
            writer.append("       public "+attributeType+" get"+attributeNameUP+"(){\n");
            writer.append("              return this."+attributeName+";\n");
            writer.append("       }");
            writer.append("\n");
            //get方法
            writer.append("       public void set"+attributeNameUP+"("+attributeType+" "+attributeName+"){\n");
            writer.append("              this."+attributeName+"="+attributeName+";\n");
            writer.append("       }");
            writer.append("\n");
        }
    }
    /**
     * 功能:关闭数据库链接
     * @param stmt
     * @param rt
     * @param dbConn
     * @author zhaoy
     * @date 2017年11月2日
     */
    public static void closeConn(Statement stmt,ResultSet rt,Connection dbConn){
        try {
            if(stmt!=null && stmt.isClosed()){
                stmt.close();
            }
            if(rt!=null && rt.isClosed()){
                rt.close();
            }
            if(dbConn!=null && dbConn.isClosed()){
                dbConn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    /**
     * 功能:获得数据库链接
     * @return
     * @author zhaoy
     * @date 2017年11月2日
     */
    public static Connection getConnection(){
        Connection conn = null; 
        try{ 
            //注册驱动
            Class.forName(DB_DRIVER); 
            conn = DriverManager.getConnection(DB_URL,DB_USERNAME,DB_PASSWORD); 
        }catch(Exception ex){ 
            ex.printStackTrace(); 
        } 
        return conn; 
    }

}

猜你喜欢

转载自blog.csdn.net/chineseyoung/article/details/81110316