手写代码实现逆生成Bean

今天我写了个小工具,可以通过数据库中指定的表生成Bean


整体流程:

1.设置数据库连接 url,username,password,Bean要放的包名,以及表名

2.然后遍历表名List,执行select * from 表名方法

3.每次执行语句,我们都获得metaData,然后获得每个字段的类型和名称

4.我们需要根据metaData中获得的int 类型值进行判断,并放到容器中

5.然后把表名作为key,List<字段类型字符串以及字段名放到一个对象中>作为value 放到map中

6.遍历map的每一个entry,对map中的key进行驼峰处理 以及根据传过来的包名转换成绝对路径,以及变量名驼峰处理

7.每次遍历map都创建java文件,写入包声明,写入public class 表名(驼峰处理后){

8,遍历每一个存储了Bean类型和变量名的容器,然后写入 private 类型 变量名;

9.遍历每一个存储了Bean类型和变量名的容器 ,写入get和set方法

------------------------------------------------------------------------------------------------



接下来是代码分析


public Creater setPath(String path) {

    this.packageName=path;

    String srcPath = System.getProperty("user.dir") + "\\src";
    System.out.println(srcPath+"           srcpath");
    path = path.replace(".", "\\");
    this.path = srcPath + "\\" + path;

    File file=new File(this.path);
    file.mkdirs();

    System.out.println(this.path+"-------------------");
    return this;
}

我们需要设置一个包名,这个包名要用于后面生成Bean的package声明以及Bean java文件的创建


加载mysql驱动,你懂得


static {
    try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
}



接下来是获取数据库中所有表的字段名以及类型


private void getData() throws Exception {
    //创建连接

    Connection conn = DriverManager.getConnection(this.url, this.username, this.password);
    Statement statement = conn.createStatement();
    //遍历每个表
    for (String tableName : tables) {
        String sql = "select * from `" + tableName + "`";
        ResultSet resultSet = statement.executeQuery(sql);
        //遍历表里的每个字段,放到map中

        ResultSetMetaData metaData = resultSet.getMetaData();
        int columnCount = metaData.getColumnCount();
        List<FieldBean> list = new ArrayList<>();
        //获得的索引从1开始
        for (int i = 1; i <= columnCount; i++) {
            System.out.println(i);
            String columnName = metaData.getColumnName(i);
            int columnType = metaData.getColumnType(i);
            list.add(new FieldBean(getJavaTypeString(columnType), columnName));
            addToImportList(columnType);
        }
        map.put(tableName, list);

    }
}

 遍历每一个表,然后执行sql语句,获得metaData,然后获得字段名以及表示字段类型的int值,放到容器里



这是类型判断,根据metaData获得的表示类型的int值进行判断 

以后我们要这样使用   public Date createDate; 这个Date就是这样获取的

//根据接收到的sqltype 数值来判断类型并返回
private String getJavaTypeString(int type) {
    if (type == Types.DATALINK || type == Types.DATE) {
        return "Date";
    }
    return "String";
}


这里就是导包的处理

我们需要根据metaData获得的表示类型的int值进行处理,需要导包的话就放到一个容器中

private void addToImportList(int type) {
    //类型判断是否需要导包
    //然后放到importList

    switch (type) {
        case Types.DATALINK:
        case Types.DATE:
            importList.add("java.util.Date");
            break;
    }


}




接下来就是字段名的驼峰处理 将下划线去掉并进行驼峰处理

传0就小驼峰,传1就大驼峰

//java驼峰转换
public String toCamelCase(int flag, String name) {
    int index = 0;
    for (int i = 0; i < name.length(); i++) {
        if (name.substring(i, i + 1).equals("_")) {
            System.out.println("前面:" + name.substring(0, i));

            /*System.out.println("后面"+name.substring(i+1));
             */
            //判断_后面是否还有字符

            System.out.println(name.substring(i + 1) + "----0000");

            if (name.substring(i + 1).length() == 0) {
                name = name = name.substring(0, i);
            } else {
                System.out.println("后面的哦" + name.substring(i + 1) + "---");
                name = name.substring(0, i) + name.substring(i + 1).substring(0, 1).toUpperCase() + name.substring(i + 2);
            }
        }
    }
    if (flag == 0) {
        if (name.length() > 1) {
            name = name.substring(0, 1).toLowerCase() + name.substring(1);
        } else {
            name = name.substring(0).toLowerCase();
        }
    } else {
        //如果flag=1 大驼峰

        if (name.length() > 1) {
            name = name.substring(0, 1).toUpperCase() + name.substring(1);
        } else {
            name = name.substring(0).toUpperCase();
        }
    }
    return name;
}


这是写入文件的封装

因为我们是写入到java文件的

private void append(File file, String content) {
    try {
        FileWriter fileWriter = new FileWriter(file, true);
        fileWriter.append(content);
        fileWriter.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这是java文件的处理

//如果文件存在,那就删除然后新建,不存在就直接新建
private void setFile(File file) {
    //如果不存在
    if (!file.exists()) {
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    } else {
        file.delete();
        try {
            file.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


接下来就是核心,bean文件的创建

首先获得所有数据

然后创建java文件

往java文件中写入导包语句,public class 表名 语句,声明变量语句,set get语句

//创建bean文件
public Creater handle() {
    try {
        getData();
    } catch (Exception e) {
        e.printStackTrace();
    }
    //创建java文件

    path = path == null || path == "" ? "e:\\" : path;
    for (String key : map.keySet()) {
        System.out.println(key);
        //这里创建文件
        File file = new File(path +"\\"+ toCamelCase(1, key) + ".java");

        setFile(file);

        //package 声明
        append(file,"package "+packageName+";\r\n");

        //导包文本添加
        for (String str : importList) {
            append(file, "import " + str + ";\r\n");
        }

        append(file, "public class " + toCamelCase(1, key) + "{\r\n");
        for (FieldBean fieldBean : map.get(key)) {
            //写入文本
            //写入变量声明部分
            append(file, "private " + fieldBean.getType() + " " + toCamelCase(0, fieldBean.getName()) + ";\r\n");
        }
        append(file, "\r\n");
        for (FieldBean fieldBean : map.get(key)) {
            //写入setter getter
            append(file, "public void set" + toCamelCase(1, fieldBean.getName()) + "(" + fieldBean.getType() + " " + toCamelCase(0, fieldBean.getName()) + "){ \r\nthis." + toCamelCase(0, fieldBean.getName()) + "=" + toCamelCase(0, fieldBean.getName()) + ";\r\n}\r\n");
            append(file, "public "+fieldBean.getType()+" get" + toCamelCase(1, fieldBean.getName()) + "(){ \r\nreturn " + toCamelCase(0, fieldBean.getName()) + ";\r\n}\r\n");
            System.out.println("  " + fieldBean.getName() + ":" + fieldBean.getType());
        }
        append(file, "\r\n}");
    }
    return this;
}

代码写的有点乱



而且没有加入更多的类型判断,后续用到慢慢加,写这个是因为今天下午上课很无聊想睡觉

然后想起这个东西,就写的,写了就有精神了...


完整代码在我的github  我的GitHub

欢迎 Issue 
















猜你喜欢

转载自blog.csdn.net/u011546032/article/details/80465018
今日推荐