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 ...
随机推荐
- 一个人的旅行(用小技巧转化为dijkstra算法)
注意: 1:因为两点之间可能有多条路,所以更新路径长度的时候做一次判断 if(time < mat[a][b]) mat[a][b] = mat[b][a] = time; 2:因为主函数中的数 ...
- TCP/IP的网际层协议——ARP
MAC地址对于每一台设备是全球唯一的,该地址被烧录在网卡的硬件电路上.MAC地址由12位十六进制数表示,其中前6位标识网卡的制造厂商,后6位是网卡的序列号.在以太网中,一个主机要和另一个主机进行通信, ...
- R与数据分析旧笔记(十)非线性模型
非线性模型 非线性模型 例子:销售额x与流通费率y > x=c(1.5,2.8,4.5,7.5,10.5,13.5,15.1,16.5,19.5,22.5,24.5,26.5)> y=c( ...
- hdu 4902 Nice boat 线段树
题目链接 给n个数, 两种操作, 第一种是将区间内的数变成x, 第二种是将区间内大于x的数变为gcd(x, a[i]). 开三个数组, 一个记录区间最大值, 这样可以判断是否更新这一区间, 一个laz ...
- java核心技术学习笔记之三程序设计结构
一 基本数据结构 必须包括在类中 必须具备 public static main方法 大小写敏感 二.数据类型 四种整数类型: Int 4字节 short 2字节 long8字节 byte1字节 二种 ...
- 基于KVM建立虚拟机的步骤及总结说明
1.前言 目前正在涉足云计算IaaS工作,虚拟化是IaaS的重要部分,因此这段时间对各个虚拟机化技术和工具进行研究,研究的目的不仅仅是为了会使用这个工具,而是通过研究了解技术的实现机制和原理,即知其然 ...
- 工具类_java 数字转化为汉字大写
public class Num2Rmb { private String[] hanArr = { "零", "壹", "贰", &quo ...
- C语言数据结构----栈与递归
本节主要说程序中的栈函数栈的关系以及栈和递归算法的关系. 一.函数调用时的栈 1.程序调用时的栈是也就是平时所说的函数栈是数据结构的一种应用,函数调用栈一般是从搞地质向低地址增长的,栈顶为内存的低地址 ...
- Thread和ExecutorService(一)
ExecutorService是Java并发包里面的一个线程池服务 线程池的优点 复用已有的线程,消除任务中创建线程的开销 通过优化线程的数量,提高性能,保证处理器一直处于忙的状态,而不必创建这么 ...
- [LeetCode] Best Time to Buy and Sell Stock Solution
Say you have an array for which the ith element is the price of a given stock on day i. If you were ...