JDBC连接,支持 mysql Oracle sqlserver数据库,获取表结构(表名,备注,注释)

 

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.tianque.exception.base.ServiceValidationException;

public final class DbTools {
    private static Logger log = LoggerFactory.getLogger(DbTools.class);

    private DbTools() {
    }

    /**
     * 根据数据库连接参数生成数据库连接对象
     *
     * @param mapDb
     *            {DS_URL:"",DS_USER:"",DS_PASS:"",DS_CS:"10"}
     * @return 返回数据库连接对象
     */
    public static Connection getConnection(Map mapDb) {
        String dsUrl = MapUtils.getString(mapDb, "DS_URL");
        String driver = "oracle.jdbc.driver.OracleDriver";
        if (dsUrl.indexOf("mysql") != -1) {
            driver = "com.mysql.jdbc.Driver";
        }
        if (dsUrl.indexOf("sqlserver") != -1) {
            driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
        }
        Connection conn = null;
        Properties props = new Properties();
        try {
            Class.forName(driver);
            DriverManager.setLoginTimeout(MapUtils.getIntValue(mapDb, "DS_CS", 10));

            props.setProperty("user", MapUtils.getString(mapDb, "DS_USER", ""));
            props.setProperty("password", MapUtils.getString(mapDb, "DS_PASS", ""));
            props.setProperty("remarks", "true"); // 设置可以获取remarks信息
            props.setProperty("useInformationSchema", "true");// 设置可以获取tables remarks信息(mysql时必须设置)

            conn = DriverManager.getConnection(dsUrl, props);
            conn.setAutoCommit(true);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 查询数据库中所有表信息
     *
     * @param mapDb
     *            {DS_URL:"",DS_USER:"",DS_PASS:"",DS_CS:"10"}
     * @return 返回所有表信息
     */
    public static List> getTablesList(Map mapDb) {
        Connection conn = getConnection(mapDb);
        List> listRet = new ArrayList>();
        ResultSet rs = null;
        String dsUser = mapDb.get("DS_USER").toString().toUpperCase();
        String dstype = mapDb.get("DS_TYPE").toString();
        try {
            if (mapDb.get("DataSource_Type").toString().equals("1")
                    || mapDb.get("DataSource_Type").toString().equals("2")) {
                DatabaseMetaData metaData = conn.getMetaData();
                // Oracle要特别注意,其登陆名必须是大写,不然的话是无法获取到相应的数据,而MySQL则不做强制要求。
                rs = metaData.getTables(conn.getCatalog(), dsUser, null, new String[] { dstype });
                while (rs.next()) {
                    String tableName = rs.getString("TABLE_NAME"); // 表名
                    String remarks = rs.getString("REMARKS") == null ? "" : rs.getString("REMARKS"); // 表备注
                    listRet.add(
                            ArrayUtils.toMap(new Object[][] { { "TAB_NAME", tableName }, { "TAB_COMM", remarks } }));
                }
            } else if (mapDb.get("DataSource_Type").toString().equals("3")) {
                String sql = "select \r\n" + "i.TABLE_NAME AS TAB_NAME,\r\n"
                        + "CONVERT(NVARCHAR(100),isnull(g.[value],'')) AS TAB_COMM\r\n" + "from\r\n"
                        + "INFORMATION_SCHEMA.TABLES i\r\n" + "left join sys.tables a  on i.TABLE_NAME =a.name\r\n"
                        + "left join sys.extended_properties g on (a.object_id = g.major_id AND g.minor_id = 0)\r\n"
                        + "where 1=1 and i.TABLE_TYPE like '%" + dstype + "%'";
                PreparedStatement pStatement = conn.prepareStatement(sql);
                ResultSet rSet = pStatement.executeQuery();
                while (rSet.next()) {
                    String tableName = rSet.getString("TAB_NAME"); // 表名
                    String remarks = rSet.getString("TAB_COMM") == null ? "" : rSet.getString("TAB_COMM"); // 表备注
                    listRet.add(
                            ArrayUtils.toMap(new Object[][] { { "TAB_NAME", tableName }, { "TAB_COMM", remarks } }));
                }
            }
            return listRet;
        } catch (SQLException e) {
            throw new ServiceValidationException("连接失败", e);

        } finally {
            DbTools.close(rs, conn);
        }
    }

    public static void close(ResultSet rs, Connection conn) {
        close(rs);
        close(conn);
    }

    /**
     * 关闭数据库对象
     *
     * @param obj
     *            数据库对象
     */
    public static void close(Object obj) {
        if (obj == null) {
            return;
        }
        if (obj instanceof ResultSet) {
            try {
                ((ResultSet) obj).close();
            } catch (SQLException e) {
                log.error(e.getMessage());
            }
        } else if (obj instanceof Statement) {
            try {
                ((Statement) obj).close();
            } catch (SQLException e) {
                log.error(e.getMessage());
            }
        } else if (obj instanceof Connection) {
            Connection c = (Connection) obj;
            try {
                if (!c.isClosed()) {
                    c.close();
                }
            } catch (SQLException e) {
                log.error(e.getMessage());
            }
        }
    }

 

       public List> getTableListBydb(Long id, String dbType) {
        try {
            DataSourceConfig dataSourceConfig = getDataSourceConfig(id);
            String password_ = AESUtil.decrypt(dataSourceConfig.getPassword(), Base64Password.BASE64_PASSWORD);
            List> list = DbTools.getTablesList(ArrayUtils.toMap(new String[][] {
                    { "DS_URL", dataSourceConfig.getUrl() }, { "DS_USER", dataSourceConfig.getUserName() },
                    { "DS_PASS", password_ }, { "DS_TYPE", dbType },
                    { "DataSource_Type", Integer.toString(dataSourceConfig.getDataSourceType()) }, }));
            return list;
        } catch (Exception e) {
            throw new ServiceValidationException("连接失败", e);
        }
    }

}
 

你可能感兴趣的:(mysql,oracle,sqlserver)