JDBC之二:DAO模式
来源:互联网 发布:ug编程怎么加刀补 编辑:程序博客网 时间:2024/05/29 09:13
JDBC之二:DAO模式
@(博客文章)[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种方式,目前更推荐使用依赖注入。
- jdbc之二:DAO模式
- jdbc之二:DAO模式
- JDBC之二:DAO模式
- JDBC之二:DAO模式
- JDBC之Dao模式
- 浅谈JDBC之DAO模式
- JDBC : DAO设计模式
- JDBC---DAO经典模式
- J2EE 之DAO设计模式(二)
- Spring DAO之JDBC
- Spring DAO之JDBC
- JDBC之DAO
- jdbc之DAO
- JDBC-模板模式优化DAO
- JDBC中的Dao设计模式
- JDBC使用DAO工厂模式
- JDBC(七) DAO设计模式
- JDBC基础2之DAO
- c++中实现将字符串按模式分段
- MongoDB高级查询[聚合Group]
- 对文件操作之FileUtils方法大全
- matlab画甘特图(用任意多颜色表示任意多工件)
- gfirefly 学习之ubuntu 15 python 安装memcached, SecureCRT和Eclipse (3)
- JDBC之二:DAO模式
- 模仿赶集网主界面,上下滑动隐藏布局
- 033 - Search in Rotated Sorted Array
- maven下载地址记录
- 黑马程序员-Java集合框架
- 如何让 UITableView 的 headerView跟随 cell一起滚动
- mysql数据库使用常见错误
- 基于innobackupex的mysql备份脚本
- 回溯法解0/1背包问题