今天我写了个小工具,可以通过数据库中指定的表生成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