为了连接oracle数据库的方便性,写了一个工具类,每次需要对数据库的操作时,只要调用该类,写好连接数据库的语句即可,这里是对整个需要访问数据库进行了封装。
package com.yc.api.jdbc.util;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
import org.apache.logging.log4j.LogManager;
public class DBHelper {
private static DataSource dataSource;
static {
try {
//Class.forName(DRIVER_CLASS_NAME); // 1.加载驱动
Properties props = new Properties();
props.load(DBHelper.class.getClassLoader().getResourceAsStream("db.properties"));
//使用连接池技术, 数据源DBCP
dataSource = BasicDataSourceFactory.createDataSource(props);
LogManager.getLogger().debug("加载数据库属性元素构建数据源成功...");
} catch (Exception e) {
LogManager.getLogger().error("加载数据库属性元素构建数据源!!!", e);
}
}
/**
* 建立连接
*
* @return
*/
public static Connection getConn() {
Connection con = null;
try {
// 2.建立与数据库的 连接
//使用连接池技术, 数据源DBCP
con = dataSource.getConnection();
LogManager.getLogger().debug("数据库连接成功...");
} catch (Exception e) {
LogManager.getLogger().error("数据库连接失败!!!", e);
}
return con;
}
/**
* 关闭操作
*
* @param con
* 数据库连接
* @param st
* sql执行工具
* @param rs
* 返回结果集
*/
public static void close(Connection con, Statement st, ResultSet rs) {
if (rs != null) {
try {
rs.close();
LogManager.getLogger().debug("关闭结果集完成...");
} catch (SQLException e) {
LogManager.getLogger().error("关闭结果集失败!!!", e);
}
}
if (st != null) {
try {
st.close();
LogManager.getLogger().debug("关闭执行工具完成...");
} catch (SQLException e) {
LogManager.getLogger().error("关闭执行工具失败!!!", e);
}
}
if (con != null) {
try {
con.close();
LogManager.getLogger().debug("关闭数据库连接完成...");
} catch (SQLException e) {
LogManager.getLogger().error("关闭数据库连接失败!!!", e);
}
}
}
/**
*
* @param sql
* 要执行的sql语句 insert, update, delete)
* @param params
* 执行sql语句需要的参数
* @return 执行sql语句受影响的行数
*/
public static int doUpdate(String sql, Object... params) {
Connection con = null;
PreparedStatement st = null;
int result = 0;
try {
con = getConn();
LogManager.getLogger().debug("要执行sql语句:" + sql);
st = con.prepareStatement(sql);
setParams(st, params); // 设置参数
LogManager.getLogger().debug("sql执行工具创建成功...");
} catch (SQLException e) {
LogManager.getLogger().error("sql执行工具创建失败!!!", e);
}
try {
result = st.executeUpdate(); // 执行sql , 针对insert, delete,
// update, 返回结果是受影响行数
LogManager.getLogger().debug("插入数据成功,插入数据的条数是::" + result);
} catch (SQLException e) {
LogManager.getLogger().error("插入数据失败!!!", e);
}finally{
// 5.关闭连接
DBHelper.close(con, st, null);
}
return result;
}
/**
*
* @param sql 要执行的sql语句
* @param objs 执行sql语句需要的参数
* @return 取出数据库的数据,每一条记录是一个map : key是字段名或字段别名(小写字母), value应对字段的值
*/
public static List<Map<String, Object>> doQuery(String sql, Object...objs){
Connection con = null;
PreparedStatement st = null;
ResultSet rs = null;
List<Map<String, Object>> results = null;
try {
con = getConn();
st = con.prepareStatement(sql); // 3.sql执行工具
setParams(st, objs);
LogManager.getLogger().debug("sql执行工具创建成功...");
} catch (SQLException e) {
LogManager.getLogger().error("sql执行工具创建失败!!!", e);
}
try {
rs = st.executeQuery(); // 4.执行sql取到返回数据白结果集
LogManager.getLogger().debug("执行sql取到返回数据成功...");
} catch (SQLException e) {
LogManager.getLogger().error("执行sql取到返回数据失败!!!", e);
}
try {
ResultSetMetaData rsmd = rs.getMetaData(); // 元数据; 对象取取到的结果集数据的描述
int cloumCount = rsmd.getColumnCount();
results = new ArrayList<Map<String, Object>>();
while (rs.next()) { // 判断结果集是否还有数据 (数据是一条记录的方式取出)
Map<String, Object> record = new HashMap<String, Object>();
for (int i = 1; i <= cloumCount; i++) {
//rsmd.getColumnName(i) :表的字段名或字段别名
//rs.getObject(i) : 取到字段对应的值
record.put(rsmd.getColumnName(i).toLowerCase(), rs.getObject(i));
}
results.add(record);
}
LogManager.getLogger().debug("取出结果集数据完成...");
} catch (SQLException e) {
LogManager.getLogger().error("取出结果集数据失败!!!", e);
} finally {
DBHelper.close(con, st, rs);
}
return results;
}
/**
*
* @param sql 要执行的sql语句
* @param objs 执行sql语句需要的参数
* @return 取出数据库的数据, key是字段名或字段别名(小写字母), value应对字段的值
*/
public static Map<String, Object> doQueryOne(String sql, Object...objs){
Connection con = null;
PreparedStatement st = null;
ResultSet rs = null;
Map<String, Object> results = null;
try {
con = getConn();
st = con.prepareStatement(sql); // 3.sql执行工具
setParams(st, objs);
LogManager.getLogger().debug("sql执行工具创建成功...");
} catch (SQLException e) {
LogManager.getLogger().error("sql执行工具创建失败!!!", e);
}
try {
rs = st.executeQuery(); // 4.执行sql取到返回数据白结果集
LogManager.getLogger().debug("执行sql取到返回数据成功...");
} catch (SQLException e) {
LogManager.getLogger().error("执行sql取到返回数据失败!!!", e);
}
try {
ResultSetMetaData rsmd = rs.getMetaData(); // 元数据; 对象取取到的结果集数据的描述
int cloumCount = rsmd.getColumnCount();
if (rs.next()) { // 判断结果集是否还有数据 (数据是一条记录的方式取出)
results = new HashMap<String, Object>();
for (int i = 1; i <= cloumCount; i++) {
//rsmd.getColumnName(i) :表的字段名或字段别名
//rs.getObject(i) : 取到字段对应的值
results.put(rsmd.getColumnName(i).toLowerCase(), rs.getObject(i));
}
}
LogManager.getLogger().debug("取出结果集数据完成...");
} catch (SQLException e) {
LogManager.getLogger().error("取出结果集数据失败!!!", e);
} finally {
DBHelper.close(con, st, rs);
}
return results;
}
private static void setParams(PreparedStatement st, Object... objs) {
// 判断是否有参数
if (objs == null || objs.length == 0) {
return;
}
int flag = 0;
try {
for (int i = 0; i < objs.length; i++) {
flag = i + 1;
String paramType = objs[i].getClass().getName(); // 获得参数的类型
if (Integer.class.getName().equals(paramType)) { // 判断是否是int类型
st.setInt(i + 1, (int) objs[i]);
} else if (Double.class.getName().equals(paramType)) { // 判断是否是dobule类型
st.setDouble(i + 1, (double) objs[i]);
} else if (String.class.getName().equals(paramType)) { // 判断是否是string类型
st.setString(i + 1, (String) objs[i]);
} else {
st.setObject(i + 1, objs[i]);
}
}
} catch (SQLException e) {
LogManager.getLogger().error(String.format("注入第%d值时失败!!!", flag),e);
}
}
}