oracle封装方法

2 篇文章 0 订阅

为了连接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);
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值