zoukankan      html  css  js  c++  java
  • java获取mysql数据库表、字段、字段类型、字段注释

      最近想要写一个根据数据库表结构生成实体、mapper接口、mapping映射文件、service类的简单代码生成工具,所以查阅了一些资料,怎样获取数据库的表、表中字段、字段类型、字段注释等信息。

      最后写了一个简单的工具类,代码如下:

    package com.lnjecit.generator.util;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.sql.*;
    import java.util.ArrayList;
    import java.util.List;
    
    public class DatabaseUtil {
        private final static Logger LOGGER = LoggerFactory.getLogger(DatabaseUtil.class);
    
        private static final String DRIVER = "com.mysql.jdbc.Driver";
        private static final String URL = "jdbc:mysql://localhost:3306/javaweb?useUnicode=true&characterEncoding=utf8";
        private static final String USERNAME = "root";
        private static final String PASSWORD = "mysql";
    
        private static final String SQL = "SELECT * FROM ";// 数据库操作
    
        static {
            try {
                Class.forName(DRIVER);
            } catch (ClassNotFoundException e) {
                LOGGER.error("can not load jdbc driver", e);
            }
        }
    
        /**
         * 获取数据库连接
         *
         * @return
         */
        public static Connection getConnection() {
            Connection conn = null;
            try {
                conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
            } catch (SQLException e) {
                LOGGER.error("get connection failure", e);
            }
            return conn;
        }
    
        /**
         * 关闭数据库连接
         * @param conn
         */
        public static void closeConnection(Connection conn) {
            if(conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    LOGGER.error("close connection failure", e);
                }
            }
        }
    
        /**
         * 获取数据库下的所有表名
         */
        public static List<String> getTableNames() {
            List<String> tableNames = new ArrayList<>();
            Connection conn = getConnection();
            ResultSet rs = null;
            try {
                //获取数据库的元数据
                DatabaseMetaData db = conn.getMetaData();
                //从元数据中获取到所有的表名
                rs = db.getTables(null, null, null, new String[] { "TABLE" });
                while(rs.next()) {
                    tableNames.add(rs.getString(3));
                }
            } catch (SQLException e) {
                LOGGER.error("getTableNames failure", e);
            } finally {
                try {
                    rs.close();
                    closeConnection(conn);
                } catch (SQLException e) {
                    LOGGER.error("close ResultSet failure", e);
                }
            }
            return tableNames;
        }
    
        /**
         * 获取表中所有字段名称
         * @param tableName 表名
         * @return
         */
        public static List<String> getColumnNames(String tableName) {
            List<String> columnNames = new ArrayList<>();
            //与数据库的连接
            Connection conn = getConnection();
            PreparedStatement pStemt = null;
            String tableSql = SQL + tableName;
            try {
                pStemt = conn.prepareStatement(tableSql);
                //结果集元数据
                ResultSetMetaData rsmd = pStemt.getMetaData();
                //表列数
                int size = rsmd.getColumnCount();
                for (int i = 0; i < size; i++) {
                    columnNames.add(rsmd.getColumnName(i + 1));
                }
            } catch (SQLException e) {
                LOGGER.error("getColumnNames failure", e);
            } finally {
                if (pStemt != null) {
                    try {
                        pStemt.close();
                        closeConnection(conn);
                    } catch (SQLException e) {
                        LOGGER.error("getColumnNames close pstem and connection failure", e);
                    }
                }
            }
            return columnNames;
        }
    
        /**
         * 获取表中所有字段类型
         * @param tableName
         * @return
         */
        public static List<String> getColumnTypes(String tableName) {
            List<String> columnTypes = new ArrayList<>();
            //与数据库的连接
            Connection conn = getConnection();
            PreparedStatement pStemt = null;
            String tableSql = SQL + tableName;
            try {
                pStemt = conn.prepareStatement(tableSql);
                //结果集元数据
                ResultSetMetaData rsmd = pStemt.getMetaData();
                //表列数
                int size = rsmd.getColumnCount();
                for (int i = 0; i < size; i++) {
                    columnTypes.add(rsmd.getColumnTypeName(i + 1));
                }
            } catch (SQLException e) {
                LOGGER.error("getColumnTypes failure", e);
            } finally {
                if (pStemt != null) {
                    try {
                        pStemt.close();
                        closeConnection(conn);
                    } catch (SQLException e) {
                        LOGGER.error("getColumnTypes close pstem and connection failure", e);
                    }
                }
            }
            return columnTypes;
        }
    
        /**
         * 获取表中字段的所有注释
         * @param tableName
         * @return
         */
        public static List<String> getColumnComments(String tableName) {
            List<String> columnTypes = new ArrayList<>();
            //与数据库的连接
            Connection conn = getConnection();
            PreparedStatement pStemt = null;
            String tableSql = SQL + tableName;
            List<String> columnComments = new ArrayList<>();//列名注释集合
            ResultSet rs = null;
            try {
                pStemt = conn.prepareStatement(tableSql);
                rs = pStemt.executeQuery("show full columns from " + tableName);
                while (rs.next()) {
                    columnComments.add(rs.getString("Comment"));
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                if (rs != null) {
                    try {
                        rs.close();
                        closeConnection(conn);
                    } catch (SQLException e) {
                        LOGGER.error("getColumnComments close ResultSet and connection failure", e);
                    }
                }
            }
            return columnComments;
        }
        public static void main(String[] args) {
            List<String> tableNames = getTableNames();
            System.out.println("tableNames:" + tableNames);
            for (String tableName : tableNames) {
                System.out.println("ColumnNames:" + getColumnNames(tableName));
                System.out.println("ColumnTypes:" + getColumnTypes(tableName));
                System.out.println("ColumnComments:" + getColumnComments(tableName));
            }
        }
    }

    在运行代码之前,先将数据库配置进行修改,再运行代码就可以获取数据库表的详细结构了。

    后续可以以此为基础写一个通过表结构生成实体、接口、映射文件的简单代码生成器。减少ssm项目开发中编码工作。

    每天进步一点点,共勉!

  • 相关阅读:
    磁盘调度算法
    Maven 的 学习笔记
    文档结构
    变量
    进入SQL*Plus环境 (常用命令)
    PAT甲级 1050 String Subtraction (20分)(当读一行时(gets用不了))
    PAT甲级 1095 Cars on Campus (30分)(map + 排序)
    图书管理系统
    学生成绩管理系统
    磁盘调度算法
  • 原文地址:https://www.cnblogs.com/zuidongfeng/p/7895090.html
Copyright © 2011-2022 走看看