Eclipse 中jdbc连接Oracle数据库的封装
2015-07-16 14:36
615 查看
Eclipse 中jdbc连接Oracle数据库的封装
1、定义一个DBHelper类,用于对数据库的连接进行封装,实现数据库的自定义连接
定义一个名为log4j.properties的配置文件,用于生成日志文件,便于数据库连接的测试和信息回馈。
定义一个名为jdbc.properties的配置文件用于数据库连接的配置信息的存放。
定义一个DBConfig类,用于对数据库配置文件jdbc.properties的读取和连接。
2、先在对每个类和配置文件进行实现。
1、编写jdbc.properties的配置文件
driver=oracle.jdbc.OracleDriver url=jdbc:oracle:thin:@localhost:1521:yc user=xh password=a
其中存入的是键值对<key, value>的形式,把数据库的配置信息存入,使用时只要写入键值就可以了。 driver的值是数据库加载类, url是数据库的位置, user是要登录数据库的用户名, password是登录密码。
2、编写DBConfig类,用于读取配置信息
public class DBConfig extends Properties{ private static final Logger LOG = Logger.getLogger(DBHelper.class); private static DBConfig dbConfig = new DBConfig(); private DBConfig(){ try { LOG.debug("开始读取数据库配置文件:jdbc.properties" ); <span style="white-space:pre"> </span>//获取数据库配置文件 <span style="white-space:pre"> </span>InputStream in = DBConfig.class.getClassLoader().getResourceAsStream("jdbc.properties"); <span style="white-space:pre"> </span>LOG.debug("读取数据库配置文件成功。"); <span style="white-space:pre"> </span>LOG.debug("读取数据库配置文件成功。"); <span style="white-space:pre"> </span>load(in);<span style="white-space:pre"> </span>//装载配置文件 <span style="white-space:pre"> </span>LOG.debug("加载数据库配置文件完成。"); } catch (IOException e) { LOG.error("加载数据库配置文件jdbc.properties失败!!!",e); } } public static DBConfig getInstance(){ return dbConfig; } public static String getValue(String configName){ return dbConfig.getProperty(configName); } }
其中第一句是定义日志,日志文件下一步说。
3、编写日志文件log4j.properties
log4j.rootLogger = error, stdout,fileout log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout = org.apache.log4j.TTCCLayout log4j.appender.fileout = org.apache.log4j.FileAppender log4j.appender.fileout.File = yc2015_6_21.log log4j.appender.fileout.layout = org.apache.log4j.PatternLayout log4j.appender.fileout.layout.conversionPattern = %d %5p %l %m%n //设置包的日志级别log4g.logger.xxx.xxx : xxx表示包名 log4j.logger.com.yc = debuge
4、编写DBHelper类
public class DBHelper { //定义日志 private static final Logger LOG = Logger.getLogger(DBHelper.class); // 数据库的驱动,加载只进行一次就可以了 static { try { LOG.debug("开始加载驱动。" + DBConfig.getValue("driver")); // Class.forName("oracle.jdbc.OracleDriver"); Class.forName(DBConfig.getValue("driver")); LOG.debug("加载驱动成功。"); } catch (ClassNotFoundException e) { LOG.error("加载驱动失败!!!", e); } } // 数据库连接是在需要操作sql的时候使用 public static Connection getConn() { Connection con = null; try { LOG.debug("开始连接 数据库:" + "jdbc:oracle:thin:@localhost:1521:yc"); con = DriverManager.getConnection(DBConfig.getValue("url"), DBConfig.getValue("user"), DBConfig.getValue("password")); // con = DriverManager.getConnection(DBConfig.getValue("url"), // DBConfig.getInstance()); LOG.debug("数据库连接成功。"); } catch (SQLException e) { LOG.error("数据库连接失败!!!", e); } return con; } // 关闭连接,节省连接资源 public static void close(Connection con, Statement st, ResultSet rs) { if (rs != null) { // 关闭结果集 try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (st != null) { // 关闭执行工具 try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if (con != null) { // 关闭连接 try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } // 执行: 数据:程序 ==> 数据库, 数据库 ==> 程序 // 数据: 程序 ==> 数据库 /** * @param sql sql语句 * @param params sql语句中占位符所对应的值 * @return 执行sql语句受影响的行数 */ public static int executeUpdate(String sql, List<Object> params) { Connection con = null; // 定义连接 PreparedStatement ps = null; int count = 0; //影响的行数 try { con = getConn(); //取得连接 LOG.debug("开始预加载sql语句:" + sql); ps = con.prepareStatement(sql); LOG.debug("预加载sql语句完成。"); setParamValue(ps, params); //给占位符注指 LOG.debug("开始执行sql语句:" + sql); count = ps.executeUpdate(); //执行sql语句 LOG.debug("执行sql语句成功"); } catch (SQLException e) { e.printStackTrace(); } finally { close(con, ps, null); //关闭连接 } if (count > 0) { System.out.println("操作成功。。"); } else { System.out.println("操作失败。。"); } return count; } // 执行多条语句 /** * @param sqls: SQL语句与占位符的键值对的集合 * @param isAutoCommit: 是否自动事务TRUE:自动 ,FALSE:手动 * @return */ public static int executeUpdate(Map<String,List<Object>> sqls, boolean isAutoCommit){ Connection con = null; //定义连接 PreparedStatement ps = null; int count = 0; try { con = getConn(); //取得连接 con.setAutoCommit(isAutoCommit); //自动提交 for(Entry<String, List<Object>> sql : sqls.entrySet()){ try { LOG.debug("开始预加载sql语句:" + sql.getKey()); ps = con.prepareStatement(sql.getKey()); LOG.debug("预加载sql语句完成。"); setParamValue(ps, sql.getValue());//给占位符注入值 LOG.debug("开始执行sql语句:" + sql.getKey()); count = ps.executeUpdate(); //执行sql语句 LOG.debug("执行sql语句成功"); } catch (SQLException e) { LOG.error("执行sql语句:" + sql + "失败!!"); if(!isAutoCommit){ //如果有事务,一旦出现就向外抛出异常 throw new SQLException(e); } } } if(!isAutoCommit){ con.commit(); //如果不自动事务,就要自己提交事务 } }catch (SQLException e) { count = 0; LOG.error("执行sql语句失败!!" + e); try{ con.rollback(); }catch (SQLException e1) { LOG.error("执行回滚任务失败!!" ,e); } }finally{ close(con, ps, null); // } return count; } //数据 : 数据库 ==> 程序 public static List<Map<String, Object>> executeQuery(String sql, List<Object> params){ Connection con = null; // 取到连接 PreparedStatement ps = null; ResultSet rs = null; List<Map<String, Object>> results = null; try { con = getConn(); LOG.debug("开始预加载sql语句:" + sql); ps = con.prepareStatement(sql); LOG.debug("预加载sql语句完成。"); setParamValue(ps, params); LOG.debug("开始执行sql语句:" + sql); rs = ps.executeQuery(); LOG.debug("执行sql语句成功"); results = new ArrayList<Map<String, Object>>(); ResultSetMetaData rsmd = rs.getMetaData(); int cc = rsmd.getColumnCount(); while(rs.next()){ Map<String, Object> record = new HashMap<String, Object>(); for(int i=0; i <= cc; i++){ Object obj = rs.getObject(i); if(obj instanceof Timestamp){ obj = new Date(((Timestamp)obj).getTime()); } record.put(rsmd.getColumnName(i).toLowerCase(),obj); } results.add(record); } } catch (SQLException e) { LOG.error("执行sql语句:" + sql + "失败!!!"); } finally { close(con, ps, rs); } return results; } // public static void setParamValue(PreparedStatement ps, List<Object> params) { for (int i = 0; i < params.size(); i++) { try { Object obj = params.get(i); // 判断一个对象属于什么类型 if (params.get(i) instanceof java.util.Date) { // 因为java.sql.Date包含日期和时间,java.util.Date只包含日期 不合适 // 需要有时分秒的日期类型 Timestamp obj = new Timestamp(((java.util.Date) obj).getTime()); } LOG.debug("开始给占位符在" + (i + 1) + "的位置注值" + obj); ps.setObject(1 + i, obj); LOG.debug("开始给占位符在" + (i + 1) + "的位置注值成功!!"); } catch (SQLException e) { LOG.error("给占位符" + (i + 1) + "的位置注值失败!!!"); } } } public static void main(String[] args) { if (getConn() != null) { System.out.println("数据库连接成功。"); } else { System.out.println("数据库连接失败!!!"); } } }
相关文章推荐
- ORACLE里SQL语句的执行计划(二)
- java如何将一个List传入Oracle存储过程
- oracle物化视图创建
- Oracle sqlldr导入导出txt数据文件详解
- ORACLE 常用函数——转换函数
- Win7 安装Oracle问题
- 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之集群概念介绍(一)
- oracle组内排序
- 解决重装 Oracle 出现的 INS-32025 问题,完全卸载 Oracle11g
- exp\imp 导入导出命令使用
- Oracle库Delete删除千万以上普通堆表数据的方法
- oracle系统表
- oracle系统表
- Oracle创建DBLink
- oracle 使表主键失效,外键失效
- Oracle通过时间点快照来恢复数据
- Linux大内存页Oracle数据库优化
- 有关oracle表空间查询的一些记录
- oracle中去掉文本中的换行符、回车符、制表符
- 如何获得 oracle RAC 11g asm spfile S档