package cn.subanfaner.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
/**
* <h3>默认数据库类型:mysql、oracle、sqlserver、postgresql</h3>
* <h3>我们可以使用以下方法创建数据库连接(所有创建链接的方法都可以保证驱动不会被重复注册):</h3>
*
* <blockquote>
* <table border="1" cellspacing="0" cellpadding="4" summary="">
* <tr style="background-color:#ccccff">
* <th align="left">方法</th>
* <th align="left">用途</th>
* </tr>
*
* <tr valign="top">
* <td>getMysqlConnection()</td>
* <td>获取Mysql数据库连接</td>
* </tr>
*
* <tr valign="top" style="background-color:#eeeeff">
* <td>getOracleConnection()</td>
* <td>获取Oracle数据库连接</td>
* </tr>
*
* <tr valign="top">
* <td>getSqlserverConnection()</td>
* <td>获取Sqlserver数据库连接</td>
* </tr>
*
* <tr valign="top" style="background-color:#eeeeff">
* <td>getPostgresqlConnection()</td>
* <td>获取Postgresql数据库连接</td>
* </tr>
*
* <tr valign="top">
* <td>getDefalutConnectionByType()</td>
* <td>根据默认数据库类型获取连接</td>
* </tr>
*
* <tr valign="top" style="background-color:#eeeeff">
* <td>getConnectionByDriver()</td>
* <td>根据数据库驱动获取连接</td>
* </tr>
* </table>
* </blockquote>
* <h3>提供关闭资源的方法:close(AutoCloseable... closeables)</h3>
*
* @author dyw
* @date 2019年5月25日 上午11:29:27
*/
public final class ConnectionCreater {
/** 常用数据库类型 */
private static final String MYSQL = "mysql";
private static final String ORACLE = "oracle";
private static final String SQLSERVER = "sqlserver";
private static final String POSTGRESQL = "postgresql";
/** 数据库类型到数据库驱动映射集合 */
private static Map<String, String> TYPE_DRIVER_MAP = new HashMap<String, String>();
/** 标记已注册驱动 */
private static Map<String, String> DRIVER_REGIDITED = new HashMap<String, String>();
static {
initTypeDriverMap();
}
/**
* 初始化类型驱动集合
*/
private static void initTypeDriverMap() {
TYPE_DRIVER_MAP.put(MYSQL, "com.mysql.jdbc.Driver");
TYPE_DRIVER_MAP.put(ORACLE, "oracle.jdbc.driver.OracleDriver");
TYPE_DRIVER_MAP.put(SQLSERVER, "com.microsoft.jdbc.sqlserver.SQLServerDriver");
TYPE_DRIVER_MAP.put(POSTGRESQL, "org.postgresql.Driver");
}
/**
* 建立mysql连接
*
* @param url 连接地址
* @param user 数据库用户名
* @param password 数据库密码
* @return 数据库连接
*/
public static Connection getMysqlConnection(String url, String user, String password) {
return getDefalutConnectionByType(MYSQL, url, user, password);
}
/**
* 建立oracle连接
*
* @param url 连接地址
* @param user 数据库用户名
* @param password 数据库密码
* @return 数据库连接
*/
public static Connection getOracleConnection(String url, String user, String password) {
return getDefalutConnectionByType(ORACLE, url, user, password);
}
/**
* 建立sqlserver连接
*
* @param url 连接地址
* @param user 数据库用户名
* @param password 数据库密码
* @return 数据库连接
*/
public static Connection getSqlserverConnection(String url, String user, String password) {
return getDefalutConnectionByType(SQLSERVER, url, user, password);
}
/**
* 建立postgresql连接
*
* @param url 连接地址
* @param user 数据库用户名
* @param password 数据库密码
* @return 数据库连接
*/
public static Connection getPostgresqlConnection(String url, String user, String password) {
return getDefalutConnectionByType(POSTGRESQL, url, user, password);
}
/**
* 建立数据库连接(该方法只支持几个默认数据库类型的链接创建),非默认数据库创建链接请使用getConnectionByDriver()方法
*
* @param dbType 数据库类型:mysql、oracle、sqlserver、postgresql
* @param url 连接地址
* @param user 数据库用户名
* @param password 数据库密码
* @return 数据库连接
*/
public static Connection getDefalutConnectionByType(String dbType, String url, String user, String password) {
Connection conn = null;
if (!stringIsNullOrBlank(dbType)) {
if (regeditDefalutDriverByType(dbType.toLowerCase())) {
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return conn;
}
/**
* 建立数据库连接
*
* @param driver 数据库驱动
* @param url 连接地址
* @param user 数据库用户名
* @param password 数据库密码
* @return 数据库连接
*/
public static Connection getConnectionByDriver(String driver, String url, String user, String password) {
Connection conn = null;
if (!stringIsNullOrBlank(driver)) {
if (regeditDriverByDriver(driver)) {
try {
conn = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return conn;
}
/**
* 关闭资源
*
* @param closeables
*/
public static void close(AutoCloseable... closeables) {
if (closeables.length != 0) {
for (AutoCloseable temp : closeables) {
try {
if (temp != null) {
temp.close();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
temp = null;
}
}
}
}
/**
* 注册数据库驱动
*
* @param dbType 数据库类型:默认类型mysql、oracle、sqlserver、postgresql
* @return
*/
private static boolean regeditDefalutDriverByType(String dbType) {
boolean success = true;
try {
if (!DRIVER_REGIDITED.containsKey(dbType)) {// 指定类型驱动未加载
String driver = TYPE_DRIVER_MAP.get(dbType);
if (!stringIsNullOrBlank(driver)) {// 指定类型数据库驱动存在
Class.forName(driver);
DRIVER_REGIDITED.put(dbType, driver);
printToConsole("注册数据库驱动:" + driver);
} else {// 指定类型数据库驱动不存在
success = false;
printToConsole("【错误提示】你所指定的数据库类型\" " + dbType + "\"不是默认数据库类型(mysql、oracle、sqlserver、postgresql)");
}
}
} catch (ClassNotFoundException e) {// 驱动加载出现异常
success = false;
e.printStackTrace();
}
return success;
}
/**
* 数据库驱动注册
*
* @param driver 数据库驱动
* @return
*/
private static boolean regeditDriverByDriver(String driver) {
boolean success = true;
try {
if (!DRIVER_REGIDITED.containsValue(driver)) {// 指定驱动未加载
String dbType = getDatabaseTypeFromDriver(driver);
Class.forName(driver);
DRIVER_REGIDITED.put(dbType, driver);
printToConsole("注册数据库驱动:" + driver);
}
} catch (ClassNotFoundException e) {
success = false;
e.printStackTrace();
}
return success;
}
/**
* 获取数据库类型
*
* @param driver 数据库驱动
* @return 默认数据库返回mysql、oracle、sqlserver、postgresql中的一个;非默认数据库返回驱动全类名
*/
private static String getDatabaseTypeFromDriver(String driver) {
if (isDefalutDatabaseDriver(driver)) {
if (driver.contains(MYSQL))
return MYSQL;
else if (driver.contains(ORACLE))
return ORACLE;
else if (driver.contains(SQLSERVER))
return SQLSERVER;
else
return POSTGRESQL;
} else {
return driver;
}
}
/**
* 判断是否为默认数据库驱动:mysql、oracle、sqlserver、postgresql
*
* @param driver 数据库驱动
* @return 如果是默认数据库类型返回true,否则false
*/
private static boolean isDefalutDatabaseDriver(String driver) {
if (driver.contains(MYSQL) || driver.contains(ORACLE) || driver.contains(SQLSERVER)
|| driver.contains(POSTGRESQL)) {
return true;
}
return false;
}
/**
* 判断字符串是为null或是空字符串
*
* @param str
* @return
*/
private static boolean stringIsNullOrBlank(String str) {
return str == null ? true : str.equals("");
}
/**
* 打印到控制台
*
* @param obj
*/
private static void printToConsole(Object obj) {
System.out.println(obj);
}
}
ConnectionCreater.java------使用JDBC创建数据库连接通用类(第一版)
最新推荐文章于 2022-10-22 20:10:44 发布