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

 

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

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

 

 

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

 

 

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

jdbc之二:DAO模式 分类: B1_JAVA 2014-04-29 15:13 1536人阅读 评论(0) 收藏的更多相关文章

  1. 【solr基础教程之二】索引 分类: H4_SOLR/LUCENCE 2014-07-18 21:06 3331人阅读 评论(0) 收藏

    一.向Solr提交索引的方式 1.使用post.jar进行索引 (1)创建文档xml文件 <add> <doc> <field name="id"&g ...

  2. Find The Multiple 分类: 搜索 POJ 2015-08-09 15:19 3人阅读 评论(0) 收藏

    Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 21851 Accepted: 8984 Sp ...

  3. 周赛-DZY Loves Chessboard 分类: 比赛 搜索 2015-08-08 15:48 4人阅读 评论(0) 收藏

    DZY Loves Chessboard time limit per test 1 second memory limit per test 256 megabytes input standard ...

  4. 欧拉通路-Play on Words 分类: POJ 图论 2015-08-06 19:13 4人阅读 评论(0) 收藏

    Play on Words Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 10620 Accepted: 3602 Descri ...

  5. Ultra-QuickSort 分类: POJ 排序 2015-08-03 15:39 2人阅读 评论(0) 收藏

    Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 48111   Accepted: 17549 ...

  6. Drainage Ditches 分类: POJ 图论 2015-07-29 15:01 7人阅读 评论(0) 收藏

    Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 62016 Accepted: 23808 De ...

  7. cf 61E. Enemy is weak 树状数组求逆序数(WA) 分类: Brush Mode 2014-10-19 15:16 104人阅读 评论(0) 收藏

    #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> ...

  8. max_flow(Dinic) 分类: ACM TYPE 2014-09-02 15:42 94人阅读 评论(0) 收藏

    #include <cstdio> #include <iostream> #include <cstring> #include<queue> #in ...

  9. SQL 分组 加列 加自编号 自编号限定 分类: SQL Server 2014-11-25 15:41 283人阅读 评论(0) 收藏

    说明: (1)日期以年月形式显示:convert(varchar(7),字段名,120) , (2)加一列 (3)自编号: row_number() over(order by 字段名 desc) a ...

随机推荐

  1. HDOJ 5357 Easy Sequence DP

    a[i] 表示以i字符开头的合法序列有多少个 b[i] 表示以i字符结尾的合法序列有多少个 up表示上一层的'('的相应位置 mt[i] i匹配的相应位置 c[i] 包括i字符的合法序列个数  c[i ...

  2. 利用zip格式实现手机客户端二维码扫描分享识别

    场景: 用户A想要将某应用推荐给用户B,用户B扫描用户A的手机app中的二维码进行下载和安装, 并且需要识别用户B是扫描了用户A的二维码,进而给用户A一定的奖励. (例如:健一网app) zip格式: ...

  3. Android中关于JNI 的学习(零)简单的样例,简单地入门

    Android中JNI的作用,就是让Java可以去调用由C/C++实现的代码,为了实现这个功能.须要用到Anrdoid提供的NDK工具包,在这里不讲怎样配置了,好麻烦,配置了好久. . . 本质上,J ...

  4. 去掉“此电脑”中的“WPS云文档”图标

    平台:Win10 问题:安装了WPS2019专业版后,此电脑窗口出现了一个WPS云文档图标,无法删除,云文档设置中也无法取消. 解决:打开注册表,定位到HKEY_CURRENT_USER\Softwa ...

  5. eclipse中修改了代码编译后执行不起作用

    在网上试了好多方法都没解决 后来,删了eclipse里的服务器,重新创建了一下,重新运行自己的工程发现修改的代码起作用了.

  6. BZOJ4196: [Noi2015]软件包管理器(树链剖分)

    Description Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖( ...

  7. WCF 字节数据传输

    准备工作 1.新建一个工程,添加一个WCF服务库, 然后公共的类库, 添加一个默认可序列化的的CompositeType类用于压缩. [Serializable] public class Compo ...

  8. 洛谷 P1724 东风谷早苗

    P1724 东风谷早苗 题目描述 在幻想乡,东风谷早苗是以高达控闻名的高中生宅巫女.某一天,早苗终于入手了最新款的钢达姆模型.作为最新的钢达姆,当然有了与以往不同的功能了,那就是它能够自动行走,厉害吧 ...

  9. 【编程】辨异 —— proxy 与 delegate

    二者分别对应着设计模式中的代理模式和委托模式. proxy:译为代理, 被代理方(B)与代理方(A)的接口完全一致. 主要使用场景(语义)应该是:为简化编程(或无法操作B),不直接把请求交给被代理方( ...

  10. chrome 的input 上传响应慢问题解决方案

    <input type="file" accept="image/png,image/jpeg,image/gif" class="form-c ...