根据数据库配置获取数据库、表、字段的信息

参考文档:https://blog.csdn.net/qq_21187515/article/details/91495237
https://www.cnblogs.com/zuidongfeng/p/7895090.html
https://201212262922.iteye.com/blog/2096785
https://my.oschina.net/sprouting/blog/1580961
https://blog.csdn.net/zs520ct/article/details/78326204
https://www.xuebuyuan.com/3246611.html
http://blog.sina.com.cn/s/blog_c90ce4e001032ai0.html
https://www.cnblogs.com/taojietx/p/5189229.html
https://www.cnblogs.com/cunkouzh/p/5504052.html

数据库类型转java类型对应

mysql
	INT::::java.lang.Integer
	VARCHAR::::java.lang.String
	TINYINT::::java.lang.Integer
	SMALLINT::::java.lang.Integer
	MEDIUMINT::::java.lang.Integer
	INT::::java.lang.Integer
	INT::::java.lang.Integer
	BIGINT::::java.lang.Long
	BIT::::java.lang.Boolean
	DOUBLE::::java.lang.Double
	DOUBLE::::java.lang.Double
	FLOAT::::java.lang.Float
	DECIMAL::::java.math.BigDecimal
	DECIMAL::::java.math.BigDecimal
	CHAR::::java.lang.String
	VARCHAR::::java.lang.String
	DATE::::java.sql.Date
	TIME::::java.sql.Time
	YEAR::::java.sql.Date
	TIMESTAMP::::java.sql.Timestamp
	DATETIME::::java.sql.Timestamp
	TINYBLOB::::[B
	BLOB::::[B
	MEDIUMBLOB::::[B
	LONGBLOB::::[B
	VARCHAR::::java.lang.String
	VARCHAR::::java.lang.String
	VARCHAR::::java.lang.String
	VARCHAR::::java.lang.String
	CHAR::::java.lang.String
	CHAR::::java.lang.String
	BINARY::::[B
	VARBINARY::::[B
	GEOMETRY::::[B
	GEOMETRY::::[B
	GEOMETRY::::[B
	GEOMETRY::::[B
	GEOMETRY::::[B
	GEOMETRY::::[B
	GEOMETRY::::[B
	GEOMETRY::::[B
	JSON::::java.lang.String]
		 
		 
		 
postgreSql
	int4::::java.lang.Integer
	text::::java.lang.String
	int4::::java.lang.Integer
	bpchar::::java.lang.String
	float4::::java.lang.Float
	bit::::java.lang.Boolean
	bool::::java.lang.Boolean
	box::::org.postgresql.geometric.PGbox
	bytea::::[B
	bpchar::::java.lang.String
	cidr::::java.lang.Object
	circle::::org.postgresql.geometric.PGcircle
	date::::java.sql.Date
	numeric::::java.math.BigDecimal
	float4::::java.lang.Float
	float8::::java.lang.Double
	inet::::java.lang.Object
	int2::::java.lang.Integer
	int8::::java.lang.Long
	interval::::org.postgresql.util.PGInterval
	json::::java.lang.Object
	line::::org.postgresql.geometric.PGline
	lseg::::org.postgresql.geometric.PGlseg
	macaddr::::java.lang.Object
	money::::org.postgresql.util.PGmoney
	path::::org.postgresql.geometric.PGpath
	point::::org.postgresql.geometric.PGpoint
	polygon::::org.postgresql.geometric.PGpolygon
	int2::::java.lang.Integer
	int4::::java.lang.Integer
	int8::::java.lang.Long
	text::::java.lang.String
	time::::java.sql.Time
	timetz::::java.sql.Time
	timestamp::::java.sql.Timestamp
	timestamptz::::java.sql.Timestamp
	tsquery::::java.lang.Object
	tsvector::::java.lang.Object
	txid_snapshot::::java.lang.Object
	uuid::::java.lang.Object
	varbit::::java.lang.Object
	varchar::::java.lang.String
	xml::::java.lang.Object
	 
	 
	 
oracle 
	VARCHAR2::::java.lang.String
	VARCHAR2::::java.lang.String
	NUMBER::::java.math.BigDecimal
	TIMESTAMP::::oracle.sql.TIMESTAMP
	VARCHAR2::::java.lang.String
	CHAR::::java.lang.String
	NCHAR::::java.lang.String
	VARCHAR2::::java.lang.String
	NVARCHAR2::::java.lang.String
	CLOB::::oracle.jdbc.OracleClob
	NCLOB::::oracle.jdbc.OracleNClob
	LONG::::java.lang.String
	NUMBER::::java.math.BigDecimal
	BINARY_FLOAT::::oracle.sql.BINARY_FLOAT
	BINARY_DOUBLE::::oracle.sql.BINARY_DOUBLE
	DATE::::java.sql.Timestamp
	INTERVALDS::::oracle.sql.INTERVALDS
	INTERVALYM::::oracle.sql.INTERVALYM
	TIMESTAMP::::oracle.sql.TIMESTAMP
	TIMESTAMP WITH TIME ZONE::::oracle.sql.TIMESTAMPTZ
	TIMESTAMP WITH LOCAL TIME ZONE::::oracle.sql.TIMESTAMPLTZ
	BLOB::::oracle.jdbc.OracleBlob
	BFILE::::oracle.jdbc.OracleBfile
	ROWID::::oracle.sql.ROWID
	CHAR::::java.lang.String
	VARCHAR2::::java.lang.String
	VARCHAR2::::java.lang.String
	NUMBER::::java.math.BigDecimal
	NUMBER::::java.math.BigDecimal
	NUMBER::::java.math.BigDecimal
	NUMBER::::java.math.BigDecimal
	NUMBER::::java.math.BigDecimal
	NUMBER::::java.lang.Double
	NUMBER::::java.lang.Double
	NUMBER::::java.lang.Double
	NUMBER::::java.lang.Double
	NUMBER::::java.lang.Double
	NCHAR::::java.lang.String
	
	
	
sqlserver 
	varchar::::java.lang.String
	binary::::[B
	bit::::java.lang.Boolean
	char::::java.lang.String
	datetime::::java.sql.Timestamp
	date::::java.sql.Date
	datetime2::::java.sql.Timestamp
	datetimeoffset::::microsoft.sql.DateTimeOffset
	decimal::::java.math.BigDecimal
	float::::java.lang.Double
	hierarchyid::::[B
	image::::[B
	int::::java.lang.Integer
	money::::java.math.BigDecimal
	nchar::::java.lang.String
	ntext::::java.lang.String
	numeric::::java.math.BigDecimal
	nvarchar::::java.lang.String
	real::::java.lang.Float
	smalldatetime::::java.sql.Timestamp
	smallint::::java.lang.Short
	smallmoney::::java.math.BigDecimal
	nvarchar::::java.lang.String
	text::::java.lang.String
	time::::java.sql.Time
	timestamp::::[B
	tinyint::::java.lang.Short
	uniqueidentifier::::java.lang.String
	varbinary::::[B
	varchar::::java.lang.String
	xml::::java.lang.String
	nvarchar::::java.lang.String
	varbinary::::[B
	varchar::::java.lang.String

引入相应的数据库依赖

		<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
		<dependency>
		  <groupId>com.microsoft.sqlserver</groupId>
		  <artifactId>sqljdbc4</artifactId>
		  <version>4.0</version>
		</dependency>
		<dependency>
		    <groupId>com.oracle</groupId>
			<artifactId>ojdbc6</artifactId>
			<version>11.2.0.1</version>
		</dependency>
		<dependency>
		    <groupId>org.lucee</groupId>
		    <artifactId>postgresql</artifactId>
		    <version>8.3-606.jdbc4</version>
		</dependency>

抽象公共类

public abstract class DataBaseUtil {
    private final static Logger LOGGER = LoggerFactory.getLogger(DataBaseUtil.class);
    
    private String ip;
    private Integer port;
    private String userName;
    private String password;
    
    //表名
    private String tableName;
    
    public String getIp() {
		return ip;
	}

	public void setIp(String ip) {
		this.ip = ip;
	}

	public Integer getPort() {
		return port;
	}

	public void setPort(Integer port) {
		this.port = port;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getTableName() {
		return tableName;
	}

	public void setTableName(String tableName) {
		this.tableName = tableName;
	}

	/**
     * 获取驱动
     * @return
     */
    abstract String getDriver();
    
    /**
     * 获取没有数据数据库的url
     * @return
     */
    abstract String getNoDataBaseUrl();
    
    
    /**
     * 获取带数据库的url
     * @return
     */
    abstract String getUrl(String dataBaseName);
    
    /**
     * 获取查询所有数据库的sql
     * @return
     */
    abstract String getDataBaseSql();
    
    /**
     * 获取表中所有字段信息
     * @param tableName 表名
     * @return
     */
    public abstract List<SrcField> getColumnParams(String dataBaseName, String tableName);
    
    public DataBaseUtil(String ip, Integer port, String userName, String password) {
		super();
		this.ip = ip;
		this.port = port;
		this.userName = userName;
		this.password = password;
		
		try {
			Class.forName(getDriver());
		} catch (ClassNotFoundException e) {
			LOGGER.error("can not load jdbc driver", e);
		}
	}
    
    /**
     * 创建不带数据库的Connection
     * @return
     */
    public Connection getNoDataBaseConnection() {
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(this.getNoDataBaseUrl(), this.userName, this.password);
        } catch (SQLException e) {
            LOGGER.error("get connection failure", e);
        }
        return conn;
    }
    
    /**
     * 获取数据库连接
     * @return
     */
    public Connection getConnection(String dataBaseName) {
        Connection conn = null;
        try {
            conn = DriverManager.getConnection(this.getUrl(dataBaseName), this.userName, this.password);
        } catch (SQLException e) {
            LOGGER.error("get connection failure", e);
        }
        return conn;
    }
    
    /**
     * 关闭数据库连接
     * @param conn
     */
    public void closeConnection(Connection conn) {
        if(conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                LOGGER.error("close connection failure", e);
            }
        }
    }
    
    /**
     * 查询数据库的信息
     */
    public List<String> getDatabaseNames(){
    	List<String> databaseNames = new ArrayList<>();
    	//与数据库的连接
        Connection conn = this.getNoDataBaseConnection();
        String tableSql = this.getDataBaseSql();
        Statement stmt = null;
        try {
        	stmt=conn.createStatement(); 
            ResultSet rs=stmt.executeQuery(tableSql);
            while(rs.next())
            {
                String tableName = rs.getString(1);
                databaseNames.add(tableName);
            }
        } catch (SQLException e) {
            LOGGER.error("getColumnNames failure", e);
        } finally {
            if (stmt != null) {
                try {
                	stmt.close();
                    closeConnection(conn);
                } catch (SQLException e) {
                    LOGGER.error("getColumnNames close pstem and connection failure", e);
                }
            }
        }
        
        return databaseNames;  
    }
    
    /**
     * 获取数据库下的所有表名
     */
    public List<String> getTableNames(String dataBaseName) {
        List<String> tableNames = new ArrayList<>();
        Connection conn = this.getConnection(dataBaseName);
        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;
    }
}

mysql

/**
 * mysql查询数据源信息工具类
 *
 */
public class DataBaseMysqlUtil extends DataBaseUtil{
	private final static Logger LOGGER = LoggerFactory.getLogger(DataBaseMysqlUtil.class);
	
    public DataBaseMysqlUtil(String ip, Integer port, String userName, String password) {
		super(ip, port, userName, password);
	}

	@Override
	String getDriver() {
		return "com.mysql.jdbc.Driver";
	}

	@Override
	String getNoDataBaseUrl() {
		return "jdbc:mysql://" + this.getIp() + ":" + this.getPort()+ "?useUnicode=true&characterEncoding=utf8";
	}

	@Override
	String getUrl(String dataBaseName) {
		return "jdbc:mysql://" + this.getIp() + ":" + this.getPort()+ "/" + dataBaseName
				+ "?useUnicode=true&characterEncoding=utf8";
	}

	@Override
	String getDataBaseSql() {
		return "show databases";
	}

	@Override
	public List<SrcField> getColumnParams(String dataBaseName, String tableName) {
		 //与数据库的连接
        Connection conn = this.getConnection(dataBaseName);
        
        List<SrcField> srcFieldList = new ArrayList<>();//列名信息集合
        
        Statement stmt = null;
        ResultSet rs = null;
        try {
        	stmt=conn.createStatement(); 
            rs = stmt.executeQuery("show full columns from " + tableName);
            while (rs.next()) {
            	SrcField srcField = new SrcField();
            	srcField.setComment(rs.getString("Comment"));
            	srcField.setName(rs.getString("Field"));
            	
            	String type = rs.getString("Type");
            	if(!StringUtils.isEmpty(type)) type = type.substring(0, type.indexOf("(") == -1 ? type.length() : type.indexOf("(") );
            	srcField.setDataType(type);
            	
            	String key = rs.getString("Key");
            	Integer isPrimaryKey = key != null && key.equals("PRI") ? 1 : 0;
            	srcField.setIsPrimaryKey(isPrimaryKey);
            	
            	srcFieldList.add(srcField);
            }
        } 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 srcFieldList;
	}
	public DbColumnType processTypeConvert(String fieldType) {
        String t = fieldType.toLowerCase();
        if (!t.contains("char") && !t.contains("text")) {
            if (t.contains("bigint")) {
                return DbColumnType.BIGINT;
            } else if (t.contains("int")) {
                return DbColumnType.INT;
            } else if (!t.contains("date") && !t.contains("time") && !t.contains("year")) {
                if (t.contains("bit")) {
                    return DbColumnType.STRING;
                } else if (t.contains("decimal")) {
                    return DbColumnType.DECIMAL;
                } else if (t.contains("clob")) {
                    return DbColumnType.STRING;
                } else if (t.contains("blob")) {
                    return DbColumnType.BINARY;
                } else if (t.contains("binary")) {
                    return DbColumnType.BINARY;
                } else if (t.contains("float")) {
                    return DbColumnType.FLOAT;
                } else if (t.contains("double")) {
                    return DbColumnType.DOUBLE;
                } else {
                    return !t.contains("json") && !t.contains("enum") ? DbColumnType.STRING : DbColumnType.STRING;
                }
            } else {
            	if(t.contains("time")){
            		return DbColumnType.TIMESTAMP;
            	}else{
            		return DbColumnType.DATE;
            	}
            }
        } else {
            return DbColumnType.STRING;
        }
    }
}

oracle

/**
 * oracle查询数据源信息工具类
 */
public class DataBaseOracleUtil extends DataBaseUtil{
	private final static Logger LOGGER = LoggerFactory.getLogger(DataBaseOracleUtil.class);
	
    public DataBaseOracleUtil(String ip, Integer port, String userName, String password) {
		super(ip, port, userName, password);
	}

	@Override
	String getDriver() {
		return "oracle.jdbc.driver.OracleDriver";
	}

	@Override
	String getNoDataBaseUrl() {
		return "jdbc:oracle:thin:@" + this.getIp() + ":" + this.getPort()+ ":orcl";
	}

	@Override
	String getUrl(String dataBaseName) {
		return this.getNoDataBaseUrl();
	}

	@Override
	String getDataBaseSql() {
		return "select name from v$database";
	}
	
	public List<String> getDatabaseNames(){
		List<String> databaseNames = new ArrayList<>();
		databaseNames.add(this.getUserName());
		
		return databaseNames;
	}

	/**
     * 获取数据库下的所有表名
     */
    public List<String> getTableNames(String dataBaseName) {
        List<String> tableNames = new ArrayList<>();
        Connection conn = this.getConnection(dataBaseName);
        
        String tableSql = "select table_name from user_tables";
        Statement stmt = null;
        try {
        	stmt=conn.createStatement(); 
            ResultSet rs=stmt.executeQuery(tableSql);
            while(rs.next())
            {
                String tableName = rs.getString(1);
                tableNames.add(tableName);
            }
        } catch (SQLException e) {
        	 LOGGER.error("getTableNames failure", e);
        } finally {
            try {
            	stmt.close();
                conn.close();
            } catch (SQLException e) {
            	 LOGGER.error("close ResultSet failure", e);
            }
        }
        return tableNames;
    }
	
	@Override
	public List<SrcField> getColumnParams(String Owner, String tableName) {
		 //与数据库的连接
        Connection conn = this.getConnection(Owner);
        
        List<SrcField> srcFieldList = new ArrayList<>();//列名信息集合
        
        Statement stmt = null;
        ResultSet rs = null;
        try {
        	String sql=  
        			"select "+  
                    "         comments as \"Name\","+  
                    "         a.column_name \"Field\","+  
                    "         a.DATA_TYPE as \"Type\","+  
                    "         b.comments as \"Comment\","+  
                    "         decode(c.column_name,null,'FALSE','TRUE') as \"Primary\","+  
                    "         decode(a.NULLABLE,'N','TRUE','Y','FALSE','') as \"Mandatory\","+  
                    "         '' \"sequence\""+  
                    "   from "+  
                    "       all_tab_columns a, "+  
                    "       all_col_comments b,"+  
                    "       ("+  
                    "        select a.constraint_name, a.column_name"+  
                    "          from user_cons_columns a, user_constraints b"+  
                    "         where a.constraint_name = b.constraint_name"+  
                    "               and b.constraint_type = 'P'"+  
                    "               and a.table_name = '"+tableName+"'"+  
                    "       ) c"+  
                    "   where "+  
                    "     a.Table_Name=b.table_Name "+  
                    "     and a.column_name=b.column_name"+  
                    "     and a.Table_Name='"+tableName+"'"+  
                    "     and a.owner=b.owner "+  
                    "     and a.owner='"+Owner+"'"+  
                    "     and a.COLUMN_NAME = c.column_name(+)" +  
                    "  order by a.COLUMN_ID";
        	
        	stmt=conn.createStatement(); 
            rs = stmt.executeQuery(sql);
            while (rs.next()) {
            	SrcField srcField = new SrcField();
            	srcField.setComment(rs.getString("Comment"));
            	srcField.setName(rs.getString("Field"));
            	
            	String type = rs.getString("Type");
            	if(!StringUtils.isEmpty(type)) type = type.substring(0, type.indexOf("(") == -1 ? type.length() : type.indexOf("(") );
            	srcField.setDataType(type);
            	
            	String key = rs.getString("Primary");
            	Integer isPrimaryKey = key != null && key.equals("TRUE") ? 1 : 0;
            	srcField.setIsPrimaryKey(isPrimaryKey);
            	
            	srcFieldList.add(srcField);
            }
        } 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 srcFieldList;
	}
	public DbColumnType processTypeConvert(String fieldType) {
        String t = fieldType.toUpperCase();
        if (t.contains("CHAR")) {
            return DbColumnType.STRING;
        } else if (!t.contains("DATE") && !t.contains("TIMESTAMP")) {
            if (t.contains("NUMBER")) {
                if (t.matches("NUMBER\\(+\\d\\)")) {
                    return DbColumnType.INT;
                } else {
                    return t.matches("NUMBER\\(+\\d{2}+\\)") ? DbColumnType.BIGINT : DbColumnType.DOUBLE;
                }
            } else if (t.contains("FLOAT")) {
                return DbColumnType.FLOAT;
            } else if (t.contains("DOUBLE")) {
            	return DbColumnType.DOUBLE;
            } else if (t.contains("clob")) {
                return DbColumnType.STRING;
            } else if (t.contains("BLOB")) {
                return DbColumnType.BINARY;
            } else if (t.contains("binary") || t.contains("BFILE")) {
                return DbColumnType.BINARY;
            } else {
                return t.contains("RAW") ? DbColumnType.BINARY : DbColumnType.STRING;
            }
        } else {
        	if(t.contains("TIMESTAMP")){
        		return DbColumnType.TIMESTAMP;
        	}else{
        		return DbColumnType.DATE;
        	}
        }
    }
}

selserver

/**
 * sqlserver查询数据源信息工具类

 *
 */
public class DataBaseSqlServerUtil extends DataBaseUtil{
	private final static Logger LOGGER = LoggerFactory.getLogger(DataBaseSqlServerUtil.class);
	
	private static final String TABLE_NAME = "TABLE_NAME";
	
	//查询表字段的信息的sql
	private static final String DESCRIPTION_PRIMARY_KEY = 
    		"SELECT TB.NAME AS TABLE_NAME, COL.NAME AS FIELD, COL.MAX_LENGTH AS LENGTH, COL.IS_NULLABLE AS ISNULLABLE, T.NAME AS TYPE, "
    		+ "		( 	SELECT TOP 1 IND.IS_PRIMARY_KEY "
    		+ "			FROM SYS.INDEX_COLUMNS IC "
    		+ "			LEFT JOIN SYS.INDEXES IND ON IC.OBJECT_ID = IND.OBJECT_ID AND IC.INDEX_ID= IND.INDEX_ID AND IND.NAME LIKE 'PK_%' "
    		+ "			WHERE IC.OBJECT_ID = TB.OBJECT_ID AND IC.COLUMN_ID= COL.COLUMN_ID "
    		+ "		) AS IS_PRIMARY_KEY, "
    		+ "		CONVERT(VARCHAR(300), COM.VALUE) AS COMMENT "
    		+ "FROM SYS.TABLES TB "
    		+ "INNER JOIN SYS.COLUMNS COL ON COL.OBJECT_ID = TB.OBJECT_ID "
    		+ "LEFT JOIN SYS.TYPES T ON T.USER_TYPE_ID = COL.USER_TYPE_ID "
    		+ "LEFT JOIN SYS.EXTENDED_PROPERTIES COM ON COM.MAJOR_ID = COL.OBJECT_ID AND COM.MINOR_ID = COL.COLUMN_ID "
    		+ "WHERE TB.NAME = '" + TABLE_NAME + "'" ;
	
	
    public DataBaseSqlServerUtil(String ip, Integer port, String userName, String password) {
		super(ip, port, userName, password);
	}

	@Override
	String getDriver() {
		return "com.microsoft.sqlserver.jdbc.SQLServerDriver";
	}

	@Override
	String getNoDataBaseUrl() {
		return "jdbc:sqlserver://" + this.getIp() + ":" + this.getPort()+ ";";
	}

	@Override
	String getUrl(String dataBaseName) {
		return "jdbc:sqlserver://" + this.getIp() + ":" + this.getPort()+ ";databasename=" + dataBaseName;
	}

	@Override
	String getDataBaseSql() {
		return "SELECT name FROM  master..sysdatabases WHERE name NOT IN ( 'master', 'model', 'msdb', 'tempdb', 'northwind','pubs' )";
	}

	@Override
	public List<SrcField> getColumnParams(String dataBaseName, String tableName) {
		 //与数据库的连接
        Connection conn = this.getConnection(dataBaseName);
        
        List<SrcField> srcFieldList = new ArrayList<>();//列名信息集合
        
        Statement stmt = null;
        ResultSet rs = null;
        try {
        	stmt=conn.createStatement(); 
            rs = stmt.executeQuery(DESCRIPTION_PRIMARY_KEY.replace(TABLE_NAME, tableName));
            while (rs.next()) {
            	SrcField srcField = new SrcField();
            	srcField.setComment(rs.getString("COMMENT"));
            	srcField.setName(rs.getString("FIELD"));
            	
            	String type = rs.getString("TYPE");
            	if(!StringUtils.isEmpty(type)) type = type.substring(0, type.indexOf("(") == -1 ? type.length() : type.indexOf("(") );
            	srcField.setDataType(type);
            	
            	String key = rs.getString("IS_PRIMARY_KEY");
            	Integer isPrimaryKey = StringUtils.isEmpty(key) ? 0 : new Integer(key);
            	srcField.setIsPrimaryKey(isPrimaryKey);
            	
            	srcFieldList.add(srcField);
            }
        } 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 srcFieldList;
	}
	public DbColumnType processTypeConvert(String fieldType) {
        String t = fieldType.toLowerCase();
        if (!t.contains("char") && !t.contains("text")) {
        	if (t.contains("smallint") || t.contains("tinyint")) {
        		 return DbColumnType.SMALLINT;
        	} else if (t.contains("bigint")) {
                return DbColumnType.BIGINT;
            } else if (t.contains("int")) {
                return DbColumnType.INT;
            } else if (!t.contains("date") && !t.contains("time") && !t.contains("year")) {
            	if (t.contains("bit") || t.contains("xml") || t.contains("uniqueidentifier")) {
                    return DbColumnType.STRING;
                } else if (t.contains("decimal") || t.contains("money") || t.contains("numeric")) {
                    return DbColumnType.DECIMAL;
                } else if (t.contains("binary") || t.contains("image")) {
                    return DbColumnType.BINARY;
                } else if (t.contains("float")) {
                    return DbColumnType.DOUBLE;
                } else if (t.contains("real")) {
                	return DbColumnType.FLOAT;
                } else {
                    return DbColumnType.STRING;
                }
            } else {
            	if(t.contains("timestamp")){
            		return DbColumnType.BINARY;
            	}else if(t.contains("time")){
            		return DbColumnType.TIMESTAMP;
            	}else{
            		return DbColumnType.DATE;
            	}
            }
        } else {
            return DbColumnType.STRING;
        }
    }
}

postgreSQL

/**
 * postgre查询数据源信息工具类
 *
 */
public class DataBasePostgreUtil extends DataBaseUtil{
	private final static Logger LOGGER = LoggerFactory.getLogger(DataBasePostgreUtil.class);
	
	private static final String TABLE_NAME = "TABLE_NAME";
	
	//查询表字段的信息的sql
	private static final String DESCRIPTION_PRIMARY_KEY = 
    			"SELECT "
    		+ "		COL_DESCRIPTION(A.ATTRELID,A.ATTNUM) AS COMMENT,"
    		+ "		FORMAT_TYPE(A.ATTTYPID,A.ATTTYPMOD) AS TYPE,"
    		+ "		A.ATTNAME AS FIELD, B.NAME KEYNAME "
    		+ "	FROM   PG_ATTRIBUTE AS A "
    		+ "	LEFT JOIN PG_CLASS AS C ON A.ATTRELID = C.OID "
    		+ "	LEFT JOIN ( "
    		+ "			SELECT PG_CONSTRAINT.CONNAME AS PK_NAME,PG_ATTRIBUTE.ATTNAME AS NAME "
    		+ "			FROM PG_CONSTRAINT "
    		+ "			INNER JOIN PG_CLASS ON PG_CONSTRAINT.CONRELID = PG_CLASS.OID "
    		+ "			INNER JOIN PG_ATTRIBUTE ON PG_ATTRIBUTE.ATTRELID = PG_CLASS.OID AND  PG_ATTRIBUTE.ATTNUM = PG_CONSTRAINT.CONKEY[1] "
    		+ "			WHERE PG_CLASS.RELNAME = '" + TABLE_NAME + "' AND PG_CONSTRAINT.CONTYPE='p' "
    		+ "	) B ON A.ATTNAME = B.NAME "
    		+ "	WHERE C.RELNAME = '" + TABLE_NAME + "' AND  A.ATTNUM>0" ;
	
	
    public DataBasePostgreUtil(String ip, Integer port, String userName, String password) {
		super(ip, port, userName, password);
	}

	@Override
	String getDriver() {
		return "org.postgresql.Driver";
	}

	@Override
	String getNoDataBaseUrl() {
		return "jdbc:postgresql://" + this.getIp() + ":" + this.getPort();
	}

	@Override
	String getUrl(String dataBaseName) {
		return "jdbc:postgresql://" + this.getIp() + ":" + this.getPort()+ "/" + dataBaseName;
	}

	@Override
	String getDataBaseSql() {
		return "SELECT DATNAME FROM PG_DATABASE";
	}

	@Override
	public List<SrcField> getColumnParams(String dataBaseName, String tableName) {
		 //与数据库的连接
        Connection conn = this.getConnection(dataBaseName);
        
        List<SrcField> srcFieldList = new ArrayList<>();//列名信息集合
        
        Statement stmt = null;
        ResultSet rs = null;
        try {
        	stmt=conn.createStatement(); 
            rs = stmt.executeQuery(DESCRIPTION_PRIMARY_KEY.replace(TABLE_NAME, tableName));
            while (rs.next()) {
            	SrcField srcField = new SrcField();
            	srcField.setComment(rs.getString("COMMENT"));
            	srcField.setName(rs.getString("FIELD"));
            	
            	String type = rs.getString("TYPE");
            	if(!StringUtils.isEmpty(type)) type = type.substring(0, type.indexOf("(") == -1 ? type.length() : type.indexOf("(") );
            	srcField.setDataType(type);
            	
            	String key = rs.getString("KEYNAME");
            	Integer isPrimaryKey = StringUtils.isEmpty(key) ? 0 : 1;
            	srcField.setIsPrimaryKey(isPrimaryKey);
            	
            	srcFieldList.add(srcField);
            }
        } 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 srcFieldList;
	}
	public DbColumnType processTypeConvert(String fieldType) {
        String t = fieldType.toLowerCase();
        if (!t.contains("char") && !t.contains("text")) {
            if (t.contains("bigint")) {
                return DbColumnType.BIGINT;
            } else if (t.contains("int")) {
                return DbColumnType.INT;
            } else if (!t.contains("date") && !t.contains("time") && !t.contains("year")) {
                if (t.contains("bit")) {
                    return DbColumnType.STRING;
                } else if (t.contains("decimal") || t.contains("numeric")) {
                    return DbColumnType.DECIMAL;
                } else if (t.contains("clob")) {
                    return DbColumnType.STRING;
                } else if (t.contains("blob")) {
                    return DbColumnType.BINARY;
                } else if (t.contains("float")) {
                    return DbColumnType.FLOAT;
                } else if (t.contains("double")) {
                    return DbColumnType.DOUBLE;
                } else if (!t.contains("json") && !t.contains("enum")) {
                    return t.contains("boolean") ? DbColumnType.STRING : DbColumnType.STRING;
                } else {
                    return DbColumnType.STRING;
                }
            } else {
            	if(t.contains("time")){
            		return DbColumnType.TIMESTAMP;
            	}else{
            		return DbColumnType.DATE;
            	}
            }
        } else {
            return DbColumnType.STRING;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值