您的位置:首页 > 数据库

JDBC获取数据库信息

2013-11-27 13:42 295 查看
当同一个项目部署到不同数据库环境时,程序中涉及sql语句执行时,由于各种数据库的差异,可能会产生异常。则就需要获取数据库信息做适当处理。

public class DBUtils {
private static Log logger = LogFactory.getLog(DBUtils.class);

private static String dbName;

private static final String DBTYPE_DB2 = "DB2";

private static final String DBTYPE_SYBASE = "Sybase";

private static final String DBTYPE_ORACLE = "Oracle";

private static final String DBTYPE_SQLSERVER = "SqlServer";

private static final String DBTYPE_MYSQL = "MySQL";

/*    private static Cache dbTypeJudgeCache = DBCache.DBTypeJudgeCache;*/

private static String getDatabaseProductName() {
WebApplicationContext webContext = (WebApplicationContext)ComponentFactory.getApplicationContext();
DataSource ds = (DataSource) webContext.getBean("dataSource");
if (dbName != null) {
return dbName;
}
Connection con = null;
try {
con = DataSourceUtils.getConnection(ds);
} catch (DataAccessException ex) {
logger.error("获取数据库连接失败", ex);
}

if (con != null) {
try {
DatabaseMetaData dbmd = con.getMetaData();
if (dbmd != null) {
dbName = dbmd.getDatabaseProductName();
if (dbName != null && dbName.startsWith("DB2/")) {
dbName = DBUtils.DBTYPE_DB2;
} else if (dbName != null && dbName.startsWith("Oracle")) {
dbName = DBUtils.DBTYPE_ORACLE;
} else if (dbName != null
&& dbName.startsWith("Microsoft SQL Server")) {
dbName = DBUtils.DBTYPE_SQLSERVER;
} else if (dbName != null
&& (dbName.equals("Adaptive Server Enterprise") || dbName
.equals("Adaptive Server Anywhere"))) {
dbName = DBUtils.DBTYPE_SYBASE;
} else if (dbName != null && dbName.startsWith("MySQL")) {
dbName = DBUtils.DBTYPE_MYSQL;
}
} else {
logger.warn("获取数据库类型出错");
}
} catch (SQLException se) {
logger.error("获取数据库类型出错", se);
} finally {
DataSourceUtils.closeConnectionIfNecessary(con, ds);
}
}
return dbName;
}

private static String getDbType() {
String dbType = null;
try {
dbType = DBUtils.getDatabaseProductName();
} catch (Exception e) {
// 异常不处理;
}
if (dbType == null) {
dbType = "";
} else {
dbType = dbType.trim();
}
return dbType;
}

// 下面四个方法最好能有更好的办法使每次进来的时候只比较一次,不用每次进来都比较
public static boolean dbTypeIsDB2() {
Boolean is_db2 = new Boolean(false);
logger.debug("使用CACHE前 " + is_db2);
is_db2 = new Boolean(DBUtils.getDbType().equalsIgnoreCase(DBUtils.DBTYPE_DB2));
return is_db2.booleanValue();
}

public static boolean dbTypeIsORACLE() {
Boolean is_oracle = new Boolean(false);
is_oracle = new Boolean(DBUtils.getDbType().equalsIgnoreCase(DBUtils.DBTYPE_ORACLE));
return is_oracle.booleanValue();
}

public static boolean dbTypeIsSYBASE() {
Boolean is_sybase = new Boolean(false);
is_sybase = new Boolean(DBUtils.getDbType().equalsIgnoreCase(DBUtils.DBTYPE_SYBASE));
return is_sybase.booleanValue();
}

public static boolean dbTypeIsSQLSERVER() {
Boolean is_sqlserver = new Boolean(false);
is_sqlserver = new Boolean(DBUtils.getDbType().equalsIgnoreCase(DBUtils.DBTYPE_SQLSERVER));
return is_sqlserver.booleanValue();
}

public static boolean dbTypeIsMYSQL() {
Boolean is_mysql = new Boolean(false);
is_mysql = new Boolean(DBUtils.getDbType().equalsIgnoreCase(DBUtils.DBTYPE_MYSQL));
return is_mysql.booleanValue();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: