JDBC之二:DAO模式

来源:互联网 发布:屋面变形缝算法 编辑:程序博客网 时间:2024/05/29 03:19

JDBC之二:DAO模式

@(JAVA)[java]

详细代码请参见 https://github.com/lujinhong/dao

一、前期准备

1、创建数据库

create database filter_conf;

2、创建表并插入数据

create table T_CATEGORY(cid Int, title varchar(256), sequnce int, deleted int);insert into T_CATEGORY values(1,lujinhong,1,1);

3、准备pom.xml

我习惯使用maven作包管理,因此在pom.xml中加入以下内容:

<dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>   <version>5.1.36</version></dependency>

OK,开工写代码

二、java创建

1、创建Dao接口。

package com.ljh.jasonnews.server.dao;import java.sql.Connection;public interface Dao {      public Connection getConnection() throws DaoException;}

2、创建BaseDao类,实现Dao接口,主要完成数据库的打开与关闭

package com.ljh.jasonnews.server.dao;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;public class DaoBase implements Dao {    @Override    public Connection getConnection() throws DaoException {            try {                //注册JDBC驱动程序                Class.forName("com.mysql.jdbc.Driver");                //打开一个数据库连接                String URL = "jdbc:mysql://1.2.3.4:3306/filter_conf";                String USERNAME = "lujinhong";                String PASSWORD = "lujinhong";                Connection conn = DriverManager.getConnection(URL,USERNAME,PASSWORD);                return conn;               //return dataSource.getConnection();            } catch (Exception e) {                e.printStackTrace();                throw new DaoException();            }    }    protected void closeDbObject(ResultSet rs, Statement stmt, Connection conn){        if(rs != null){            try {                rs.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if(stmt != null){            try {                stmt.close();            } catch (SQLException e) {                e.printStackTrace();            }        }        if(conn != null){            try {                conn.close();            } catch (SQLException e) {                e.printStackTrace();            }        }    }} 

3、创建DaoException。

 package com.ljh.jasonnews.server.dao;public class DaoException extends Exception{    private String message;    public DaoException(){}    public DaoException(String message){        this.message = message;    }    public String getMessage() {        return message;    }    public void setMessage(String message) {        this.message = message;    }    public String toString(){        return message;    }}

以上为jdbc DAO模式的基本步骤,主要用于获取连接及异常处理。

以下步骤对于每个表均要进行新增类(Dao,***DaoImpl,model.)以及在类中新增方法(DaoFactory)。

4、创建DaoFactory类,用于生产Dao对象。

对于较少的连接,可以在factory中每次直接new 一个***DaoImpl对象,如本例。
对于某些较多的连接,可能需要使用连接池等限制连接数量,说见本文最后面。

package com.ljh.jasonnews.server.dao.factory;import com.ljh.jasonnews.server.dao.CategoryDao;import com.ljh.jasonnews.server.dao.impl.CategoryDaoImpl;public class DaoFactory {    public static CategoryDao getCategoryDao() {        return new CategoryDaoImpl();    }}5、创建Model类。package com.ljh.jasonnews.server.model;public class Category {    public int getCid() {        return cid;    }    public void setCid(int cid) {        this.cid = cid;    }    public String getTitle() {        return title;    }    public void setTitle(String title) {        this.title = title;    }    public int getSequnce() {        return sequnce;    }    public void setSequnce(int sequnce) {        this.sequnce = sequnce;    }    public int getDeleted() {        return deleted;    }    public void setDeleted(int deleted) {        this.deleted = deleted;    }    private int cid;    private String title;    private int sequnce = 0;    private int deleted = 0;}

6、创建***Dao接口,继承Dao接口。

package com.ljh.jasonnews.server.dao;import java.util.List;import com.ljh.jasonnews.server.model.Category;public interface CategoryDao extends Dao{    public List getCategoryList() throws DaoException;}

7、创建***DaoImpl类,继承DaoBase类。

package com.ljh.jasonnews.server.dao.impl;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;import com.ljh.jasonnews.server.dao.CategoryDao;import com.ljh.jasonnews.server.dao.DaoBase;import com.ljh.jasonnews.server.dao.DaoException;import com.ljh.jasonnews.server.model.Category;public class CategoryDaoImpl extends DaoBase implements CategoryDao {    @Override    public List getCategoryList() throws DaoException{        String GET_CATEGORY_SQL = "SELECT * FROM T_CATEGORY";        List categoryList = new ArrayList();        Connection conn = null;        PreparedStatement pStatment =null;        ResultSet rs = null;        try{            conn = getConnection();            System.out.println("a");            pStatment = conn.prepareStatement(GET_CATEGORY_SQL);            System.out.println("b");            rs = pStatment.executeQuery();            System.out.println("c");            while(rs.next()){                Category category = new Category();                category.setCid(rs.getInt("cid"));                category.setTitle(rs.getString("title"));                category.setSequnce(rs.getInt("sequnce"));                category.setDeleted(rs.getInt("deleted"));                categoryList.add(category);            }        }catch(Exception e){            throw new DaoException("Erorr getting Categorys. " + e.getMessage());        }finally{            closeDbObject(rs, pStatment, conn);        }           return categoryList;    }   } 

其它说明:

1、创建TestCase,测试数据库连接。

package com.ljh.jasonnews.server.dao.test;import java.util.Iterator;import java.util.List;import org.junit.Test;import com.ljh.jasonnews.server.dao.CategoryDao;import com.ljh.jasonnews.server.dao.impl.CategoryDaoImpl;import com.ljh.jasonnews.server.model.Category;public class CategoryDaoTest {    @Test    public void test() throws Exception{        CategoryDao categoryDao = DaoFactory.getCategoryDao();        List categoryList = categoryDao.getCategoryList();        Iterator iterator = categoryList.iterator();        while(iterator.hasNext()){            Category category = iterator.next();            System.out.println(category.getCid()+" "+ category.getTitle()+" "+category.getSequnce()+" "+ category.getDeleted()+"  ");        }       }}

2、在数据库中访问数据,最重要且最费时的操作经常是建立连接。按规则,设计良好的应用程序数据库连接应该始终是采用连接池的。

一般而言,使用连接池有以下三种方法:

  • Apache Commons DBCP
  • C3p0
  • Tomcat7中的Tomcat JDBCConnection Pool

    使用Tomcat的项目,建立直接使用TomcatJDBC Connection Pool。调用DataSource.getConnection()方法比较快,因为连接永远不会被关闭:关闭连接时,只要将连接返回池中即可。但是,JNDI查找比较慢,因此,被返回的DataSource经常会被缓存起来。

注:

(1)在调试中,未能使用连接池完成数据库连接,因此本示例中未使用连接池,关于连接池,可参考DataSourceCache.java,但关键是context.xml与web.xml中的配置。

(2)在需要调用context相关的应用中,不能直接使用junit进行测试,而必须创建一个jsp或者servlet,否则,在以下代码中会报错:

 Context envContext = (Context)context.lookup("java:/comp/env");

(3)作用连接池有JNDI及依赖注入2种方式,目前更推荐使用依赖注入。

原创粉丝点击