当前位置: 首页 > 后端技术 > Java

[Java]如何用JDBC写一个数据库文件生成工具?

时间:2023-04-02 00:46:37 Java

前言在工作中,我们经常会遇到需要传递数据库文档的场景,而编写这样的文档是一件非常枯燥重复的工作,可以通过自动化的方式来完成。本文提供了一种在JAVA中如何基于JDBC生成数据库文档的思路,希望对大家有所帮助。第1步:可行性?JDBC是JavaDatabaseConnectivity的缩写。从名字就可以看出它是Java定义的连接数据库的标准。该标准的具体体现是一系列接口java.sql.Connectionjava.sql.DatabaseMetaDatajava.sql.Driverjava.sql.Statementjavax.sql.DataSource...其中,java.sql.DatabaseMetaData(以下简称DatabaseMetaData)接口是数据库元信息的抽象,其中元信息包括schema、table、index、column等熟悉的概念。通过IDEA,我们可以方便的查看到DatabaseMetaData接口定义的方法列表,比如getTables:获取表信息getColumns:获取列信息getIndexInfo:获取索引信息getPrimaryKeys:获取主键信息……可以看出,基于关于JDBC生成数据库文件的可行性没有问题,接下来我们就进入实验阶段。第二步:Demo实验环境:MysqlJavaMysql数据准备CREATEDATABASEIFNOTEXISTSdemo;CREATETABLEdemo.user(idINTPRIMARYKEYAUTO_INCREMENTNOTNULL,用户名VARCHAR(255)NOTNULL,nicknameVARCHAR(255)NOTNULLDEFAULT'',create_atTIMESTAMPDEFAULTCURRENT_TIMESTAMPNOTNULL,CONSTRAINTuk_user_usernameUNIQUE(username))CHARSETutf8mb4COLLATEutf8mb4_unicode_ciCOMMENT'用户';CREATETABLEdemo.post(idINTPRIMARYKEYAUTO_INCREMENTNOTNULL,user_idINTNOTNULL,titleVARCHAR(255)NOTNULL,contentTEXTNOTNULL,create_atTIMESTAMPDEFAULTCURRENT_TIMESTAMPNOTNULL)CHARSETutf8mb4COLLATEunicodecimbCOMLATEutf8'文章';实验目标:获取demo库中的user和post表数据Connection)getMetaData方法获取上节提到的DatabaseMetaDataClasspublicinterfaceConnectionextendsWrapper,AutoCloseable{DatabaseMetaDatagetMetaData()throwsSQLException;}Connection的获取需要依赖数据库驱动。以Mysql为例,需要通过构建工具导入mysql-connector-java库。下面的代码展示了Gradle中引入的方法。dependencies{implementation"mysql:mysql-connector-java:8.0.27"}刷新依赖后,可以创建Connection,获取DatabaseMetaData对象:classDemo{publicstaticvoidmain(String[]args)throwsSQLException{数据库元数据metaData=getMetaData();//成功获取元数据对象}publicstaticDatabaseMetaDatagetMetaData()throwsSQLException{try{//加载驱动Class.forName("com.mysql.cj.jdbc.Driver");}catch(ClassNotFoundExceptione){thrownewIllegalStateException(e);}属性信息=newProperties();//填写你的用户名、密码和连接地址info.put("user","root");info.put("密码","123456");StringjdbcUrl="jdbc:mysql://127.0.0.1:3306/demo";连接connection=DriverManager.getConnection(jdbcUrl,info);返回连接。获取元数据();}}我们之前已经简要展示了Databas提供了eMetaData的API,getTables是获取所有表的方法。完整检查此方法的定义。ResultSetgetTables(Stringcatalog,StringschemaPattern,StringtableNamePattern,Stringtypes[])抛出SQLException;源码里有完整的注释,限于篇幅我就不贴了,只解释一下这几个参数nulltypes:类型,如VIEW、TABLE等,可以为null在Mysql中,catalog和schema其实是一样的,都是代表数据库的名称该方法返回的ResultSet的值也需要遵循JDBC规范。一个ResultSet代表返回的一行数据,我们关心的列定义如下(完整定义见该方法源码注释)。列名表示TABLE_CAT表所属的catalogTABLE_SCHEM表。schemaTABLE_NAME表名TABLE_TYPE表类型,如TABLE、VIEWSYSTEMTABLE等REMARKS注释,也就是注释语句指定的描述...确认方法的参数和返回值后可以继续完善之前的main方法:classDemo{publicstaticvoidmain(String[]args)throwsSQLException{DatabaseMetaDatametaData=getMetaData();//获取demo库下的所有表ResultSetresult=metaData.getTables("demo",null,null,null);while(result.next()){Stringmsg=String.format("表格:%s,类型:%s,注释:%s",result.getString("TABLE_NAME"),result.getString("TABLE_TYPE"),result.getString("REMARKS"));System.out.println(味精);}}//忽略getMetaData()方法}如无意外,控制台会打印如下信息Table:post,Type:TABLE,Comment:ArticleTable:user,Type:TABLE,Comment:第三步用户:改善获取获取表信息后,需要根据表名获取对应的列、索引、外键、主键等。得到这些数据后,就可以生成一个完整的数据库文件。这些内容的获取可以在DatabaeMetaData对应的方法ResultSetgetColumns(catalog,schemaPattern,tableNamePattern,columnNamePattern)ResultSetgetIndexInfo(catalog,schema,table,unique,approximate)ResultSetgetPrimaryKeys(catalog,schema,table)ResultSetgetImportedKeys(catalog,schema,table)方法调用和value的整体思路和第二步的代码基本一致。如果还有不懂的,可以查看我这里实现的代码:https://github.com/vran-dev/d...除此之外,基于这个想法,我还把它改进成了一个产品Databasir,这是一个在线数据库文档管理平台,也许你可以直接使用它:参考Databasir,https://github.com/vran-dev/d..。