Java学习之DAO设计模式
DAO设计模式是一个javaEE里的设计模式,DAO是Data Access Object 数据访问接口。
一个典型的DAO实现有三个组件:
1、一个DAO接口
2、一个DAO接口的具体类;
3、数据传递对象(DTO)或者叫值对象(VO)或者叫领域模型(domain)【个人认为就是数据库表里对应的java对象类】
举个例子:
首先在数据库建一个表Person有四个字段id(pk),name,age,desc(描述);
然后建立domain
package com.gh.domain;
public class Person {
private int id;
private String name;
private int age;
private String desc;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public Person(String name, int age, String desc) {
super();
this.name = name;
this.age = age;
this.desc = desc;
}
public Person() {
super();
}
//本来id在数据库里想弄成自动增长不用传的结果oracle里比mysql麻烦些就传了id
public Person(int id, String name, int age, String desc) {
super();
this.id = id;
this.name = name;
this.age = age;
this.desc = desc;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", age=" + age
+ ", desc=" + desc + "]";
}
}
然后写Person的Dao接口
package com.gh.Dao; import java.sql.SQLException;
import java.util.List; import com.gh.domain.Person;
/**
* Person类的DAO接口
* @author ganhang
*
*/
public interface PersonDao{
//添加
public void add(Person p) throws SQLException;
//更新
public void update(Person p)throws SQLException;
//删除
public void delete(int id)throws SQLException;
//通过id查person
public Person findById(int id)throws SQLException;
//查找所以Person
public List<Person> findAll()throws SQLException; }
然后Dao接口的实现类
package com.gh.Dao.impl; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import javax.sound.sampled.Line; import com.gh.Dao.PersonDao;
import com.gh.db.JdbcUtil;
import com.gh.domain.Person; /**
* PersonDao接口的实现
*
* @author ganhang
*
*/
public class PersonDaoImpl implements PersonDao {
//添加
@Override
public void add(Person p) throws SQLException {
// oracle 没有主键自动增长 必须用序列和触发器,这边就直接传id了。
String sql = "insert into Person(id,name,age,description) values(?,?,?,?)";
//这里做了优化,写个模版类处理所以更删改操作
JdbcTemplete.Update(sql, p.getId(), p.getName(), p.getAge(),
p.getDesc());
}
//更新
@Override
public void update(Person p) throws SQLException {
String sql = "update Person set name=?,age=?,description=? where id=?";
JdbcTemplete.Update(sql, p.getName(), p.getAge(), p.getDesc(),
p.getId());
}
//删除
@Override
public void delete(int id) throws SQLException {
String sql = "delete Person where id=?";
JdbcTemplete.Update(sql, id); }
//通过id查询
@Override
public Person findById(int id) throws SQLException {
String sql = "select * from Person where id=?";
//由于JdbcTemplete封装了查询方法,每个处理结果的方法不同这里用了策略模式
return (Person) JdbcTemplete.Query(sql, new ResultSetHandler() {
@Override
public Object doHandler(ResultSet rs) throws SQLException {
Person p = null;
// 这里只查询一个person
if (rs.next()) {
p = new Person();
p.setId(rs.getInt(1));
p.setName(rs.getString(2));
p.setAge(rs.getInt(3));
p.setDesc(rs.getString(4));
}
return p;
}
}, id);
}
//查询所有
@SuppressWarnings("unchecked")
@Override
public List<Person> findAll() throws SQLException {
String sql = "select * from Person";
return (List<Person>) JdbcTemplete.Query(sql, new ResultSetHandler() {
@Override
public Object doHandler(ResultSet rs) throws SQLException {
List<Person> Persons = new ArrayList<Person>();
Person p = null;
while (rs.next()) {
p = new Person();
p.setId(rs.getInt(1));
p.setName(rs.getString(2));
p.setAge(rs.getInt(3));
p.setDesc(rs.getString(4));
Persons.add(p);
}
return Persons;
}
});
} }
JdbcTemplete的实现
package com.gh.Dao.impl; import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import com.gh.db.JdbcUtil;
/**
* PersonDaoImpl类的模板类
* @author ganhang
*
*/
public class JdbcTemplete {
/**
* 更新方法(包括更、删、改)
* @param sql sql语句
* @param args 占位符参数
*/
public static void Update(String sql, Object... args)throws SQLException {
Connection conn = JdbcUtil.getConnection();
try {
//设置占位符的参数
PreparedStatement ps = conn.prepareStatement(sql);
if (args != null) {
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
}
ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 查询方法
* @param sql sql语句
* @param handler 结果集的处理的接口
* @param args
* @return
*/
public static Object Query(String sql,ResultSetHandler handler,Object...args)throws SQLException{
Connection conn=JdbcUtil.getConnection();
PreparedStatement ps=null;
ResultSet rs=null;
try {
ps = conn.prepareStatement(sql);
if(args!=null){
for(int i=0;i<args.length;i++){
ps.setObject(i+1, args[i]);
}
}
rs=ps.executeQuery();
return handler.doHandler(rs);
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
}
ResultSetHandler的实现
package com.gh.Dao.impl; import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 结果集处理接口
* @author ganhang
*
*/
public interface ResultSetHandler {
public Object doHandler(ResultSet rs)throws SQLException;
}
这样对于Person表的增删改查就实现了。
Java学习之DAO设计模式的更多相关文章
- java学习面向对象之设计模式之单例模式
就像上一节当中我们讲到的数组工具集一样,如果我们把他看作一个类,来应用,不阻止他new函数的话,这个类我们在整个过程当中我们只是用他来当一个工具.假如每次用都要new一下产生一个新对象的话,就会显得整 ...
- java中的DAO设计模式
创建数据库和表 sql语句: DROP TABLE IF EXISTS product; CREATE TABLE product( product_id varchar(20) NOT NULL, ...
- JAVA学习笔记--策略设计模式与适配器模式
一.策略设计模式 创建一个能够根据所传递对象的不同而具有不同行为的方法被称为策略设计模式:这类方法包含所要执行的算法中固定不变的部分,而“策略”包含变化的部分.策略就是传递进去的参数对象,它包含要执行 ...
- java学习之观察者设计模式
package com.gh.observer; import java.util.Observable; /** * 被观察者对象 * 必须继承被观察者抽象类 * @author ganhang * ...
- JavaWeb学习笔记——DAO设计模式
- MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- java之 ------ DAO设计模式的【具体解释】及常见设计模式的【应用】
DAO Data Access Object(数据訪问接口) 一.场景和问题 在Java程序中.常常须要把数据持久化,也须要获取持久化的数据.可是在进行数据持久化的过程中面临诸多问题(如:数据源 不同 ...
- 【Java语言特性学习之一】设计模式
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...
- Java Dao设计模式
一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是客户端,简单的来说就是浏览器. 2.显示层:JSP/S ...
随机推荐
- cocostudio导出plist文件
今天在用Armature类时用到cocostudio导出文件,由于美术的原因他使用的是中文命名法(这你敢相信),后面在导入程序中跟了下代码发现是解析plist文件有误,我就来比较正常功能文件和有错文件 ...
- BZOJ 1565: [NOI2009]植物大战僵尸( 最小割 )
先拓扑排序搞出合法的, 然后就是最大权闭合图模型了.... --------------------------------------------------------------------- ...
- BZOJ 3439: Kpm的MC密码( trie + DFS序 + 主席树 )
把串倒过来插进trie上, 那么一个串的kpm串就是在以这个串最后一个为根的子树, 子树k大值的经典问题用dfs序+可持久化线段树就可以O(NlogN)解决 --------------------- ...
- Html页面加回滚
<div class="top-box"> <img src=" class="youlink-img" /><br / ...
- WireShark抓包时TCP数据包出现may be caused by ip checksum offload
最近用WireShark抓包时发现TCP数据包有报错:IP Checksum Offload,经过查阅资料终于找到了原因 总结下来就是wireshark抓到的数据包提示Checksum错误,是因为它截 ...
- linux 怎么查找oracle11g的安装目录
一般来说,/etc/oraInst.loc文件里会记录oracle的路径,如[oracle@ruby ~]$ cat /etc/oraInst.loc inventory_loc=/u01/app/o ...
- java axis web service
编写 java调用web service的客户端比较简单,其中webservice为上一篇gsoap创建的server. package clientTest; import java.rmi.Rem ...
- Consuming Hidden WCF RIA Services
原文 http://codeseekah.com/2013/07/05/consuming-hidden-wcf-ria-services/ A Silverlight application mad ...
- HDU 5877 Weak Pair(树状数组)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5877 [题目大意] 给出一棵带权有根树,询问有几对存在祖先关系的点对满足权值相乘小于等于k. [题 ...
- 【转载】Android开源:数据库ORM框架GreenDao学习心得及使用总结
转载链接:http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁 ...