利用JDBC根据表结构生成ModelClass
来源:互联网 发布:dede直播源码网站 编辑:程序博客网 时间:2024/05/20 16:11
有时为了加快开发效率,特别是项目初始阶段,数据库设计完成之后,希望直接读取表结构以生成数据库实体。本例中为生成hibernate实体:
//根据数据库生成实体模型的工具类public class ModelClassBuilder { // mysql链接相关 private final String driverClassName = "com.mysql.jdbc.Driver"; private final String url = "jdbc:mysql:localhost/test?useUnicode=true&autoReconnect=true"; private final String username = "test"; private final String password = "test"; private final String tableName; private final String tableClassName; public ModelClassBuilder(String tableName, String tableClassName) { this.tableName = tableName; this.tableClassName = tableClassName; } private Connection getDbConnection() { try { Class.forName(driverClassName); Class.forName(driverClassName).newInstance(); StringBuilder connectUrlSb = new StringBuilder(url); connectUrlSb.append("&user=").append(username); connectUrlSb.append("&password=").append(password); Connection con = DriverManager.getConnection(connectUrlSb.toString()); return con; } catch (Exception e) { e.printStackTrace(); return null; } } private ResultSet readColumsFromJdbc(Connection connection) { try { String queryColumsSql = "select * from information_schema.columns where table_name = '" + tableName + "'"; Statement stmt = connection.createStatement(); return stmt.executeQuery(queryColumsSql); } catch (Exception e) { e.printStackTrace(); return null; } } private List<ColnumEntity> getColunFromRs(ResultSet rs) throws Exception { ResultSetMetaData metaData = rs.getMetaData(); int columns = metaData.getColumnCount(); for (int index = 1; index <= columns; index++) { // System.out.print(metaData.getColumnName(index)); // System.out.print("\t\t"); } System.out.println(); List<ColnumEntity> results = new ArrayList<ColnumEntity>(); while (rs.next()) { // for (int i = 1; i <= columns; i++){ // System.out.print(resultSet.getString(i)); // System.out.print("\t\t"); // } // System.out.println(); String columnKey = rs.getString("COLUMN_KEY");// 包含pri则为主键 String columnName = rs.getString("COLUMN_NAME"); boolean isNullAble = rs.getBoolean("IS_NULLABLE"); String dataType = rs.getString("DATA_TYPE"); String maxLength = rs.getString("CHARACTER_MAXIMUM_LENGTH"); String comment = rs.getString("COLUMN_COMMENT"); results.add(new ColnumEntity(columnKey, columnName, isNullAble, dataType, maxLength, comment)); } return results; } //注解加在field上 public void genModelClass() { try { Connection con = getDbConnection(); ResultSet resultSet = readColumsFromJdbc(con); List<ColnumEntity> colnumEntities = getColunFromRs(resultSet); StringBuilder sb = new StringBuilder(); sb.append("import java.io.Serializable;"); sb.append("import java.util.Date;"); sb.append("import javax.persistence.Column;"); sb.append("import javax.persistence.Entity;"); sb.append("import javax.persistence.Id;"); sb.append("import javax.persistence.Table;"); sb.append("import javax.validation.constraints.NotNull;"); sb.append("import org.hibernate.validator.constraints.NotBlank;"); sb.append("import cn.com.maitao.common.model.BaseObject;"); sb.append("@Entity").append("\n"); sb.append(String.format("@Table(name = \"%s\")", tableName)); sb.append("@SuppressWarnings(\"serial\")"); sb.append("public class ").append(tableClassName).append(" extends BaseObject implements Serializable").append("{") .append("\n"); //field for (ColnumEntity colnumEntity : colnumEntities) { String columnName = colnumEntity.columnName; String fieldName = genFieldName(columnName); String dataType = getDataType(colnumEntity); sb.append("\t//").append(colnumEntity.comment).append("\n"); // field if (colnumEntity.columnKey.equalsIgnoreCase("pri")) { sb.append("@Id").append("\n"); } if (!colnumEntity.isNullAble) { if (dataType.equals("String")) { sb.append(String.format("@NotBlank(message = \"%s不能为空\")", fieldName)).append("\n"); } else { sb.append(String.format("@NotNull(message = \"%s不能为空\")", fieldName)).append("\n"); } } sb.append(String.format("@Column(name = \"%s\")", columnName)); sb.append(String.format(field_Pattern, dataType, fieldName)).append("\n\n"); } for (ColnumEntity colnumEntity : colnumEntities) { String columnName = colnumEntity.columnName; String fieldName = genFieldName(columnName); String dataType = getDataType(colnumEntity); //sb.append("\t//").append(colnumEntity.comment).append("\n"); // set sb.append(String.format(method_Set_Pattern, firstToUpperCase(fieldName), dataType, fieldName, fieldName, fieldName)) .append("\n"); // get sb.append(String.format(method_Get_Pattern, dataType, firstToUpperCase(fieldName), fieldName)).append("\n"); } sb.append("}"); System.out.println(sb.toString()); } catch (Exception e) { e.printStackTrace(); } } private String field_Pattern = "private %s %s;"; private String method_Get_Pattern = "public %s get%s(){return this.%s;} "; private String method_Set_Pattern = "public void set%s(%s %s){this.%s = %s;} "; private String getDataType(ColnumEntity colnumEntity) { String type = colnumEntity.dataType.toLowerCase(); if (type.equalsIgnoreCase("datetime") || type.equalsIgnoreCase("date") || type.equalsIgnoreCase("time") || type.equalsIgnoreCase("timestamp")) { return "Date"; } if (type.equalsIgnoreCase("bigint")) { return "Long"; } else if (type.contains("int")) { return "Integer"; } if (type.equalsIgnoreCase("float")) { return "Float"; } if (type.equalsIgnoreCase("double") || type.equalsIgnoreCase("decimal")) { return "Double"; } return "String"; } class ColnumEntity { String columnKey; String columnName; boolean isNullAble; String dataType; String maxLength; String comment; public ColnumEntity(String columnKey, String columnName, boolean isNullAble, String dataType, String maxLength, String comment) { super(); this.columnKey = columnKey; this.columnName = columnName; this.isNullAble = isNullAble; this.dataType = dataType; this.maxLength = maxLength; this.comment = comment; } } private static final Pattern pattern = Pattern.compile("_(\\w)"); public static String genFieldName(String columnName) { Matcher matcher = pattern.matcher(columnName); while (matcher.find()) { columnName = columnName.replaceFirst(matcher.group(0), matcher.group(1).toUpperCase()); } columnName.replaceAll("_", ""); return columnName; } // 将首字母改成大写 private String firstToUpperCase(String str) { if (StringUtils.isBlank(str)) { return ""; } if (str.length() == 1) { return str.toUpperCase(); } StringBuilder sb = new StringBuilder(); sb.append(str.substring(0, 1).toUpperCase()); sb.append(str.substring(1, str.length())); return sb.toString(); } public static void main(String[] args) { ModelClassBuilder builder = new ModelClassBuilder("notice_wx_template", "NoticeWxTemplateModel"); builder.genModelClass(); }}
0 0
- 利用JDBC根据表结构生成ModelClass
- 利用PowerDesigner12、MySql、JDBC反向数据库结构、生成ER图
- 根据表结构自动生成mybatis文件
- 根据数据库表结构自动生成类结构
- 利用JDBC连接池封装类自动根据mysql数据库生成对应的model类
- 根据数据库结构生成TreeView
- 根据编码生成树状结构。
- 根据数据库结构生成TreeView
- 利用excel生成pdm表结构
- 根据基本表结构及其数据生成INSERT...的SQL
- 根据基本表结构及其数据生成 INSERT ... 的 SQL
- 根据Ibatis的SqlMap配置文件生成表结构
- 根据数据库表结构生成javabean的eclipse插件
- 根据数据库表结构生成javabean的eclipse插件
- xorm根据数据库表生成对应的结构体
- 利用POI和JDBC校验数据库表结构
- 利用Excel的vba脚本根据数据库表结构自动生成java的action,bean,dao,mode,service,xml,sql,jsp等
- 利用 Headless Chrome 根据url生成pdf
- python中的enumerate
- Spring Batch学习之路- 简介(一)
- 【JavaWeb探究】自定义JSP标签(二)
- hello world
- Oracle中单引号的使用
- 利用JDBC根据表结构生成ModelClass
- Simplify Path
- Objective-C---5---字典,集合
- CooradicatoarLayout 介绍
- B树、B+树、AVL树、红黑树
- Swift学习-属性(十)
- 九月英语
- [C/C++标准库]_[初级]_[使用ctype里的isxxx函数时要注意的事项]
- set autotrace on 报cannot set autotrace错误