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 ...
随机推荐
- js文件中调用另一个js文件:
document.write("<script language='javascript' src='/UEditor/uparse.js'></script") ...
- FTP创建与操作
1,FTP服务创建于配置http://jingyan.baidu.com/article/0a52e3f4230067bf63ed7268.html, 2,FTP操作类 using System; u ...
- BZOJ 3439: Kpm的MC密码( trie + DFS序 + 主席树 )
把串倒过来插进trie上, 那么一个串的kpm串就是在以这个串最后一个为根的子树, 子树k大值的经典问题用dfs序+可持久化线段树就可以O(NlogN)解决 --------------------- ...
- 列求key出现的频率
1 cat mc.log | grep LOGIN_GET | awk '{print $9}' | sort | uniq -c
- Hive和Jdbc示例
重要:在使用 JDBC 开发 Hive 程序时, 必须首先开启 Hive 的远程服务接口.使用下面命令进行开启:hive -service hiveserver & 1). 测试数据 user ...
- Android 汉字转拼音之工具篇
/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Versi ...
- wampserver 绑定域名(wampserver 本地域名测试配置)
一.tomact 配置虚拟主机 1.打开Apache菜单下“httpd.conf”文件: 找到“# Include conf/extra/httpd-vhosts.conf” , 把这句前面的#号去掉 ...
- 四轴飞行器1.5 各种PID对比分析及选择
原创文章,欢迎转载,转载请注明出处 这篇文章主要介绍我对PID的理解,以及选择PID算法的过程. 一 PID的理解和学习过程 二 飞控的PID效果 先上个飞控PID的响应的视频:介绍在后面 地址:ht ...
- Toolkit 一键激活Office 2010方法及Office 2010 Toolkit工具下载
Office 2010激活的方法很多,但推荐使用本站亲测,可永久使用的两种方法,随便使用哪一种,一个不行就换另外一个.基本上只要Office 2010正常安装了,下面两种方法的任何一种都可以正常激活. ...
- 59 pages的Delphi源码
http://www.codesc.net/source/list_10_59.shtml