首页 > 数据库 >【精品】使用druid 获取数据库表的信息

【精品】使用druid 获取数据库表的信息

时间:2023-10-14 21:04:41浏览次数:37  
标签:return String java 数据库 contains druid 精品 type public

Maven依赖

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
</dependency>
<dependency>
  <groupId>com.mysql</groupId>
  <artifactId>mysql-connector-j</artifactId>
  <version>8.0.32</version>
</dependency>

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.2.20</version>
</dependency>

自定义MySqlSchemaStatVisitor

public class MySQLVisitor extends MySqlSchemaStatVisitor {
    @Getter
    private List<Item> list = new ArrayList<>();

    @Override
    public boolean visit(SQLColumnDefinition x) {
        Item item = new Item();
        //获取列名
        String columnName = SQLUtils.normalize(x.getName().toString());
        //字段名
        item.setFieldName(columnName);
        //属性
        item.setPropertyName(StringUtil.underline2hump(columnName));
        //字段数据类型
        item.setFieldType(x.getDataType().getName());
        //属性数据类型
        item.setPropertyType(DBUtil.jdbcType2JavaType(x.getDataType().getName()));
        // 注释
        item.setFieldComment(x.getComment().toString().replace("'", ""));

        list.add(item);
        return false;
    }

    @Override
    public boolean visit(MySqlPrimaryKey x) {
        for (Item item : list) {
            final String t = x.getColumns().get(0).toString().replace("`", "");
            if (item.getFieldName().equals(t)) {
                item.setPk(true);
                return false;
            }
        }
        return false;
    }
}

获取数据表数据的工具类

public class GeneratorUtil {

    /**
     * 获取指定表的信息
     * @param tableName
     * @return
     */
    public static TableInfo getTableInfo(String tableName){
        final TableInfo tableInfo = new TableInfo();
        tableInfo.setTableName(tableName);

        //创建表的SQL语句
        String createSQL = null;
        try {
            createSQL = DBUtil.getCreateSQL(tableName);
        } catch (SQLException e) {
            e.printStackTrace();
        }

        SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(createSQL, DbType.mysql);
        SQLStatement sqlStatement = parser.parseStatement();

        MySqlCreateTableStatement mySqlCreateTableStatement = (MySqlCreateTableStatement) sqlStatement;
        //表备注
        tableInfo.setTableComment(mySqlCreateTableStatement.getComment().toString());
        //实体类类名
        tableInfo.setClassName(StringUtil.underlinePart2hump2(tableName));

        MySQLVisitor mySQLVisitor = new MySQLVisitor();
        mySqlCreateTableStatement.accept(mySQLVisitor);
        //字段列表
        tableInfo.setItemList(mySQLVisitor.getList());

        return tableInfo;
    }
}

测试代码

public class App {
    /**
     * 基础包名
     */
    private static String basePackage = "com.tiku";

    public static void main(String[] args) throws Exception {
        //获取表信息
        final TableInfo tableInfo = GeneratorUtil.getTableInfo("tb_question_type");
        System.out.println(tableInfo);
    }
}
  • 待测数据库 在这里插入图片描述

  • 结果

在这里插入图片描述

相关类

Item.java

@Getter
@Setter
@ToString
public class Item {
    /**
     * 字段名
     */
    private String fieldName;
    /**
     * 字段注释
     */
    private String fieldComment;
    /**
     * JDBC类型
     */
    private String fieldType;
    /**
     * 是否是主键
     */
    private boolean pk;
    /**
     * 属性名
     */
    private String propertyName;
    /**
     * Java类型
     */
    private String propertyType;
}

TableInfo.java

@Getter
@Setter
public class TableInfo {
    /**
     * 表名
     */
    private String tableName;
    /**
     * 表名对应的实体类的类名
     */
    private String className;
    /**
     * 表名注释
     */
    private String tableComment;
    /**
     * 字段属性列表
     */
    private List<Item> itemList;
}

DBUtil.java

public class DBUtil {
    /**
     * 获取连接
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        String url = "jdbc:mysql://localhost:3306/db_tiku?useSSL=false&serverTimezone=UTC&characterEncoding=utf8&useUnicode=true";
        return DriverManager.getConnection(url, "root", "root");
    }

    /**
     * 释放资源
     * @param conn
     * @param stmt
     * @param rs
     */
    public static void closeAll(Connection conn, Statement stmt, ResultSet rs) {
        try {
            if (rs != null) {
                rs.close();
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            } finally {
                if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        }
    }

    /**
     * 获取表注释
     * @param tableName
     * @return
     * @throws SQLException
     */
    public static String getCreateSQL(String tableName) throws SQLException {
        String sql = null;
        Connection conn = getConnection();
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("SHOW CREATE TABLE " + tableName);
        if (rs.next()) {
            //获取创建表的SQL语句
            sql = rs.getString(2);
        }
        closeAll(conn, stmt, rs);
        return sql;
    }

    /**
     * 将JDBC数据类型转换成对应的Java类型
     * @param type
     * @return
     */
    public static String jdbcType2JavaType(String type) {
        type = type.toUpperCase();
        String javaType = null;
        if (type.contains("CHAR") || type.contains("TEXT") || type.contains("ENUM") || type.contains("SET")) {
            javaType = "java.lang.String";
        } else if ("DATE".equals(type)) {
            javaType = "java.time.LocalDate";
        } else if ("DATETIME".equals(type)) {
            javaType = "java.time.LocalDateTime";
        } else if (type.contains("BIGINT")) {
            javaType = "java.lang.Long";
        } else if (type.contains("TINYINT")) {
            javaType = "java.lang.Integer";
        } else if (type.contains("INT")) {
            javaType = "java.lang.Integer";
        } else if (type.contains("BIT")) {
            javaType = "java.lang.Boolean";
        } else if (type.contains("FLOAT") || type.contains("REAL")) {
            javaType = "java.lang.Double";
        } else if (type.contains("DOUBLE") || type.contains("NUMERIC")) {
            javaType = "java.lang.Double";
        } else if (type.contains("BLOB") || type.contains("BINARY")) {
            javaType = "byte[]";
        } else if (type.contains("JSON")) {
            javaType = "java.lang.String";
        } else if (type.contains("DECIMAL")) {
            javaType = "java.math.BigDecimal";
        } else {
            System.out.println("type:" + type);
        }
        return javaType;
    }
}

StringUtil.java

public class StringUtil {

    /**
     * 首字母小写
     * @param str
     * @return
     */
    public static String first2LowerCase(String str) {
        return Character.isLowerCase(str.charAt(0)) ? str : Character.toLowerCase(str.charAt(0)) + str.substring(1);
    }

    /**
     * 首字母大写
     * @param s
     * @return
     */
    public static String first2UpperCase(String s) {
        return Character.isUpperCase(s.charAt(0)) ? s : Character.toUpperCase(s.charAt(0)) + s.substring(1);
    }

    /**
     * 下划线转驼峰
     * answer_sheet_id---answerSheetId
     * @param str
     * @return
     */
    public static String underline2hump(String str) {
        if (str.contains("_")) {
            while (str.contains("_")) {
                StringBuffer sb = new StringBuffer();
                int index = str.indexOf("_");
                for (int i = 0; i < str.length(); i++) {//把下划线后面的首字母变为大写
                    if (i == index + 1 && !(str.charAt(i) >= 65 && str.charAt(i) <= 90)) {
                        sb.append((char) (str.charAt(i) - 32));
                        continue;
                    }
                    sb.append(str.charAt(i));
                }
                str = sb.toString().replaceFirst("_", "");
            }
        }
        return str;
    }

    /**
     * 下划线转驼峰,不包含第一个下划线及其之前的部分
     * tb_answer_sheet_item  ---  AnswerSheetItem
     * @param str
     * @return
     */
    public static String underlinePart2hump2(String str) {
        String tb = str.trim();
        String temp = first2UpperCase(str);//user--User
        if (tb.indexOf('_') > 0) {//tb_user ---- User
            temp = first2UpperCase(tb.substring(tb.indexOf('_') + 1));
        }//User_sth
        return underline2hump(temp);//user_sth----UserSth
    }


    public static void main(String[] args) {
        System.out.println(underline2hump("answer_sheet_id"));
        System.out.println(underlinePart2hump2("tb_answer_sheet_item"));
    }
}

标签:return,String,java,数据库,contains,druid,精品,type,public
From: https://blog.51cto.com/lianghecai/7863144

相关文章

  • strapi系列-常用操作记录(创建中间件,创建关系型数据库,数据去掉attributes那一层)
    创建全局中间件创建关系型的数据https://docs.strapi.io/dev-docs/api/rest/relations{"product_types":{"connect":[10]},"product_tags":{"connect":[7,3,4]},"name":"TEST","......
  • 如何理解关系型数据库的常见设计范式?
    关系型数据库的常见设计范式有第一范式、第二范式和第三范式,分别简称为1NF、2NF和3NF。第一范式(1NF)是指一个关系(表)中的每个属性(列)都是不可分割的原子值。也就是说,如果一个属性可以被分成更小的子属性,那么它就不符合第一范式。例如,一个包含“姓名”和“地址”两个属性的表不符合第一......
  • Oracle数据库
    Ⅰ数据库①层次型数据库②网状型数据库③关系型数据库(主要介绍)E-R图:属性(椭圆形),实体(矩形),联系(菱形-一对一、一对多、多对多)注:有的联系也有属性关系型数据库的设计范式:第一范式(1NF):属性不可再分,字段保证原子性第二范式(2NF):在满足1NF的基础上,要求表中的每条记......
  • 数据库期末考试试卷
    数据库期末考试试卷一、填空题(每题5分,共25分)在关系型数据库中,数据按照______的形式进行组织和存储。在SQL语言中,用于从数据库表中查询数据的关键字是______。在关系型数据库中,用于确保数据的一致性和完整性的约束条件包括主键约束、外键约束和______约束。在数据库的ACID特......
  • 数据库SQL实战|牛客网
    查找最晚入职员工的所有信息.描述有一个员工employees表简况如下: 请你查找employees里最晚入职员工的所有信息,以上例子输出如下: 输入:droptableifexists`employees`;CREATETABLE`employees`(`emp_no`int(11)NOTNULL,`birth_date`dateNOTNULL,`first_na......
  • openGauss学习笔记-99 openGauss 数据库管理-管理数据库安全-客户端接入认证之配置文
    openGauss学习笔记-99openGauss数据库管理-管理数据库安全-客户端接入认证之配置文件参考99.1参数说明表1参数说明参数名称描述取值范围local表示这条记录只接受通过Unix域套接字进行的连接。没有这种类型的记录,就不允许Unix域套接字的连接。只有在从服务器本机......
  • 关系数据库
    一、关系数据结构及形式化定义1.1关系  关系模型的数据结构只包含单一的数据结构------关系,在关系模型中,现实世界的实体以及实体之间的各种联系均用单一的结构类型,即关系来表示。关系模型是建立在集合代数的基础上的,从集合论的角度给出关系数据结构的形式化定义。 1、域:一......
  • 10.9 ,jsp连接数据库完成课程信息导入
    跟随教学视频安装好mysql,jdbc,navicat,apacheTomocat,为tomocat配好环境变量,在idea中完成配置工件,连入数据库驱动等可以通过idea去查看数据库,也可以借助navicat,以下是代码部分,两个web下的jsp文件,一个负责HTML的页面实现,另一个负责数据库的内容添加以及判断。<%@pageimport="......
  • mysql数据库性能优化
    数据库的性能优化可以从以下几个方面进行优化:1.硬件和操作系统:硬件可以从cpu、内存、I/O,网络带宽等方面进行优化。系统层可以从文件句柄数,网络配置等方面2.数据库的架构:比如主从集群以及主从架构的变种可以做高可用及容灾,读写分离可以避免读操作比较高的服务影响数据写入,分库分表......
  • openGauss学习笔记-98 openGauss 数据库管理-管理数据库安全-客户端接入认证之配置客
    openGauss学习笔记-98openGauss数据库管理-管理数据库安全-客户端接入认证之配置客户端接入认证98.1背景信息如果主机需要远程连接数据库,必须在数据库系统的配置文件中增加此主机的信息,并且进行客户端接入认证。配置文件(默认名称为pg_hba.conf)存放在数据库的数据目录里。hba(ho......