利用JDBC根据表结构生成ModelClass


有时为了加快开发效率,特别是项目初始阶段,数据库设计完成之后,希望直接读取表结构以生成数据库实体。本例中为生成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();
    }

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用MyBatis Generator生成映射类的示例代码,你可以参考一下: 1. 添加MyBatis Generator的依赖 在项目的pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.4.0</version> </dependency> ``` 2. 创建MyBatis Generator的配置文件 在项目中创建一个名为generatorConfig.xml的文件,配置数据源信息和生成器信息。以下是一个示例配置文件: ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <context id="DB2Tables" targetRuntime="MyBatis3"> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test" userId="root" password="root"> </jdbcConnection> <javaTypeResolver > <property name="forceBigDecimals" value="false" /> </javaTypeResolver> <javaModelGenerator targetPackage="com.example.model" targetProject="src/main/java"> <property name="enableSubPackages" value="true" /> <property name="trimStrings" value="true" /> </javaModelGenerator> <sqlMapGenerator targetPackage="com.example.mapper" targetProject="src/main/resources"> <property name="enableSubPackages" value="true" /> </sqlMapGenerator> <javaClientGenerator type="XMLMAPPER" targetPackage="com.example.mapper" targetProject="src/main/java"> <property name="enableSubPackages" value="true" /> </javaClientGenerator> <table schema="test" tableName="user"> <generatedKey column="id" sqlStatement="MySql" identity="true" /> </table> </context> </generatorConfiguration> ``` 3. 运行MyBatis Generator 在项目根目录下打开命令行工具,输入以下命令来运行MyBatis Generator: ```bash java -jar mybatis-generator-core-x.x.x.jar -configfile generatorConfig.xml -overwrite ``` 其中,mybatis-generator-core-x.x.x.jar是MyBatis Generator的jar包文件,x.x.x示版本号;generatorConfig.xml是上一步创建的配置文件。 运行完毕后,就会在指定的目录下生成对应的映射类、XML映射文件和Mapper接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值