博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jdbc之二:DAO模式
阅读量:4316 次
发布时间:2019-06-06

本文共 5838 字,大约阅读时间需要 19 分钟。

详细代码请参见 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 {	@Override	public 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
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 = new CategoryDaoImpl();		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、在数据库中访问数据,最重要且最费时的操作经常是建立连接。按规则,设计良好的应用程序数据库连接应该始终是采用连接池的。

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

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

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

转载于:https://www.cnblogs.com/eaglegeek/p/4557946.html

你可能感兴趣的文章
dell support
查看>>
转:Maven项目编译后classes文件中没有dao的xml文件以及没有resources中的配置文件的问题解决...
查看>>
MTK android 设置里 "关于手机" 信息参数修改
查看>>
单变量微积分笔记6——线性近似和二阶近似
查看>>
补几天前的读书笔记
查看>>
HDU 1829/POJ 2492 A Bug's Life
查看>>
CKplayer:视频推荐和分享插件设置
查看>>
CentOS系统将UTC时间修改为CST时间
查看>>
redis常见面试题
查看>>
导航控制器的出栈
查看>>
玩转CSS3,嗨翻WEB前端,CSS3伪类元素详解/深入浅出[原创][5+3时代]
查看>>
iOS 9音频应用播放音频之播放控制暂停停止前进后退的设置
查看>>
Delphi消息小记
查看>>
HNOI2016
查看>>
JVM介绍
查看>>
将PHP数组输出为HTML表格
查看>>
Java中的线程Thread方法之---suspend()和resume() 分类: ...
查看>>
经典排序算法回顾:选择排序,快速排序
查看>>
BZOJ2213 [Poi2011]Difference 【乱搞】
查看>>
c# 对加密的MP4文件进行解密
查看>>