JDBC之二:DAO模式

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值