必威体育Betway必威体育官网
当前位置:首页 > IT技术

使用DatabaseMetaData获取数据库元数据来自动创建表等操作

时间:2019-07-24 16:13:21来源:IT技术作者:seo实验室小编阅读:50次「手机版」
 

databasemetadata

背景:最近有这么一个需求,需要在serviceB服务器上的数据库databaseB中每月创建一个表tableB_month,然后每月将serviceA服务器上的数据库databaseA里的表tableA里面的数据导入到tableB_month数据库里面,数据库为mysql数据库。还不给root权限账户,不能用linux脚本实现了(本来我也不会 >-_->)!

查了点资料,找到java里面的一个databasemetadata类(谷歌版api:http://blog.fondme.cn:8000/apidoc/jdk-1.8-Google/),可以使用。

然后就得到了如下代码,可惜的是并没有找到能完全区分出来unique KEY、KEY、 FULLTEXT KEY这三种索引类型的方法,所以下面的代码也是个半成品。代码里面的注释也听详细了,有兴趣的可以看一下。



package com.htjt.netctrl.utils;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.statement;

import org.Springframework.util.StringUtils;

public class TestConnectionMysql {
    public static void main(String[] args) throws Exception {
        // 驱动
        String driver = "com.mysql.jdbc.Driver";
        // 数据库连接
        String url = "jdbc:mysql://localhost:3306/test";
        // 用户名
        String user = "root";
        // 数据库密码
        String password = "123456";
        // 加载驱动
        class.forname(driver);
        // 获取链接
        Connection connection = DriverManager.getConnection(url, user, password);
        //数据库名
        String tableName = "gov_vehicle_2018_05";

        DatabaseMetaData dBMetaData = connection.getMetaData();

        ResultSet colSet = dBMetaData.getColumns(null, "%", tableName, "%");

        String newTabaleName = tableName + "2018_16";
        // 拼成SQL语句
        stringbuilder sql = new StringBuilder();
        sql.APPend("CREATE TABLE `").append(newTabaleName).append("`"); // 建表
        sql.append("(");

        while (colSet.next()) {
            sql.append("`").append(colSet.getString("COLUMN_NAME")).append("` "); // 列名称
            sql.append(colSet.getString("TYPE_NAME")); // 列类型
            String typeName = colSet.getString("TYPE_NAME").trim();
            if(!"FLOAT".equals(typeName) && !"TIMESTAMP".equals(typeName)) {
                sql.append("(").append(colSet.getString("COLUMN_SIZE")).append(") "); // 列大小
            }else if("TIMESTAMP".equals(typeName)) {
                sql.append(" NULL ");
            }
            if ("0".equals(colSet.getString("NULLABLE"))) { // 是否允许使用空
                if (StringUtils.isempty(colSet.getString("COLUMN_DEF"))) { // 该列的默认值
                    sql.append(" NOT NULL");
                } else {

                    sql.append(" DEFAULT '").append(colSet.getString("COLUMN_DEF")).append("'");
                }
            } else {
                sql.append(" DEFAULT NULL ");
            }
            sql.append(" comment ").append("'").append(colSet.getString("REMARKS")).append("' ,"); // 列注释
            // sql.append(colSet.getString("IS_AUTOINCREMENT")); // 该列是否自动增加 YES:自增,
            // NO:不自增,空字符串:不确定是否自增
        }
        sql.deleteCharAt(sql.length()-1);
        sql.append(")");

        colSet.close();

        String schema = null;

        // 检索给定表的索引和统计信息的描述。
        ResultSet indexInfo = dBMetaData.getIndexInfo(null, null, tableName, false, false);
        String indexstr = "";
        while (indexInfo.next()) {
            System.out.println("表名:" + indexInfo.getString("TABLE_NAME"));
            System.out.println("索引值不唯一:" + indexInfo.getString("NON_UNIQUE"));
            System.out.println("索引名称:" + indexInfo.getString("INDEX_NAME"));
            System.out.println("索引类型:" + indexInfo.getString("TYPE"));
            System.out.println("索引类别:" + indexInfo.getString("INDEX_QUALIFIER"));
            //就是这个地方,我数据库中的表里面有 UNIQUE KEY、KEY、 FULLTEXT KEY,
            //在这里无法区分出来,就无法生成准确的建表sql,所以就没有拼接到sql里面去
            int index = indexInfo.getInt("TYPE");
            switch (index) {
                case 0: {
                    indexstr = "没有索引";
                    break;
                }
                case 1: {
                    indexstr = "聚集索引";
                    break;
                }
                case 2: {
                    indexstr = "哈希表索引";
                    break;
                }
                case 3: {
                    indexstr = "其它索引";
                    break;
                }
            }
            System.out.println("索引中的列序列号:" + indexInfo.getString("ordinal_POSITION"));
            System.out.println("列名称:" + indexInfo.getString("COLUMN_NAME"));
            System.out.println("行数或索引中唯一值的数量:" + indexInfo.getString("CARDINALITY"));
            System.out.println("页数,否则是当前索引使用的页数:" + indexInfo.getString("PAGES"));
        }
        indexInfo.close();

        System.out.println("----------------主键列-----------------");

        // 检索给定表的主键列的描述。
        ResultSet primarykeys = dBMetaData.getPrimaryKeys(null, null, tableName);
        while (primaryKeys.next()) {
            System.out.println("表目录:" + primaryKeys.getString("TABLE_CAT"));
            System.out.println("表格式:" + primaryKeys.getString("TABLE_SCHEM"));
            System.out.println("表名:" + primaryKeys.getString("TABLE_NAME"));
            System.out.println("列名:" + primaryKeys.getString("COLUMN_NAME"));
            System.out.println("主键中的序列号:" + primaryKeys.getString("KEY_SEQ"));
            System.out.println("主键名称:" + primaryKeys.getString("PK_NAME"));
        }
        primaryKeys.close();
        // System.out.println("\n建表: " + sql);

//       执行建表操作
        System.out.println("\n建表: " + sql);
         Statement st = connection.createStatement();
         st.executeUpdate(sql.toString());
         st.close();

        connection.close();

    }

}

若有哪位 大神知道怎么用DatabaseMetaData这个类或者其他的类能区分出来UNIQUE KEY、KEY、 FULLTEXT KEY这三种索引,还请不吝赐教,先在此拜谢!

相关阅读

京东直播怎么看回放?手机端操作流程

京东直播具有即时性,为了让那些错过了精彩直播的买家可以看到,商家可以设置直播回放功能,但是很多买家朋友不知道怎么看直播回放?今

淘宝旺旺红包授权如何操作?怎么发红包?

淘宝店铺开通子账号一方面是为了分工,另一方面也是为了授权给一些临时的人,比如装修美工、数据优化等、店铺运营等,如果没有合适的子

微信群怎么搜索消息记录?操作方法详解

大家在使用微信的时候,除了使用微信红包和微信转账的功能之外,最多使用的功能还是聊天功能和朋友圈发布的功能,当然大家在使用微信聊

京东赠品促销是什么意思?商家如何操作?

在京东,一到活动的时间,相信商家们都是会比较的忙碌,毕竟这将是一场流量的“战争”,影响的将是店铺在这个阶段的总体效益。所以说活动

Linux下百度云盘怎么用,操作简单,还不限速,最后竟然还能

说好的要下载数据集进行论文复现的,所以没有百度云盘怎么能行。我们今天的目的就是在Linux下弄好百度云盘,然后下载我云盘里的阅后

分享到:

栏目导航

推荐阅读

热门阅读