连接管理类:
package com.bai.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
*
* <p>Title: ConnectionManager</p>
* <p>Description:连接管理 </p>
* @author 白永程
* @date 2018年6月15日
*/
public class ConnectionManager {
//创建本地线程对象
private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
//数据库信息
private static String driverName = PropertiesResolver.getValue("db_driver");
private static String url = PropertiesResolver.getValue("db_url");
private static String name = PropertiesResolver.getValue("db_name");
private static String password = PropertiesResolver.getValue("db_password");
//驱动加载
static{
try {
Class.forName(driverName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
//创建连接(限制子类访问)
protected static Connection getConnection(){
//从线程对象获取线程
Connection connection = threadLocal.get();
//判断线程对象是否存在连接
if(connection==null){
try {
//先创建连接对象
connection = DriverManager.getConnection(url, name, password);
//向线程对象添加连接
threadLocal.set(connection);
} catch (SQLException e) {
e.printStackTrace();
}
}
return connection;
}
//关闭资源(限制子类访问)
protected static void closeObject(Object...paras){
try{
if(paras.length>0){
for(Object para:paras){
//判断对象类型,按类型关闭资源
if(para instanceof ResultSet){
((ResultSet) para).close();
}
if(para instanceof PreparedStatement){
((PreparedStatement) para).close();
}
if(para instanceof Connection){
Connection conn =(Connection) para;
//判断连接状态
if(!conn.isClosed()){
conn.close();
conn = null;//提升废弃连接的gc回收效率
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
配置文件解析类:
package com.bai.jdbc;
import java.util.ResourceBundle;
/**
*
* <p>Title: PropertiesResolver</p>
* <p>Description:properties解析类 </p>
* @author 白永程
* @date 2018年6月15日
*/
public class PropertiesResolver {
//声明properties文件读取器
private static ResourceBundle bundle;
static{
bundle = ResourceBundle.getBundle("jdbc");
}
//获取properties文件属性值
public static String getValue(String key){
return bundle.getString(key);
}
}
配置文件jdbc.properties:
db_url=jdbc:mysql://localhost:3306/woniu_auth
db_name=root
db_password=root
db_driver=com.mysql.jdbc.Driver
工具类:
package com.bai.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
* <p>Title: JDBCUtil</p>
* <p>Description:jdbc工具类 </p>
* @author 白永程
* @date 2018年6月15日
*/
public class JDBCUtil extends ConnectionManager{
//执行增、删、改的工具
public static int executeUpdate(String sql,Object...paras){
int row = -1;
//获取连接
Connection conn = getConnection();
//定义预编译对象句柄
PreparedStatement pst = null;
try {
//通过连接对象创建预编译对象
pst = conn.prepareStatement(sql);
//处理预编译sql数据填充
if(paras.length>0){
for(int i = 0;i<paras.length;i++){
pst.setObject(i+1, paras[i]);
}
}
//预编译对象执行更新语句
row = pst.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
ConnectionManager.closeObject(conn,pst);
}
return row;
}
//执行查询的工具
public static List<Map<String,Object>> executeQuery(String sql,Object...paras){
//声明返回数据集句柄
List<Map<String,Object>> result = null;
//获取连接
Connection conn = ConnectionManager.getConnection();
//定义预编译对象句柄
PreparedStatement pst = null;
ResultSet rs = null;
try {
//通过连接对象创建预编译对象
pst = conn.prepareStatement(sql);
//处理预编译sql数据填充
if(paras.length>0){
for(int i = 0;i<paras.length;i++){
pst.setObject(i+1, paras[i]);
}
}
//预编译对象执行查询语句获取结果集
rs = pst.executeQuery();
//为了不暴露ResultSet(暴露ResultSet可能会暴露connection信息)
if(rs != null){
//新建结果集合
result = new ArrayList<Map<String,Object>>();
//获取结果集中的元数据对象
ResultSetMetaData rsd = rs.getMetaData();
//获取总列数
int columnCount = rsd.getColumnCount();
while(rs.next()){
//定义存储结果的集合
Map<String,Object> map = new HashMap<String, Object>();
//遍历每一行数据
for(int i=0;i<columnCount;i++){
//获取列名
String columnName = rsd.getColumnName(i+1);
//获取字段值
Object obj = rs.getObject(columnName);
//存入map
map.put(columnName, obj);
}
//放入结合集合
result.add(map);
}
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeObject(conn,pst,rs);
}
return result;
}
}