首页 > 数据库 >【Java】JDBC 获取数据库表名、字段名、注释 Comment 等信息

【Java】JDBC 获取数据库表名、字段名、注释 Comment 等信息

时间:2023-09-22 17:32:25浏览次数:56  
标签:Comment case JDBC Java String 数据库 import return conn

需求:给定数据库信息和表名,扫描表的字段名、字段类型和注释。

要使用Java JDBC获取数据库表名、字段名和注释信息,你需要连接到数据库并执行适当的SQL查询。以下是一些示例代码,展示如何获取这些信息。请注意,这些示例代码假定你已经建立了数据库连接。你需要根据你的数据库类型和连接方式进行适当的修改。

注:数据库可以是Oracle、Mysql、DB2、SqlServer等。

解决方法:利用JDBC的DatabaseMetaData来获取数据库的元信息。

用法如下:

package util;
 
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
 
public class DbInfoUtil {
	
	/**
	 * 根据数据库的连接参数,获取指定表的基本信息:字段名、字段类型、字段注释
	 * @param driver 数据库连接驱动
	 * @param url 数据库连接url
	 * @param user	数据库登陆用户名
	 * @param pwd 数据库登陆密码
	 * @param table	表名
	 * @return Map集合
	 */
	public static List getTableInfo(String driver,String url,String user,String pwd,String table){
		List result = new ArrayList();
		
		Connection conn = null;		
		DatabaseMetaData dbmd = null;
		
		try {
			conn = getConnections(driver,url,user,pwd);
			
			dbmd = conn.getMetaData();
			ResultSet resultSet = dbmd.getTables(null, "%", table, new String[] { "TABLE" });
			
			while (resultSet.next()) {
		    	String tableName=resultSet.getString("TABLE_NAME");
		    	System.out.println(tableName);
		    	
		    	if(tableName.equals(table)){
		    		ResultSet rs = conn.getMetaData().getColumns(null, getSchema(conn),tableName.toUpperCase(), "%");
 
		    		while(rs.next()){
		    			//System.out.println("字段名:"+rs.getString("COLUMN_NAME")+"--字段注释:"+rs.getString("REMARKS")+"--字段数据类型:"+rs.getString("TYPE_NAME"));
		    			Map map = new HashMap();
		    			String colName = rs.getString("COLUMN_NAME");
		    			map.put("code", colName);
		    			
		    			String remarks = rs.getString("REMARKS");
		    			if(remarks == null || remarks.equals("")){
		    				remarks = colName;
		    			}
		    			map.put("name",remarks);
		    			
		    			String dbType = rs.getString("TYPE_NAME");
		    			map.put("dbType",dbType);
		    			
		    			map.put("valueType", changeDbType(dbType));
		    			result.add(map);
		    		}
		    	}
		    }
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
		return result;
	}
	
	private static String changeDbType(String dbType) {
		dbType = dbType.toUpperCase();
		switch(dbType){
			case "VARCHAR":
			case "VARCHAR2":
			case "CHAR":
				return "1";
			case "NUMBER":
			case "DECIMAL":
				return "4";
			case "INT":
			case "SMALLINT":
			case "INTEGER":
				return "2";
			case "BIGINT":
				return "6";
			case "DATETIME":
			case "TIMESTAMP":
			case "DATE":
				return "7";
			default:
				return "1";
		}
	}
 
	//获取连接
	private static Connection getConnections(String driver,String url,String user,String pwd) throws Exception {
		Connection conn = null;
		try {
			Properties props = new Properties();
			props.put("remarksReporting", "true");
			props.put("user", user);
			props.put("password", pwd);
			Class.forName(driver);
			conn = DriverManager.getConnection(url, props);
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		}
		return conn;
	}
	
	//其他数据库不需要这个方法 oracle和db2需要
	private static String getSchema(Connection conn) throws Exception {
		String schema;
		schema = conn.getMetaData().getUserName();
		if ((schema == null) || (schema.length() == 0)) {
			throw new Exception("ORACLE数据库模式不允许为空");
		}
		return schema.toUpperCase().toString();
 
	}
 

执行main测试函数:

	public static void main(String[] args) {
		
		//这里是Oracle连接方法
		
		String driver = "oracle.jdbc.driver.OracleDriver";
		String url = "jdbc:oracle:thin:@192.168.11.11:1521:orcl";
		String user = "bdc";
		String pwd = "bdc123";
		//String table = "FZ_USER_T";
		String table = "FZ_USER_T";
		
		//mysql
		/*
		String driver = "com.mysql.jdbc.Driver";
		String user = "root";
		String pwd = "123456";
		String url = "jdbc:mysql://localhost/onlinexam"
				+ "?useUnicode=true&characterEncoding=UTF-8";
		String table = "oe_student";
		*/
		
		List list = getTableInfo(driver,url,user,pwd,table);
		System.out.println(list);
	}
	
}

注意:获取注释信息的可移植性有限,因为不同的数据库管理系统可能以不同的方式存储注释。有些数据库可能不会存储列注释。在这种情况下,你可能需要查阅数据库文档,了解如何获取列注释信息。

确保将代码中的数据库连接部分替换为你实际使用的数据库连接方式。此外,确保在使用JDBC之前,你已经引入了适当的数据库驱动程序。

此工具类无需修改,适用于Oracle、Mysql、DB2、SqlServer数据库。

标签:Comment,case,JDBC,Java,String,数据库,import,return,conn
From: https://blog.51cto.com/bluetata/7569333

相关文章

  • ClassNotfoundException:java.net.InetAddress$CacheEntry
    一个需求,需要修改本地的dns解析,去验证业务的正确性,修改本地的hosts文件需要频繁的修改本地磁盘文件。使用工具包(https://github.com/tanhaichao/javahost)这个工具类实际是通过反射机制,去修改了InetAddress中的cache值,来实现dns解析的修改。CloseableHttpClient方法在做connect的......
  • 【Java】ElasticSearch 在项目里的应用
    一、前言:好久没写笔记了,最近忙一个项目,用到ES查询,以往的笔记写ES都是搭建环境,用Kibana玩一玩这次是直接调用API操作了,话不多说,进入主题 二、环境前提:公司用的还是纯ElasticSearch的API库,并没有Spring-Data-ES的包装ElasticSearch版本是7.3.1这是封装的包:<!--esstart-......
  • 如何提升Java项目质量,代码是关键
    关于编程,代码质量是一个极其重要的因素。无论是初学者还是资深开发者,都深知高质量代码的重要性,除了可以提高程序的可维护性,还能减少错误和问题的出现。尤其在像Java这样受欢迎但难度较高的编程语言中,代码质量显得尤为突出。要想写出高质量的Java代码,并不是一件容易的事情。你可能......
  • Java动手动脑
    数学函数的掌握可以是计算更简单publicclassTestMath{ publicstaticvoidmain(String[]args) { /*---------下面是三角运算---------*/ //将弧度转换角度 System.out.println("Math.toDegrees(1.57):"+Math.toDegrees(1.57)); //将角度转换为弧度 System.out.printl......
  • 使用JDBC插入数据时,数据库中文显示为?的解决方法
    问题描述:使用JDBC进行添加数据的操作,设置的参数为中文,运行成功后数据库显示插入的数据为??解决方法:配置url时加上?useUnicode=true&characterEncoding=UTF-8重新进行插入:结果显示正确。......
  • 深入探讨Java面试中内存泄漏:如何识别、预防和解决
    引言在编写和维护Java应用程序时,内存泄漏是一个重要的问题,可能导致性能下降和不稳定性。本文将介绍内存泄漏的概念,为什么它在Java应用程序中如此重要,并明确本文的目标,即识别、预防和解决内存泄漏问题。内存泄漏的概念内存泄漏是指应用程序中分配的内存(通常是堆内存)在不再需要时......
  • docker部署java项目
    1、首先你需要提前准备好jar包或者war包,并想办法放入Linux环境(或虚拟机)中;2、java项目的部署需要用到Tomcat或者Jetty,docker可以直接拉取他俩的镜像,这里以Tomcat为例:#:后面需要加上war或者jar对应的Tomcat版本,最好加上,#否则默认最新的版本--latest,会出现版本不兼容的问题d......
  • 企业微信机器人Javascript调用例子
    constkey=""constoWX_URL='https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+key;constsent_msg={'msgtype':'text','text':{......
  • JAVA_OPTS
    JAVA_OPTS,顾名思义,是用来设置JVM相关运行参数的变量。 JVM:JAVA_OPTS="-server-Xms2048m-Xmx2048m-Xss512k"-server:一定要作为第一个参数,在多个CPU时性能佳-Xms:初始Heap大小,使用的最小内存,cpu性能高时此值应设的大一些-Xmx:Java heap最大值,使用的最大内存......
  • JAVA中三种I/O框架——BIO、NIO、AIO
    一、BIO(BlockingI/O)BIO,同步阻塞IO模型,应用程序发起系统调用后会一直等待数据的请求,直至内核从磁盘获取到数据并拷贝到用户空间;在一般的场景中,多线程模型下的BIO是成本较低、收益较高的方式。但是,如果在高并发的场景下,过多的创建线程,会严重占据系统资源,降低系统对外界响应效率......