Java获取mysql数据库表信息代码

Java中使用JDBC获取MySQL数据库的名称、表名和字段名及相关信息
原生Jdbc获取库、表、字段

代码

import java.sql.*;
import java.util.Objects;

public class MysqlDemo {

    // 1.加载JDBC驱动
    private static final String DRIVER = "com.mysql.cj.jdbc.Driver";

    static {
        try {
            Class.forName(DRIVER);
        } catch (ClassNotFoundException e) {
            System.out.println("加载驱动失败:" + e);
        }
    }

    // 2.获取连接
    public static Connection getConnection(String url, String userName, String password) {
        Connection connection = null;
        try {
            // 创建连接
            connection = DriverManager.getConnection(url, userName, password);
        } catch (SQLException e) {
            System.out.println("获取连接失败:" + e);
        }
        return connection;
    }

    // 3. 获取数据库列表名称
    public static void getDataBase(String url, String userName, String password) {
        DatabaseMetaData databaseMetaData;
        ResultSet catalogResultSet = null;
        try (Connection connection = getConnection(url, userName, password)) {
            databaseMetaData = connection.getMetaData();
            catalogResultSet = databaseMetaData.getCatalogs();
            while (catalogResultSet.next()) {
                String databaseName = catalogResultSet.getString(1);
                // 去除系统表
                if ("information_schema".equals(databaseName)
                        || "mysql".equals(databaseName)
                        || "performance_schema".equals(databaseName)
                        || "sys".equals(databaseName)) {
                    continue;
                }
                System.out.println("DataBase : " + databaseName);
            }
        } catch (SQLException e) {
            System.out.println("获取数据库名称失败:" + e);
        } finally {
            close(catalogResultSet);
        }
    }

    // 4.获取数据库表名称
    public static void getTables(String url, String userName, String password) {
        // 1、连接数据库, 控制台打印出这个数据库里面所有的表
        ResultSet resultSet = null;
        try (Connection connection = getConnection(url, userName, password)) {
            DatabaseMetaData databaseMetaData = connection.getMetaData();
            // 可用可不用
            String[] types = {"TABLE"};
            resultSet = databaseMetaData.getTables(connection.getCatalog(), null, "%", types);
            while (resultSet.next()) {
                System.out.println("database : " + resultSet.getString(1) + " ==== table : " + resultSet.getString(3));
            }
        } catch (SQLException e) {
            System.out.println("获取数据库所有表名失败:" + e);
        } finally {
            close(resultSet);
        }
    }

    // 5. 获取表的字段及类型
    public static void getColumns(String tableName, String url, String userName, String password) {
        String query = "SELECT * FROM " + tableName;
        try (Connection connection = getConnection(url, userName, password);
             PreparedStatement statement = connection.prepareStatement(query)) {
            ResultSetMetaData resultSetMetaData = statement.getMetaData();
            System.out.println("table : " + tableName);
            for (int i = 0; i < resultSetMetaData.getColumnCount(); i++) {
                System.out.println("ColumnName : " + resultSetMetaData.getColumnName(i + 1));
                System.out.println("ColumnTypeName : " + resultSetMetaData.getColumnTypeName(i + 1));
                // 获取字段注释
                DatabaseMetaData dbmd = connection.getMetaData();
                ResultSet columnResultSet = dbmd.getColumns(null, null, tableName, resultSetMetaData.getColumnLabel(i + 1));
                if (columnResultSet.next()) {
                    String columnComment = columnResultSet.getString("REMARKS");
                    System.out.println("columnComment : " + columnComment);
                } else {
                    System.out.println("columnComment : " + "");
                }
            }
        } catch (SQLException e) {
            System.out.println("获取数据库表字段和类型失败:" + e);
        }
    }

    // 6.获取表字段对应的内容
    public static void getRows(String tableName, String url, String userName, String password) {
        String query = "SELECT * FROM " + tableName + " LIMIT 0, 10";
        ResultSet resultSet = null;
        try (Connection connection = getConnection(url, userName, password);
             PreparedStatement statement = connection.prepareStatement(query)) {
            ResultSetMetaData resultSetMetaData = statement.getMetaData();
            resultSet = statement.executeQuery();
            System.out.println("table : " + tableName);
            while (resultSet.next()) {
                for (int i = 0; i < resultSetMetaData.getColumnCount(); i++) {
                    System.out.println(resultSetMetaData.getColumnName(i + 1) + ": " + resultSet.getString(i + 1));
                }
            }
        } catch (SQLException e) {
            System.out.println("获取数据库表字段对应内容失败:" + e);
        } finally {
            close(resultSet);
        }
    }

    // 7. 获取数据库相关信息
    public static void getDataBaseInfo(String url, String userName, String password) {
        ResultSet resultSet = null;
        try (Connection connection = getConnection(url, userName, password)) {
            DatabaseMetaData dbmd = connection.getMetaData();
            System.out.println("数据库已知的用户: " + dbmd.getUserName());
            System.out.println("数据库的系统函数: " + dbmd.getSystemFunctions());
            System.out.println("数据库的时间和日期函数: " + dbmd.getTimeDateFunctions());
            System.out.println("数据库的字符串函数: " + dbmd.getStringFunctions());
            System.out.println("数据库供应商用于 'schema' 的首选术语: " + dbmd.getSchemaTerm());
            System.out.println("数据库URL: " + dbmd.getURL());
            System.out.println("是否允许只读:" + dbmd.isReadOnly());
            System.out.println("数据库的产品名称:" + dbmd.getDatabaseProductName());
            System.out.println("数据库的版本:" + dbmd.getDatabaseProductVersion());
            System.out.println("驱动程序的名称:" + dbmd.getDriverName());
            System.out.println("驱动程序的版本:" + dbmd.getDriverVersion());
            System.out.println("数据库中使用的表类型:");
            resultSet = dbmd.getTableTypes();
            while (resultSet.next()) {
                System.out.println(resultSet.getString("TABLE_TYPE"));
            }
        } catch (SQLException e) {
            System.out.println("获取数据库相关信息失败:" + e);
        } finally {
            close(resultSet);
        }
    }

    // 8.关闭连接
    public static void close(Object o) {
        if (Objects.isNull(o)) {
            return;
        }
        try {
            if (o instanceof ResultSet) {
                ((ResultSet) o).close();
            } else if (o instanceof Statement) {
                ((Statement) o).close();
            } else if (o instanceof Connection) {
                Connection con = (Connection) o;
                if (!con.isClosed()) {
                    con.close();
                }
            }
        } catch (SQLException e) {
            System.out.println("关闭连接失败:" + e);
        }
    }

    // 测试
    public static void main(String[] args) throws SQLException {
        // 对应url、userName、password需换成自己配置的内容
        System.out.println("======================");
        getDataBase("jdbc:mysql://127.0.0.1:3306?serverTimezone=UTC", "root", "root");
        System.out.println("======================");
        getTables("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC", "root", "root");
        System.out.println("======================");
        getColumns("u_user", "jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC", "root", "root");
        System.out.println("======================");
        getRows("u_user", "jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC", "root", "root");
        System.out.println("======================");
        getDataBaseInfo("jdbc:mysql://127.0.0.1:3306?serverTimezone=UTC", "root", "root");
        System.out.println("======================");
    }
}



输出如下

======================
DataBase : 0520erp
DataBase : activiti2
DataBase : ambient_monitor
DataBase : blog
DataBase : blog_db
DataBase : boot-blog
DataBase : box-im
DataBase : car_o2o
DataBase : chat
DataBase : cloud-order
DataBase : cloud-user
DataBase : crud
DataBase : customer_center
DataBase : db_admin
DataBase : db_mblog
DataBase : demo_01
DataBase : easybbs
DataBase : easyblog
DataBase : easypan
DataBase : eblog
DataBase : facility_db
DataBase : family_finance
DataBase : friday
DataBase : fyblog
DataBase : guigu-oa
DataBase : huge
DataBase : ihrm
DataBase : im
DataBase : im-core
DataBase : infipark_crm
DataBase : kefu
DataBase : lenos
DataBase : ljs_rtpt_test
DataBase : m_db
DataBase : mushan
DataBase : mybatis
DataBase : mybatis-demo
DataBase : myemployees
DataBase : nacos
DataBase : open-his
DataBase : partner
DataBase : perm
DataBase : psq_screen
DataBase : quartz-demo
DataBase : quartz-test
DataBase : resource_manage
DataBase : ry-vue
DataBase : ry_act_all
DataBase : s_db
DataBase : seata
DataBase : seata_demo
DataBase : security_db
DataBase : shiro_db
DataBase : sob_blog_system
DataBase : space
DataBase : spring_cache
DataBase : sqlpractice
DataBase : studentmanagement
DataBase : students
DataBase : study-security
DataBase : test
DataBase : thatblog
DataBase : timeless_chat_websocket
DataBase : tj
DataBase : tp_music
DataBase : trade
DataBase : user
DataBase : vadmin
DataBase : video-system
DataBase : videodb
DataBase : vue-springboot
DataBase : vueblog
DataBase : xxl_job
DataBase : yd_cloud
DataBase : yd_cloud_operation
DataBase : yd_cloud_uaa
DataBase : yeb
DataBase : z-blog
DataBase : zblog
DataBase : zipkin
======================
database : test ==== table : u_user
======================
table : u_user
ColumnName : id
ColumnTypeName : INT
columnComment : 主键
ColumnName : name
ColumnTypeName : VARCHAR
columnComment : 姓名
ColumnName : hobbies
ColumnTypeName : VARCHAR
columnComment : ing别
ColumnName : age
ColumnTypeName : INT
columnComment : 
======================
table : u_user
id: 1
name: zj
hobbies: ps,blender,java
age: null
id: 2
name: ls
hobbies: u8,u9,pmp,cpa
age: null
id: 3
name: zzhua
hobbies: spring
age: null
id: 4
name: zengjian
hobbies: null
age: null
id: 5
name: halo
hobbies: 
age: null
id: 6
name: netty
hobbies: a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z
age: null
======================
数据库已知的用户: root@localhost
数据库的系统函数: DATABASE,USER,SYSTEM_USER,SESSION_USER,PASSWORD,ENCRYPT,LAST_INSERT_ID,VERSION
数据库的时间和日期函数: DAYOFWEEK,WEEKDAY,DAYOFMONTH,DAYOFYEAR,MONTH,DAYNAME,MONTHNAME,QUARTER,WEEK,YEAR,HOUR,MINUTE,SECOND,PERIOD_ADD,PERIOD_DIFF,TO_DAYS,FROM_DAYS,DATE_FORMAT,TIME_FORMAT,CURDATE,CURRENT_DATE,CURTIME,CURRENT_TIME,NOW,SYSDATE,CURRENT_TIMESTAMP,UNIX_TIMESTAMP,FROM_UNIXTIME,SEC_TO_TIME,TIME_TO_SEC
数据库的字符串函数: ASCII,BIN,BIT_LENGTH,CHAR,CHARACTER_LENGTH,CHAR_LENGTH,CONCAT,CONCAT_WS,CONV,ELT,EXPORT_SET,FIELD,FIND_IN_SET,HEX,INSERT,INSTR,LCASE,LEFT,LENGTH,LOAD_FILE,LOCATE,LOCATE,LOWER,LPAD,LTRIM,MAKE_SET,MATCH,MID,OCT,OCTET_LENGTH,ORD,POSITION,QUOTE,REPEAT,REPLACE,REVERSE,RIGHT,RPAD,RTRIM,SOUNDEX,SPACE,STRCMP,SUBSTRING,SUBSTRING,SUBSTRING,SUBSTRING,SUBSTRING_INDEX,TRIM,UCASE,UPPER
数据库供应商用于 'schema' 的首选术语: 
数据库URL: jdbc:mysql://127.0.0.1:3306?serverTimezone=UTC
是否允许只读:false
数据库的产品名称:MySQL
数据库的版本:5.7.17-log
驱动程序的名称:MySQL Connector/J
驱动程序的版本:mysql-connector-java-8.0.13 (Revision: 66459e9d39c8fd09767992bc592acd2053279be6)
数据库中使用的表类型:
LOCAL TEMPORARY
SYSTEM TABLE
SYSTEM VIEW
TABLE
VIEW
======================

// 测试
    public static void main(String[] args) throws SQLException {
        getColumnInfos("biz_leave", "jdbc:mysql://127.0.0.1:3306/ry_act_all?serverTimezone=UTC", "root", "root");
        getColumnInfos("biz_todo_item", "jdbc:mysql://127.0.0.1:3306/ry_act_all?serverTimezone=UTC", "root", "root", 7);

    }

    // 9. 获取表的字段及类型
    public static void getColumnInfos(String tableName, String url, String userName, String password, Integer... gapLen) {
        System.out.println();
        String query = "SELECT * FROM " + tableName;

        try (Connection connection = getConnection(url, userName, password);
             PreparedStatement statement = connection.prepareStatement(query);
             PreparedStatement statement2 = connection.prepareStatement(query)) {


            TableInfo tableInfo = new TableInfo();

            // 查询表的注释
            String url1 = connection.getMetaData().getURL();
            Matcher matcher = Pattern.compile(".*?3306/([^?]+)\\??").matcher(url1);
            if (matcher.find()) {
                String dbName = matcher.group(1);
                ResultSet rs = statement2.executeQuery("SELECT TABLE_COMMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = '" + dbName+ "' AND TABLE_NAME = '"+ tableName +"'");

                if (rs.next()) {
                    // String tableComment = rs.getString("TABLE_COMMENT");
                    // System.out.println("Table Comment: " + tableComment);
                    tableInfo.setTableComment(rs.getString("TABLE_COMMENT"));
                }
                rs.close();
            }
            statement2.close();

            ResultSetMetaData resultSetMetaData = statement.getMetaData();


            List<ColumnInfo> columnInfos = new ArrayList<>();
            tableInfo.setColumnInfos(columnInfos);

            for (int i = 0; i < resultSetMetaData.getColumnCount(); i++) {

                ColumnInfo columnInfo = new ColumnInfo();
                columnInfos.add(columnInfo);

                // System.out.println("ColumnName : " + resultSetMetaData.getColumnName(i + 1));
                // System.out.println("ColumnTypeName : " + resultSetMetaData.getColumnTypeName(i + 1));

                columnInfo.setColumnName(resultSetMetaData.getColumnName(i + 1));

                // 获取字段注释
                DatabaseMetaData dbmd = connection.getMetaData();
                ResultSet columnResultSet = dbmd.getColumns(null, null, tableName, resultSetMetaData.getColumnLabel(i + 1));
                if (columnResultSet.next()) {
                    String columnComment = columnResultSet.getString("REMARKS");

                    columnInfo.setColumnComment(columnComment);

                } else {
                    System.out.println("columnComment : " + "");

                    columnInfo.setColumnComment("");
                }

            }

            int maxLen = 0;
            for (ColumnInfo columnInfo : tableInfo.getColumnInfos()) {
                if (columnInfo.getColumnName().length() > maxLen) {
                    maxLen = columnInfo.getColumnName().length();
                }
            }


            int gapChars = gapLen == null || gapLen.length == 0 ? 5 : gapLen[0];

            int maxLenPlusGapChars = maxLen + gapChars;

            System.out.println(tableName + "   " + tableInfo.getTableComment());

            for (ColumnInfo columnInfo : tableInfo.getColumnInfos()) {
                System.out.print(columnInfo.getColumnName());
                for (int i = 0; i < maxLenPlusGapChars - columnInfo.getColumnName().length(); i++) {
                    System.out.print(" ");
                }
                System.out.println(columnInfo.getColumnComment());
            }


        } catch (SQLException e) {
            System.out.println("获取数据库表字段和类型失败:" + e);
        }
    }

    @Data
    public static class TableInfo {
        private String tableComment;
        private List<ColumnInfo> columnInfos;
    }

    @Data
    private static class ColumnInfo {
        private String columnName;
        private String columnComment;
    }
biz_leave   
id                     主键ID
type                   请假类型
title                  标题
reason                 原因
start_time             开始时间
end_time               结束时间
total_time             请假时长,单位秒
instance_id            流程实例ID
create_by              创建者
create_time            创建时间
update_by              更新者
update_time            更新时间
apply_user             申请人
apply_time             申请时间
reality_start_time     实际开始时间
reality_end_time       实际结束时间

biz_todo_item   待办事项表
id                     主键 ID
item_name              事项标题
item_content           事项内容
module                 模块名称 (必须以 uri 一致)
task_id                任务 ID
instance_id            流程实例 ID
task_name              任务名称 (必须以表单页面名称一致)
node_name              节点名称
is_view                是否查看 default 0 (01)
is_handle              是否处理 default 0 (01)
todo_user_id           待办人 ID
todo_user_name         待办人名称
handle_user_id         处理人 ID
handle_user_name       处理人名称
todo_time              通知时间
handle_time            处理时间
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现 mysql 数据库迁移的代码可以使用 Java 的 JDBC API 来进行操作。下面是一个简单的示例代码: ``` import java.sql.*; public class TableMigration { public static void main(String[] args) { Connection sourceConn = null; Connection targetConn = null; try { // 配置源数据库连接 sourceConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/source_db?useSSL=false", "root", "password"); // 配置目标数据库连接 targetConn = DriverManager.getConnection("jdbc:mysql://localhost:3306/target_db?useSSL=false", "root", "password"); // 获取数据库 ResultSet rs = sourceConn.getMetaData().getTables(null, null, "%", new String[]{"TABLE"}); while (rs.next()) { String tableName = rs.getString("TABLE_NAME"); System.out.println("Migrating table " + tableName + "..."); migrateTable(sourceConn, targetConn, tableName); } System.out.println("All tables migrated successfully!"); } catch (SQLException ex) { ex.printStackTrace(); } finally { // 关闭数据库连接 if (sourceConn != null) { try { sourceConn.close(); } catch (SQLException ex) { ex.printStackTrace(); } } if (targetConn != null) { try { targetConn.close(); } catch (SQLException ex) { ex.printStackTrace(); } } } } private static void migrateTable(Connection sourceConn, Connection targetConn, String tableName) { try { // 查询源数据库的数据 Statement sourceStmt = sourceConn.createStatement(); ResultSet sourceRs = sourceStmt.executeQuery("SELECT * FROM " + tableName); // 获取数据库的列信息 ResultSetMetaData sourceMeta = sourceRs.getMetaData(); int columnCount = sourceMeta.getColumnCount(); StringBuilder columns = new StringBuilder(); for (int i = 1; i <= columnCount; i++) { String columnName = sourceMeta.getColumnName(i); String columnType = sourceMeta.getColumnTypeName(i); columns.append(columnName).append(" ").append(columnType).append(","); } columns.deleteCharAt(columns.length() - 1); // 在目标数据库中创建 Statement targetStmt = targetConn.createStatement(); targetStmt.execute("CREATE TABLE " + tableName + " (" + columns + ")"); // 循环插入数据到目标数据库中 while (sourceRs.next()) { StringBuilder values = new StringBuilder(); for (int i = 1; i <= columnCount; i++) { String value = sourceRs.getString(i); values.append("'").append(value).append("',"); } values.deleteCharAt(values.length() - 1); targetStmt.executeUpdate("INSERT INTO " + tableName + " VALUES (" + values + ")"); } // 关闭资源 sourceRs.close(); sourceStmt.close(); targetStmt.close(); } catch (SQLException ex) { ex.printStackTrace(); } } } ``` 注:以上代码仅供参考,具体需要根据不同的数据库结构进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值