ConnectionCreater.java------使用JDBC创建数据库连接通用类(第一版)

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);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豢龙先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值