Eclipse 中jdbc连接Oracle数据库的封装

来源:互联网 发布:非农数据看过你 编辑:程序博客网 时间:2024/06/04 20:14

Eclipse 中jdbc连接Oracle数据库的封装

1、定义一个DBHelper类,用于对数据库的连接进行封装,实现数据库的自定义连接
定义一个名为log4j.properties的配置文件,用于生成日志文件,便于数据库连接的测试和信息回馈。
定义一个名为jdbc.properties的配置文件用于数据库连接的配置信息的存放。
定义一个DBConfig类,用于对数据库配置文件jdbc.properties的读取和连接。


2、先在对每个类和配置文件进行实现。
1、编写jdbc.properties的配置文件

driver=oracle.jdbc.OracleDriverurl=jdbc:oracle:thin:@localhost:1521:ycuser=xhpassword=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,fileoutlog4j.appender.stdout = org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout = org.apache.log4j.TTCCLayoutlog4j.appender.fileout = org.apache.log4j.FileAppenderlog4j.appender.fileout.File = yc2015_6_21.log  log4j.appender.fileout.layout = org.apache.log4j.PatternLayoutlog4j.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只包含日期 不合适// 需要有时分秒的日期类型 Timestampobj = 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("数据库连接失败!!!");}}}



0 0
原创粉丝点击