对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了,也不是很难。。。。。。

 

posted @ 2013-12-16 15:38  菜菜小三  阅读(385)  评论(0)    收藏  举报