jdbc之二:DAO模式

来源:互联网 发布:后端开发中配置数据库 编辑:程序博客网 时间:2024/05/08 05:28

详细代码请参见 https://code.csdn.net/jediael_lu/daopattern



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 {@Overridepublic Connection getConnection() throws DaoException {// DataSource dataSource = DataSourceCache.getInstance().getDataSource();        try {        //注册JDBC驱动程序Class.forName("oracle.jdbc.OracleDriver");//打开一个数据库连接String URL = "jdbc:oracle:thin:@172.16.80.155:1521:nfirms";String USERNAME = "geeknews";String PASSWORD = "Lu123456";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对象。

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<Category> 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 {@Overridepublic List<Category> getCategoryList() throws DaoException{String GET_CATEGORY_SQL = "SELECT * FROM T_CATEGORY";List<Category> categoryList = new ArrayList<Category>();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 {@Testpublic void test() throws Exception{CategoryDao categoryDao = new CategoryDaoImpl();List<Category> categoryList = categoryDao.getCategoryList();Iterator<Category> iterator = categoryList.iterator();while(iterator.hasNext()){Category category = iterator.next();System.out.println(category.getCid()+" "+ category.getTitle()+" "+category.getSequnce()+" "+ category.getDeleted()+"  ");}}}

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

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

l  Apache Commons DBCP

l  C3p0

l  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种方式,目前更推荐使用依赖注入。


之后再补充关于连接池以及缓存相关的代码。





0 0