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 ...
随机推荐
- ORACLE case when then
Oracle CASE WHEN 用法介绍 1. CASE WHEN 表达式有两种形式 --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ...
- 深度优先搜索——迷宫问题(华为oj)
题目描述: 定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5 × 5数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, ...
- google base库之simplethread
// This is the base SimpleThread. You can derive from it and implement the // virtual Run method, or ...
- java堆溢出的小栗子
package com.xiaoysec.test; import java.util.ArrayList; import java.util.List; /** *VM Args:-verbose: ...
- BZOJ 3774: 最优选择( 最小割 )
最小割...二分染色然后把颜色不同的点的源汇反过来..然后就可以做了. 某个点(x,y): S->Id(x,y)(回报), Id(x,y)->T(代价), Id(i,j)&& ...
- 贴片陶瓷电容的NPO、C0G、X7R、X5R、Y5V、Z5U辨析
NPO与X7R.X5R.Y5V.Z5U神马的有啥区别?主要是介质材料不同.不同介质种类由于它的主要极化类型不一样,其对电场变化的响应速度和极化率亦不一样. 在相同的体积下的容量就不同,随之带来的电容器 ...
- 三种尺寸:手机SIM卡使用指南
毫无疑问目前卖的最火的手机非iPhone 5s莫属,相信仍有不少网友目前处于观望之中,由于iPhone 5s和iPhone 5c采用与iPhone相同的Nano-SIM卡,因此不少新用户在使用之前也徒 ...
- Windows-1252对Latin1编码有改变(并不完全兼容),而且Latin1缺失了好多西欧字符(法语,德语,西班牙语都有)
主要是80到9F的编码被改掉了.从latin1的控制字符,变成了可以输出的可见字符. latin1编码: ISO-8859-1 x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA x ...
- VMware 安装centOS6.4虚拟机以及基础环境搭建
- rsyslogd: error during parsing file /etc/rsyslog.conf, on or before line 55: warnings occured in fil
zjtest7-frontend:/root# rsyslogd -n rsyslogd: error during parsing file /etc/rsyslog.conf, on or bef ...