对JDBC操作数据库的简单封装
先来回顾一下java对数据库操作的典型步骤
1.创建数据库连接Connection
2.创建一个Statement
3.执行数据库操作,返回结果ResultSet
4.捕获处理异常
5.关闭资源和连接
好,就根据以上的步骤一步一步创建自己的数据库管理工具.
首先我们要创建一个数据库管理类DBManager,在这里使用单例模式来创建
private static volatile DBManager instance = null; private DBManager(){ } public static DBManager getInstance(){ if(instance == null){ synchronized(DBManager.class){ if(instance == null){ instance = new DBManager(); } } } return instance; }
接下来,就是连接数据库了,先使用纯正的jdbc进行连接,不使用连接池(下篇会介绍)
在这里我们使用ResourceBundle来读取数据库配置文件
static { try{ ResourceBundle rb = ResourceBundle.getBundle("database"); driver = rb.getString("driver").trim(); url = rb.getString("url").trim(); user = rb.getString("user").trim(); password = rb.getString("password").trim(); }catch(Exception e){ try { throw new DBException("配置文件未找到", e); } catch (Exception ex) { ex.printStackTrace(); } } }
放在static代码块中的原因就不多说了,不知道ResourceBundle的自己google
下面是得到实际的数据库连接
private Connection getConnection() throws DBException{ Connection conn = null; try { Class.forName(driver); } catch (ClassNotFoundException e) { throw new DBException("数据库驱动未找到",e); } try{ conn = DriverManager.getConnection(url, user, password); }catch(SQLException e){ throw new DBException("数据库连接出错,请检查URL,用户名,密码是否正确",e); } return conn; }
在这里使用了DriverManager(会消耗很大的资源),DBEXception为我自己自定义的异常,因为SQLException太宽泛了,在这里分别抛出DBException以便了解到底是在哪里
出现了异常
最后通过一个对查询的封装来展示
/** * * @auther lishan * @description 查询 * @param sql 查询语句 * @param paras 查询参数 对应sql语句中的? * @return 查询结果(ArrayList)方便使用 * @throws DBException * @date 2013年12月16日上午9:27:20 */ @SuppressWarnings("rawtypes") public ArrayList execQuery(String sql,Object ...paras) throws DBException{ //初始化要使用的变量
Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; ResultSetMetaData rsmd = null; ArrayList<HashMap<String,Object>> result = new ArrayList<HashMap<String,Object>>(); try{ conn = getConnection(); //获取连接 ps = conn.prepareStatement(sql); //使用prepareStatment能够增加性能和防止SQL注入 for(int i = 0;i < paras.length;i++){ //将参数赋值给? ps.setObject(i+1, paras[i]); //注意这里是i+1不是i,prepareStatment的索引从1开始 } rs = ps.executeQuery(); //执行查询 rsmd = rs.getMetaData(); //获取元数据用来获得列名 int columnCount = rsmd.getColumnCount();//获得列的总数 while(rs.next()){ //遍历结果集 HashMap<String,Object> row = new HashMap<String,Object>(); for(int i = 1; i < columnCount;i++){ row.put(rsmd.getColumnName(i), rs.getObject(i)); } result.add(row); } }catch(SQLException e){ throw new DBException("数据查询出错", e); }finally{ //关闭资源和连接 try { if(rsmd != null){ rsmd = null; } if(rs != null){ rs.close(); } if(ps != null){ ps.close(); } if(conn != null){ conn.close(); } } catch (SQLException e) { throw new DBException("数据库关闭出错",e); } } return result; }
关于更新,插入,删除的封装和查询代码相似,比查询要简单。
这样就写完了自己的DBUtil了,也不是很难。。。。。。

浙公网安备 33010602011771号