前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Kotlin (Java) 获取 mysql 数据库的所有表,表的所有字段,注释,字段类型

Kotlin (Java) 获取 mysql 数据库的所有表,表的所有字段,注释,字段类型

作者头像
一个会写诗的程序员
发布于 2019-10-15 09:30:18
发布于 2019-10-15 09:30:18
10.3K00
代码可运行
举报
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
import java.sql.*
import java.util.*
import javax.sql.DataSource

@Service
class Mysql2OdpsService {
    /**
     * 生成 ODPS DDL 语句
     */
    fun generateddl(table: String, dataSource: MysqlDataSource): String? {
        val conn = getConnection(dataSource) ?: return null
        val fields = getTableFields(table, dataSource)
        return ddl(table, fields)
    }

    /**
     * 获取数据库全部表
     */
    fun getAllTables(dataSource: MysqlDataSource): List<String>? {
        val conn = getConnection(dataSource) ?: return null
        val result = ArrayList<String>()
        var rs: ResultSet? = null
        try {
            conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY)
            val meta = conn.metaData
            //目录名称, 数据库名, 表名称, 表类型
            rs = meta.getTables(catalog(), dataSource.databaseName, tableNamePattern(), types())
            while (rs!!.next()) {
                result.add(rs.getString("TABLE_NAME"))
            }
        } catch (e: Exception) {
            logger.error("获取数据库全部表:", e)
        } finally {
            close(conn, null, rs)
        }
        return result
    }

    /**
     * 获取数据库表所包含的字段
     */
    fun getTableFields(table: String, dataSource: MysqlDataSource): List<FieldInfo>? {
        val conn = getConnection(dataSource) ?: return null
        val result = ArrayList<FieldInfo>()
        var rs: ResultSet? = null
        try {
            val meta = conn.metaData
            rs = meta.getColumns(catalog(), dataSource.databaseName, table, null)
            while (rs.next()) {
                val fieldInfo = FieldInfo(
                    rs.getString("COLUMN_NAME"),
                    rs.getString("REMARKS"),
                    rs.getString("TYPE_NAME")
                )
                result.add(fieldInfo)
            }
        } catch (e: Exception) {
            logger.error("获取数据库表所包含的字段:", e)
        } finally {
            close(conn, null, rs)
        }
        return result
    }

    data class FieldInfo(var fieldName: String, var comment: String, var type: String)

    fun getConnection(dataSource: DataSource): Connection? {
        var conn: Connection? = null
        try {
            conn = dataSource.connection
        } catch (e: SQLException) {
            logger.error("数据库连接失败", e)
        }
        return conn
    }

    /**
     * 关闭(释放)资源
     *
     * @param conn Connection
     * @param ps   PreparedStatement
     * @param rs   ResultSet
     */
    fun close(conn: Connection?, ps: Statement? = null, rs: ResultSet? = null) {
        var conn = conn
        var ps = ps
        var rs = rs
        //关闭ResultSet
        if (rs != null) {
            try {
                rs.close()
            } catch (e: SQLException) {
                rs = null
            }
        }
        //关闭PreparedStatement
        if (ps != null) {
            try {
                ps.close()
            } catch (e: SQLException) {
                ps = null
            }
        }
        //关闭Connection
        if (conn != null) {
            try {
                conn.close()
            } catch (e: SQLException) {
                conn = null
            }
        }
    }

    /**
     * a catalog name; must match the catalog name as it is stored in the database; "" retrieves those without a catalog; null means that the catalog name should not be used to narrow the search
     */
    fun catalog(): String? {
        return null
    }

    /**
     * a table name pattern; must match the table name as it is stored in the database
     */
    fun tableNamePattern(): String {
        return "%"
    }

    /**
     * a list of table types, which must be from the list of table types returned from [DatabaseMetaData],to include; null returns all types
     */
    fun types(): Array<String> {
        return arrayOf("TABLE", "VIEW")
    }

    fun ddl(table: String, fields: List<FieldInfo>?): String {
        var fieldLines = StringBuilder()
        fields?.forEachIndexed { index, fieldInfo ->
            if (index == 0) {
                val line = "${fieldInfo.fieldName}               STRING COMMENT '${fieldInfo.comment}'"
                fieldLines.append("\n")
                fieldLines.append(line)
                fieldLines.append("\n")
            } else {
                val line = ",${fieldInfo.fieldName}               STRING COMMENT '${fieldInfo.comment}'"
                fieldLines.append(line)
                fieldLines.append("\n")
            }
        }
        return """
CREATE TABLE IF NOT EXISTS $table(
$fieldLines 
)
COMMENT '' PARTITIONED BY
(
  pt STRING COMMENT '时间分区键-yyyymmdd'
)
LIFECYCLE 750;
""".trimIndent()
    }

    val logger = LoggerFactory.getLogger(this.javaClass)
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.10.15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java封装数据库操作
在 Java 中封装数据库操作是一个常见的需求,可以通过以下方法实现高效且可维护的代码结构。以下是一个 基于 JDBC 的封装示例,并附上最佳实践建议:
编程小白狼
2025/04/13
1150
商城项目整理(三)JDBC增删改查
商品表的增加,修改,删除,订单表的增加,确认,用户表的查看,日志表的增加,查看 商品表建表语句: 1 create table TEST.GOODS_TABLE 2 ( 3 gid NUMBER not null, 4 gname VARCHAR2(90), 5 gdetails CLOB, 6 gpicture VARCHAR2(100), 7 gprice NUMBER, 8 gleixing NUMBER, 9 gpinpai VAR
二十三年蝉
2018/02/28
1.3K0
MySQL的数据访问和DAO模式
在不同业务场景的实际开发过程中,数据库服务器的 IP 地址,访问数据库的用户名或密码经常会发生变化,维护和修改比较麻烦,而为了避免这种情况,Java 中有一个比较重要的 Properties 类,它可以读取 Java 配置文件,这样就可以把常用的配置信息卸载配置文件中,程序员进行维护和修改。
JanYork_简昀
2024/03/07
1950
MySQL的数据访问和DAO模式
数据库之-元数据 DatabaseMetaData 初学
DatabaseMetaData和ResultSetMetaData就是两个常用的获取数据库元数据相关信息的接口,本文讲解DatabaseMetaData和ResultSetMetaData接口获取元数据的方法。
默 语
2024/11/20
1300
数据库之-元数据 DatabaseMetaData 初学
Java Web 网络留言板2 JDBC数据源 (连接池技术)
addMessage.htm 代码; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript" src="/guestbook2/js/validation-framework.js"></script> <script type="text/javascript" src="/guestbook2/fckeditor/fckeditor
Hongten
2018/09/13
5130
java生成mysql数据库建表语句、字段、字段类型、字段注释,可实现不用mysqldump备份数据库「建议收藏」
使用 mysqldump 备份数据库也是可行的,因为每次备份的时候都需要mysqldump这个文件, 我在windows备份时没问题,但是放到linux上面时,centos系统死活不认这个文件,但又不想装mysql,一气之下自己研究了个不需要mysqldump就可以备份的程序,
全栈程序员站长
2022/10/04
5.6K0
java生成mysql数据库建表语句、字段、字段类型、字段注释,可实现不用mysqldump备份数据库「建议收藏」
原生Jdbc获取库、表、字段
PrepatedStatement:SQL 语句被预编译并存储在此对象中,可以使用此对象多次高效地执行该语句。
ha_lydms
2023/08/10
4960
原生Jdbc获取库、表、字段
数据库事务处理与资源池
描述:事务只是针对连接连接对象,如果再开一个连接对象,那么那是默认的提交(注意: 事务是会自动提交的)。
全栈工程师修炼指南
2020/10/23
1K0
数据库事务处理与资源池
java--第12章 数据库编程
1.在Java程序中创建SQL Server数据库和表,并使用批处理和事务处理。
北山啦
2022/11/27
8080
java--第12章 数据库编程
JavaWeb(四)JDBC操作Oracle
JDBC:Java DataBase Connectivity(java数据库连接) SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC。 jdbc是一套标准,它是由一些接口与类组成的。 涉及到的类与接口:   java.sql     类:DriverManger     接口 Connection Statement ResultSet PreparedStatement     CallableStatement(它是用于调
二十三年蝉
2018/02/28
1.4K0
JavaWeb(四)JDBC操作Oracle
JDBC完成对数据库数据操作(增,删,改,查)
1.获取数据库的连接 2.预编译sql语句 3.填充占位 4.执行 5.资源的关闭
小尘要自信
2023/10/10
1.8K0
JavaSE学习总结(九)—— Java访问数据库(JDBC)
张果
2018/01/04
1.7K0
JavaSE学习总结(九)—— Java访问数据库(JDBC)
JDBC数据库的增删改查简单操作
前言 本次带来的是JAVA的JDBC操作,对数据库进行发送SQL语句,以达到对数据库语言的增删改查操作 需要下载驱动类包 MySQL数据库的JDBC驱动包 https://dev.mysql.com
HcodeBlogger
2020/07/14
1.2K0
java数据库连接池
Java数据库连接池是一种用于管理数据库连接的技术,它可以大大提高应用程序的性能和可扩展性。下面是一个简单的Java数据库连接池示例,以连接到MySQL数据库并执行查询。
堕落飞鸟
2023/04/03
9410
jdbc连接mysql数据库 - Java数据库基础
最近复习了一下Java的基础,包括封装、继承、多态、IO、多线程、反射等等,但我感觉JDBC是个大块,花了半天时间实践总结了一下,顺带记录一波。主要是模板,在以后编程中大概率会用到,尤其是下学期的《数据库编程》课程。
Designer 小郑
2023/08/01
3560
java数据库查询类建议收藏
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/120762.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/15
5330
Java 连接数据库 JDBCUtil
如果是Elcipse 的话,不会创建的话,再查查吧,我的代码是没有问题的。呜呜呜。
宁在春
2022/10/31
6660
原生JDBC连接数据库
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/159744.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/14
5960
原生JDBC连接数据库
Java jdbc Mysql数据库连接
jdbc数据库连接六步走 1. 注册驱动 注册驱动的两种方法 Class.forName("com.mysql.cj.jdbc.Driver"); //mysql8.+版本 Driver driver = new com.mysql.cj.jdbc.Driver(); DriverManager.registerDriver(driver); 2.获取连接 String url = "jdbc:mysql://127.0.0.1:3306/tests"; String user = "root"; Str
吃猫的鱼Code
2023/02/02
4.3K0
JDBC基本知识
JDBC的作用 JDBC为java访问数据库提供通用的API,可以为多种关系数据库提供统一访问。因为SQL是关系式数据库管理系统的标准语言,只要我们遵循SQL规范,那么我们写的代码既可以访问MySQL又可以访问SQL Server. 简单的说,JDBC可以做三件事: 与数据库建立连接 发送SQL语句 处理结果 JDBC中重要的类 java.sql.DriverManager:用来加载不同的JDBC驱动程序并且为创建的新的数据库连接提供支持; java.sql.Connection:完成对某一指定数据库的连接
杨奉武
2018/04/11
1.2K0
JDBC基本知识
相关推荐
java封装数据库操作
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验