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<Map<Object, Object>> getTablesList(Map mapDb) {
Connection conn = getConnection(mapDb);
List<Map<Object, Object>> listRet = new ArrayList<Map<Object, Object>>();
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<Map<Object, Object>> getTableListBydb(Long id, String dbType) {
try {
DataSourceConfig dataSourceConfig = getDataSourceConfig(id);
String password_ = AESUtil.decrypt(dataSourceConfig.getPassword(), Base64Password.BASE64_PASSWORD);
List<Map<Object, Object>> 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);
}
}
}

该代码示例展示了如何使用Java JDBC连接MySQL、Oracle和SQL Server数据库,获取数据库连接并查询表结构,包括表名和备注。通过设置数据库连接属性获取额外的表信息。
&spm=1001.2101.3001.5002&articleId=88076725&d=1&t=3&u=34cf0ecd44ba435fb0e6f927e423543e)
549

被折叠的 条评论
为什么被折叠?



