JAVA根据表名获取Oracle表结构信息

响应实体封装

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author CQY
 * @version 1.0
 * @date 2024/8/15 16:33
 **/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class OracleTableInfo {

    private static final long serialVersionUID = -2767767791747125388L;
    /**
     * 序号
     */
    private int columnId;
    /**
     * 表英文名称
     */
    private String tableName;
    /**
     * 表注释
     */
    private String tableComment;
    /**
     * 字段英文名
     */

    private String columnName;
    /**
     * 字段中文名称
     */
    private String columnComment;
    /**
     * 字段类型
     */
    private String fieldType;
    /**
     * java对应字段类型
     */
    private String columnClassName;
    /**
     * 主键
     */
    private String primaryKey;
    /**
     * 空值验证
     */
    private String allowNull;
    /**
     * 备注
     */
    private String remarks;
}

JDBC工具类

import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import oracle.jdbc.OracleBfile;
import oracle.jdbc.OracleBlob;
import oracle.jdbc.OracleClob;
import oracle.jdbc.OracleNClob;

import java.math.BigDecimal;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author CQY
 * @version 1.0
 * @date 2024/8/15 16:38
 **/
public class JDBCUtils {

    /**
     * ORACLE数据类型映射
     */
    public static final Map<String, String> ORACLE_TYPE_MAP = new HashMap<>();

    static {
        ORACLE_TYPE_MAP.put("NVARCHAR2", String.class.getName());
        ORACLE_TYPE_MAP.put("VARCHAR2", String.class.getName());
        ORACLE_TYPE_MAP.put("CHAR", String.class.getName());
        ORACLE_TYPE_MAP.put("NCHAR", String.class.getName());
        ORACLE_TYPE_MAP.put("LONG", String.class.getName());
        ORACLE_TYPE_MAP.put("NUMBER", BigDecimal.class.getName());
        ORACLE_TYPE_MAP.put("FLOAT", BigDecimal.class.getName());
        ORACLE_TYPE_MAP.put("CLOB", OracleClob.class.getName());
        ORACLE_TYPE_MAP.put("NCLOB", OracleNClob.class.getName());
        ORACLE_TYPE_MAP.put("BLOB", OracleBlob.class.getName());
        ORACLE_TYPE_MAP.put("TIMESTAMP", Timestamp.class.getName());
        ORACLE_TYPE_MAP.put("DATE", Timestamp.class.getName());
        ORACLE_TYPE_MAP.put("RAW", byte[].class.getName());
        ORACLE_TYPE_MAP.put("LONG RAW", byte[].class.getName());
        ORACLE_TYPE_MAP.put("BFILE", OracleBfile.class.getName());
    }

    /**
     * 根据表名获取Oracle表结构信息
     *
     * @param table    表名
     * @param url      数据库连接URL
     * @param user     数据库用户名
     * @param password 数据库密码
     * @return 返回表结构信息列表
     */
    @SuppressWarnings("all")
    public static List<OracleTableInfo> getTableInfo(String table, String url, String user, String password) {
        List<OracleTableInfo> tableInfoList = new ArrayList<>();
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            Class.forName("oracle.jabc.driver.OracleDriver");
            conn = DriverManager.getConnection(url, user, password);
            String sql = "SELECT T1.TABLE_NAME,\n" +
                    "       NVL(T2.COMMENTS, '')                         AS TAB_COMMENTS,\n" +
                    "       T1.COLUMN_NAME,\n" +
                    "       T3.COMMENTS                                  AS COL_COMMENTS,\n" +
                    "       T1.DATA_TYPE ,\n" +
                    "       T1.NULLABLE,\n" +
                    "       T4.CONSTRAINT_NAME,\n" +
                    "       T1.COLUMN_ID\n" +
                    "FROM USER_TAB_COLUMNS T1\n" +
                    "         LEFT JOIN USER_TAB_COMMENTS T2 ON T1.TABLE_NAME = T2.TABLE_NAME AND T2.TABLE_TYPE = 'TABLE'\n" +
                    "         LEFT JOIN USER_COL_COMMENTS T3 ON T1.TABLE_NAME = T3.TABLE_NAME AND T1.COLUMN_NAME = T3.COLUMN_NAME\n" +
                    "         LEFT JOIN (SELECT CONS.CONSTRAINT_NAME, CONS.TABLE_NAME, COLUS.COLUMN_NAME\n" +
                    "                    FROM USER_CONSTRAINTS CONS\n" +
                    "                             INNER JOIN USER_CONS_COLUMNS COLUS ON CONS.CONSTRAINT_NAME = COLUS.CONSTRAINT_NAME\n" +
                    "                    WHERE CONS.CONSTRAINT_TYPE = 'P') T4\n" +
                    "                   ON T1.TABLE_NAME = T4.TABLE_NAME AND T1.COLUMN_NAME = T4.COLUMN_NAME\n" +
                    "WHERE T1.TABLE_NAME = ? \n" +
                    "ORDER BY T1.COLUMN_ID";
            ps = conn.prepareStatement(sql);
            ps.setString(1, table);
            rs = ps.executeQuery();
            while (rs.next()) {
                final String constraintName = StrUtil.nullToEmpty(rs.getString("CONSTRAINT_NAME"));
                String primaryKey = "No";
                if (StrUtil.isNotBlank(constraintName)) {
                    primaryKey = StrUtil.format("Yes({})", constraintName);
                }
                final String tableName = StrUtil.nullToEmpty(rs.getString("TABLE_NAME")).toUpperCase();
                final String columnComment = StrUtil.nullToEmpty(rs.getString("COL_COMMENTS"));
                String nullable = StrUtil.nullToEmpty(rs.getString("NULLABLE"));
                String dataType = StrUtil.nullToEmpty(rs.getString("DATA_TYPE"));
                if (dataType.contains("TIMESTAMP")) {
                    dataType = "TIMESTAMP";
                }
                final String columnclassName = MapUtil.getStr(ORACLE_TYPE_MAP, dataType, "");
                final OracleTableInfo tableInfo = OracleTableInfo.builder()
                        .columnId(rs.getInt("COLUMN_ID"))
                        .tableName(tableName)
                        .tableComment(StrUtil.nullToEmpty(rs.getString("TAB_COMMENTS")))
                        .columnName(StrUtil.nullToEmpty(rs.getString("COLUMN_NAME")))
                        .columnComment(columnComment)
                        .fieldType(dataType)
                        .columnClassName(columnclassName)
                        .primaryKey(primaryKey)
                        .allowNull(nullable)
                        .remarks("")
                        .build();
                tableInfoList.add(tableInfo);
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (ps != null) {
                    ps.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return tableInfoList;
    }
}

Oracle 查询SQL

SELECT T1.TABLE_NAME,
       NVL(T2.COMMENTS, '')  AS TAB_COMMENTS,
       T1.COLUMN_NAME,
       T3.COMMENTS AS COL_COMMENTS,
       T1.DATA_TYPE,
       T1.NULLABLE,
       T4.CONSTRAINT_NAME,
       T1.COLUMN_ID
FROM USER_TAB_COLUMNS T1
         LEFT JOIN USER_TAB_COMMENTS T2 ON T1.TABLE_NAME = T2.TABLE_NAME AND T2.TABLE_TYPE = 'TABLE'
         LEFT JOIN USER_COL_COMMENTS T3 ON T1.TABLE_NAME = T3.TABLE_NAME AND T1.COLUMN_NAME = T3.COLUMN_NAME
         LEFT JOIN (SELECT CONS.CONSTRAINT_NAME, CONS.TABLE_NAME, COLUS.COLUMN_NAME
                    FROM USER_CONSTRAINTS CONS
                             INNER JOIN USER_CONS_COLUMNS COLUS ON CONS.CONSTRAINT_NAME = COLUS.CONSTRAINT_NAME
                    WHERE CONS.CONSTRAINT_TYPE = 'P') T4
                   ON T1.TABLE_NAME = T4.TABLE_NAME AND T1.COLUMN_NAME = T4.COLUMN_NAME
WHERE T1.TABLE_NAME = ?
ORDER BY T1.COLUMN_ID

MySQL实现SQL

-- 表结构
SELECT T1.TABLE_NAME,                   -- 表名
       T2.TABLE_COMMENT,                -- 表的注释
       T1.COLUMN_NAME,                  -- 列名
       T1.COLUMN_COMMENT,               -- 列的注释
       T1.DATA_TYPE,                    -- 数据类型
       T1.IS_NULLABLE,                  -- 是否允许为空
       T1.ORDINAL_POSITION AS COLUMN_ID -- 列的顺序位置
FROM INFORMATION_SCHEMA.COLUMNS T1
         LEFT JOIN INFORMATION_SCHEMA.TABLES T2 ON T1.TABLE_SCHEMA = T2.TABLE_SCHEMA AND T1.TABLE_NAME = T2.TABLE_NAME
WHERE T1.TABLE_NAME = ? -- 过滤出指定的表
ORDER BY T1.ORDINAL_POSITION  -- 按列的顺序位置排序

-- 主外键查询
select * from INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU
where TABLE_NAME = ?
select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
where TABLE_NAME = ?
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里提供一种在 Oracle 数据库中动态修改结构的方法,通过解析 XML 文件来获取表名和列信息,并根据这些信息生成动态的 SQL 语句。具体步骤如下: 1. 解析 XML 文件,获取表名和列信息。 ```java // 解析 XML 文件 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new File("data.xml")); // 获取根节点和表名 Element root = document.getDocumentElement(); String tableName = root.getNodeName(); // 获取信息 List<String> columns = new ArrayList<>(); NodeList nodeList = root.getChildNodes(); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); if (node.getNodeType() == Node.ELEMENT_NODE) { columns.add(node.getNodeName()); } } ``` 2. 根据表名和列信息生成动态的 SQL 语句。 ```java // 生成 SQL 语句 StringBuilder sb = new StringBuilder(); sb.append("CREATE TABLE ").append(tableName).append(" ("); for (String column : columns) { sb.append(column).append(" VARCHAR2(50), "); } sb.append("PRIMARY KEY (").append(columns.get(0)).append("))"); String sql = sb.toString(); System.out.println(sql); ``` 这个示例将 XML 文件中根节点的名称作为表名,将子节点的名称作为列名,并生成一个包含所有列的 VARCHAR2 类型的。你可以根据实际情况修改列的数据类型和的主键约束等信息。注意,生成的 SQL 语句可能存在注入风险,需要进行防范。在实际使用中,请谨慎处理用户输入的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值