DatabaseMetaData 接口: 获取数据库,,,表,,列,,等元数据信息


jdbc使用:

// 获取一个连接
Connection connection = DriverManager.getConnection(url,username,password);

// 获取执行对象 statement,,或者 preparedStatement
Statement statement = connection.createStatement();

// 执行后获取结果集
 String sql= "select * from user";
 ResultSet resultSet = statement.executeQuery(sql);

// 遍历ResultSet 获取结果
while(resultSet.next()){
	// ...
}

// 关闭资源
resultSet.close();
statement.close()
connection.close()

DatabaseMetaData 获取元数据信息 connection.getMetaData() 会传很多参数,
jdbc获取数据库元数据信息-LMLPHP

获取表 : connection.getTables()
获取字段: connection.getColumns()
获取主键: connection.getPrimaryKey()

返回的得到的 ResultSet 可以获取到这些元数据,,比如 ,字段名字,字段大小,字段类型,字段是否允许为空,字段的备注,,

自己写一个mybatis的代码生成器:
  1. 要获取每一个表的元数据,,
    设置一个类来接收,,
/**
 * 描述表的信息
 */
@Data
public class TableClass {
    /**
     * 表名字
     */
    private String tableName;
    /**
     * 生成的model的名字
     */
    private String modelName;
    private String serviceName;
    private String mapperName;
    private String packageName;
    /**
     * 每一个表有很多的字段
     */
    private List<ColumnClass> columns;
}
@Data
public class ColumnClass {
    /**
     * 对应的java属性的名字
     */
    private String propertyName;
    /**
     * 数据库中的名字
     */
    private String columnName;

    /**
     * 字段的类型,,在数据库中的类型
     */
    private String type;
    /**
     * 备注
     */
    private String remark;
    /**
     * 是否是主键
     */
    private Boolean isPrimary;
}

就需要知道 Table的元数据,,,每一个Field的元数据,,根据Field的不同的类型使用不同的java类型去转换,,,,需要知道每一个Field是否是主键,,主键的xxxMapper.xml 中的写法不同,,
通过DatabaseMetaData获取到了元数据之后,转换成相应的实体类,,,,
就变成了一个一个的 TableClass ,

  1. 准备freemarker 模板,,model,mapper,service,controller的模板,,
  2. 将模板结合获取到的 TableClass的集合,,生成每一个表对应的 model,mapper,service等

freemarker的使用

    public void test() throws TemplateException, IOException {
        // 获取一个连接
        Configuration configuration = new Configuration(Configuration.VERSION_2_3_31);
        // 设置模板的位置
        configuration.setClassLoaderForTemplateLoading(this.getClass().getClassLoader(),"templates");
        // 获取模板
        Template template = configuration.getTemplate("hehe.ftl");

        HashMap<String, Object> map = new HashMap<>();
        map.put("name","cc");

        StringWriter out = new StringWriter();
        // 生成
        template.process(map,out);
        System.out.println(out.toString());
    }

代码:

   public void getMeta() throws SQLException {
        Connection connection = this.getConnection();
        // DatabaseMetaData: 数据库,表,列等元数据信息
        DatabaseMetaData metaData = connection.getMetaData();
        // 数据库名:  null表示所有数据库的表信息
        String catalog = "mybatisplus";
        // 模式名, null表示所有模式的表
        String schemaPattern = null;
        // 表名模式 ,,%表示所有表信息
        String tableNamePattern = "%user";
        // 表示获取  表信息
        String[] types = {"TABLE"};

        ResultSet resultSet = metaData.getTables(catalog, schemaPattern, tableNamePattern, types);

        while (resultSet.next()){
            String tableCatalog = resultSet.getString("TABLE_CAT");
            String remarks = resultSet.getString("REMARKS");
            String tableName = resultSet.getString("TABLE_NAME");
            String tableType = resultSet.getString("TABLE_TYPE");

            System.out.println("tableCatalog = " + tableCatalog);
            System.out.println("remark = " + remarks);
            System.out.println("tableName = " + tableName);
            System.out.println("tableType = " + tableType);
        }

        resultSet.close();
        connection.close();
    }

    public void getColumns() throws SQLException {
        Connection connection = this.getConnection();

        DatabaseMetaData metaData = connection.getMetaData();
        ResultSet tableResultSet = metaData.getTables("mybatisplus", null, "%user", new String[]{"TABLE"});

        while (tableResultSet.next()){
            String tableName = tableResultSet.getString("TABLE_NAME");

            ResultSet columnsResultSet = metaData.getColumns("mybatisplus", null, tableName, null);
            while (columnsResultSet.next()){
                String columnName = columnsResultSet.getString("COLUMN_NAME");
                String dataType = columnsResultSet.getString("TYPE_NAME");
                String columnSize = columnsResultSet.getString("COLUMN_SIZE");
                Object isNullable = columnsResultSet.getObject("IS_NULLABLE");
                String remarks = columnsResultSet.getString("REMARKS");

                System.out.println("columnName = " + columnName);
                System.out.println("dataType = " + dataType);
                System.out.println("columnSize = " + columnSize);
                System.out.println("isNullable = " + isNullable);
                System.out.println("remark = " + remarks);
                System.out.println();

                ResultSet primaryKeysResultSet = metaData.getPrimaryKeys("mybatisplus", null, tableName);
                while (primaryKeysResultSet.next()){
                    // 是否是主键
                }
            }
            columnsResultSet.close();
        }

        tableResultSet.close();
        connection.close();


    }

}

07-02 10:54