MyBatis 自动生成实体类 不是Mybatis Generato

谈起自动生成实体类,大家都会想到Mybatis Generator

Generator 还得搞什么环境,生成的代码可读性很差,乱七八糟一大坨

于是就自己写了一个,不只是基础的代码,还把注释也给自动加上了,现在把源码放上来供大家参考。


package com.eluotuo.common.tools;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

public class GenEntityTool
{
    private String tablename;
    
    private String dir;
    
    private String[] colnames; // 列名数组
    
    private String[] colTypes; // 列名类型数组
    
    private String[] comments; // 列名大小数组
    
    private boolean f_util = false; // 是否需要导入包java.util.*
    
    private boolean f_sql = false; // 是否需要导入包java.sql.*
    
    public GenEntityTool(String tableName,String dir)
    {
        Connection conn = getConnection(); // 得到数据库连接
        this.tablename = tableName;
        this.dir = dir;
        String strsql = "SELECT `COLUMN_NAME`,`DATA_TYPE`,`COLUMN_COMMENT` FROM COLUMNS WHERE table_name='" + tablename + "'";
        try
        {
            PreparedStatement pstmt = conn.prepareStatement(strsql);
            ResultSet resultSet = pstmt.executeQuery("select count(*) as rowCount FROM COLUMNS WHERE table_name='" + tablename + "'");
            resultSet.next();
            int rowCount = resultSet.getInt("rowCount");
            colnames = new String[rowCount];
            colTypes = new String[rowCount];
            comments = new String[rowCount];
            resultSet = pstmt.executeQuery(strsql);
            int i = 0;
            while(resultSet.next())
            {
                colnames[i] =  resultSet.getString("COLUMN_NAME");
                colTypes[i] =  resultSet.getString("DATA_TYPE");
                comments[i] =  resultSet.getString("COLUMN_COMMENT");
                if (colTypes[i].equalsIgnoreCase("datetime"))
                {
                    f_util = true;
                }
                if (colTypes[i].equalsIgnoreCase("image") || colTypes[i].equalsIgnoreCase("text"))
                {
                    f_sql = true;
                }
                i++;
            }
            String content = parse(colnames, colTypes);
            try
            {
                FileWriter fw = new FileWriter(dir + "/" + initcap(parseColnName(tablename)) + ".java");
                PrintWriter pw = new PrintWriter(fw);
                pw.println(content);
                pw.flush();
                pw.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
        finally
        {
            closeConnection(conn);
        }
    }
    
    /**
     * 获取一个数据库连接
     * 
     * @return connection
     */
    public Connection getConnection()
    {
        Connection conn = null;
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://192.168.1.52:3306/information_schema", "root", "root");
            return conn;
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }
    
    /**
     * 关闭数据库连接
     * 
     * @param con connection
     */
    public static void closeConnection(Connection con)
    {
        if (con != null)
        {
            try
            {
                con.close();
            }
            catch (SQLException e)
            {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 解析处理(生成实体类主体代码)
     */
    private String parse(String[] colNames, String[] colTypes)
    {
        StringBuffer sb = new StringBuffer();
        if (f_util)
        {
            sb.append("import java.util.Date;\r\n");
        }
        if (f_sql)
        {
            sb.append("import java.sql.*;\r\n\r\n\r\n");
        }
        sb.append("public class " + initcap(parseColnName(tablename)) + " {\r\n");
        processAllAttrs(sb);
        processAllMethod(sb);
        sb.append("}\r\n");
        System.out.println(sb.toString());
        return sb.toString();
        
    }
    
    /**
     * 生成所有的方法
     * 
     * @param sb
     */
    private void processAllMethod(StringBuffer sb)
    {
        for (int i = 0; i < colnames.length; i++)
        {
            sb.append(" /** \n* 给" + comments[i] + "赋值*/");
            sb.append("\tpublic void set" + initcap(parseColnName(colnames[i])) + "(" + sqlType2JavaType(colTypes[i]) + " "
                + parseColnName(colnames[i]) + "){\r\n");
            sb.append("\t\tthis." + parseColnName(colnames[i]) + "=" + parseColnName(colnames[i]) + ";\r\n");
            sb.append("\t}\r\n");
            sb.append(" /** \n* 获取" + comments[i] + "*/");
            sb.append("\tpublic " + sqlType2JavaType(colTypes[i]) + " get" + initcap(parseColnName(colnames[i])) + "(){\r\n");
            sb.append("\t\treturn " + parseColnName(colnames[i]) + ";\r\n");
            sb.append("\t}\r\n");
        }
    }
    
    /**
     * 解析输出属性
     * 
     * @return
     */
    private void processAllAttrs(StringBuffer sb)
    {
        for (int i = 0; i < colnames.length; i++)
        {
            sb.append(" /** \n* " + comments[i] + "*/");
            sb.append("\tprivate " + sqlType2JavaType(colTypes[i]) + " " + parseColnName(colnames[i]) + ";\r\n");
            
        }
    }
    
    /**
     * 将下划线去掉并将下划线后面的第一个字母大写
     * 
     * @param colnName 字符串
     * @return 处理好的字符串
     */
    public static  String parseColnName(String colnName)
    {
        String[] names = colnName.split("_");
        StringBuilder result = new StringBuilder(names[0]);
        for (int i = 1; i < names.length; i++)
        {
            if (!"".equals(names[i]))
            {
                result.append(initcap(names[i]));
            }
        }
        return result.toString();
    }
    
    
    
    /**
     * 把输入字符串的首字母改成大写
     * 
     * @param str
     * @return
     */
    private  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);
    }
    
    private String sqlType2JavaType(String sqlType)
    {
        if (sqlType.equalsIgnoreCase("bit"))
        {
            return "bool";
        }
        else if (sqlType.equalsIgnoreCase("tinyint"))
        {
            return "byte";
        }
        else if (sqlType.equalsIgnoreCase("smallint"))
        {
            return "short";
        }
        else if (sqlType.equalsIgnoreCase("int"))
        {
            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"))
        {
            return "double";
        }
        else if (sqlType.equalsIgnoreCase("money") || sqlType.equalsIgnoreCase("smallmoney"))
        {
            return "double";
        }
        else if (sqlType.equalsIgnoreCase("varchar") || sqlType.equalsIgnoreCase("char")
            || sqlType.equalsIgnoreCase("nvarchar") || sqlType.equalsIgnoreCase("nchar"))
        {
            return "String";
        }
        else if (sqlType.equalsIgnoreCase("datetime"))
        {
            return "Date";
        }
        
        else if (sqlType.equalsIgnoreCase("image"))
        {
            return "Blob";
        }
        else if (sqlType.equalsIgnoreCase("text"))
        {
            return "Clob";
        }
        else if (sqlType.equalsIgnoreCase("double"))
        {
            return "double";
        }
        else if (sqlType.equalsIgnoreCase("char"))
        {
            return "String";
        }
        System.out.println(sqlType + "没有匹配到java类型");
        return null;
    }
    
    public static void main(String[] args)
    {
        new GenEntityTool("t_charge_record_xll","d:/code");
    }
}

只要有java环境,把这个类拷贝到你的java文件中,配置一下数据库。

然后直接跑main方法,就能得到类的实体代码了。

</pre><pre name="code" class="java" style="color: rgb(51, 51, 51); font-size: 13px; line-height: 20.0200004577637px;"> public static void main(String[] args)
    {
        new GenEntityTool("t_charge_record_xll","d:/code");//  这个是表名字 和 生成代码的路径
    }

有人会说,这样搞起来,那么类的列与数据库中不同 咋办,我们可以AS一下。

下期把 格式化CRUD代码的 HTML JS给大家分享一下。。

本文中部分代码使用了其他人的成果,不过不知道原创到底是谁,就不写了。

本文原装    小贤子 ,如果你对本代码有什么改动,请发送你改动的代码到 921888199@qq.com



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值