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

 1 package com.gh.domain;
 2
 3 public class Person {
 4     private int id;
 5     private String name;
 6     private int age;
 7     private String desc;
 8     public int getId() {
 9         return id;
10     }
11     public void setId(int id) {
12         this.id = id;
13     }
14     public String getName() {
15         return name;
16     }
17     public void setName(String name) {
18         this.name = name;
19     }
20     public int getAge() {
21         return age;
22     }
23     public void setAge(int age) {
24         this.age = age;
25     }
26     public String getDesc() {
27         return desc;
28     }
29     public void setDesc(String desc) {
30         this.desc = desc;
31     }
32     public Person(String name, int age, String desc) {
33         super();
34         this.name = name;
35         this.age = age;
36         this.desc = desc;
37     }
38     public Person() {
39         super();
40     }
41     //本来id在数据库里想弄成自动增长不用传的结果oracle里比mysql麻烦些就传了id
42     public Person(int id, String name, int age, String desc) {
43         super();
44         this.id = id;
45         this.name = name;
46         this.age = age;
47         this.desc = desc;
48     }
49     @Override
50     public String toString() {
51         return "Person [id=" + id + ", name=" + name + ", age=" + age
52                 + ", desc=" + desc + "]";
53     }
54 }

然后写Person的Dao接口

 1 package com.gh.Dao;
 2
 3 import java.sql.SQLException;
 4 import java.util.List;
 5
 6 import com.gh.domain.Person;
 7 /**
 8  * Person类的DAO接口
 9  * @author ganhang
10  *
11  */
12 public interface PersonDao{
13     //添加
14     public void add(Person p) throws SQLException;
15     //更新
16     public void update(Person p)throws SQLException;
17     //删除
18     public void delete(int id)throws SQLException;
19     //通过id查person
20     public Person findById(int id)throws SQLException;
21     //查找所以Person
22     public List<Person> findAll()throws SQLException;
23
24 }

然后Dao接口的实现类

 1 package com.gh.Dao.impl;
 2
 3 import java.sql.Connection;
 4 import java.sql.PreparedStatement;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7 import java.util.ArrayList;
 8 import java.util.Arrays;
 9 import java.util.List;
10
11 import javax.sound.sampled.Line;
12
13 import com.gh.Dao.PersonDao;
14 import com.gh.db.JdbcUtil;
15 import com.gh.domain.Person;
16
17 /**
18  * PersonDao接口的实现
19  *
20  * @author ganhang
21  *
22  */
23 public class PersonDaoImpl implements PersonDao {
24     //添加
25     @Override
26     public void add(Person p) throws SQLException {
27         // oracle 没有主键自动增长 必须用序列和触发器,这边就直接传id了。
28         String sql = "insert into Person(id,name,age,description) values(?,?,?,?)";
29         //这里做了优化,写个模版类处理所以更删改操作
30         JdbcTemplete.Update(sql, p.getId(), p.getName(), p.getAge(),
31                 p.getDesc());
32     }
33     //更新
34     @Override
35     public void update(Person p) throws SQLException {
36         String sql = "update Person set name=?,age=?,description=? where id=?";
37         JdbcTemplete.Update(sql, p.getName(), p.getAge(), p.getDesc(),
38                 p.getId());
39     }
40     //删除
41     @Override
42     public void delete(int id) throws SQLException {
43         String sql = "delete Person where id=?";
44         JdbcTemplete.Update(sql, id);
45
46     }
47     //通过id查询
48     @Override
49     public Person findById(int id) throws SQLException {
50         String sql = "select * from Person where id=?";
51         //由于JdbcTemplete封装了查询方法,每个处理结果的方法不同这里用了策略模式
52         return (Person) JdbcTemplete.Query(sql, new ResultSetHandler() {
53             @Override
54             public Object doHandler(ResultSet rs) throws SQLException {
55                 Person p = null;
56                 // 这里只查询一个person
57                 if (rs.next()) {
58                     p = new Person();
59                     p.setId(rs.getInt(1));
60                     p.setName(rs.getString(2));
61                     p.setAge(rs.getInt(3));
62                     p.setDesc(rs.getString(4));
63                 }
64                 return p;
65             }
66         }, id);
67     }
68     //查询所有
69     @SuppressWarnings("unchecked")
70     @Override
71     public List<Person> findAll() throws SQLException {
72         String sql = "select * from Person";
73         return (List<Person>) JdbcTemplete.Query(sql, new ResultSetHandler() {
74             @Override
75             public Object doHandler(ResultSet rs) throws SQLException {
76                 List<Person> Persons = new ArrayList<Person>();
77                 Person p = null;
78                 while (rs.next()) {
79                     p = new Person();
80                     p.setId(rs.getInt(1));
81                     p.setName(rs.getString(2));
82                     p.setAge(rs.getInt(3));
83                     p.setDesc(rs.getString(4));
84                     Persons.add(p);
85                 }
86                 return Persons;
87             }
88         });
89     }
90
91 }
JdbcTemplete的实现
 1 package com.gh.Dao.impl;
 2
 3 import java.sql.Connection;
 4 import java.sql.PreparedStatement;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7
 8 import com.gh.db.JdbcUtil;
 9 /**
10  * PersonDaoImpl类的模板类
11  * @author ganhang
12  *
13  */
14 public class JdbcTemplete {
15     /**
16      * 更新方法(包括更、删、改)
17      * @param sql sql语句
18      * @param args 占位符参数
19      */
20     public static void Update(String sql, Object... args)throws SQLException {
21         Connection conn = JdbcUtil.getConnection();
22         try {
23             //设置占位符的参数
24             PreparedStatement ps = conn.prepareStatement(sql);
25             if (args != null) {
26                 for (int i = 0; i < args.length; i++) {
27                     ps.setObject(i + 1, args[i]);
28                 }
29             }
30             ps.executeUpdate();
31         } catch (SQLException e) {
32             e.printStackTrace();
33         }
34     }
35     /**
36      * 查询方法
37      * @param sql sql语句
38      * @param handler 结果集的处理的接口
39      * @param args
40      * @return
41      */
42     public static Object Query(String sql,ResultSetHandler handler,Object...args)throws SQLException{
43         Connection conn=JdbcUtil.getConnection();
44         PreparedStatement ps=null;
45         ResultSet rs=null;
46         try {
47             ps = conn.prepareStatement(sql);
48             if(args!=null){
49                 for(int i=0;i<args.length;i++){
50                     ps.setObject(i+1, args[i]);
51                 }
52             }
53             rs=ps.executeQuery();
54             return handler.doHandler(rs);
55         } catch (SQLException e) {
56             e.printStackTrace();
57         }
58         return rs;
59     }
60 }
ResultSetHandler的实现
 1 package com.gh.Dao.impl;
 2
 3 import java.sql.ResultSet;
 4 import java.sql.SQLException;
 5 /**
 6  * 结果集处理接口
 7  * @author ganhang
 8  *
 9  */
10 public interface ResultSetHandler {
11     public Object doHandler(ResultSet rs)throws SQLException;
12 }

这样对于Person表的增删改查就实现了。

时间: 2024-10-07 05:51:16

Java学习之DAO设计模式的相关文章

java中的DAO设计模式

创建数据库和表 sql语句: DROP TABLE IF EXISTS product; CREATE TABLE product( product_id varchar(20) NOT NULL, product_name varchar(50) DEFAULT NULL, price decimal(6,2) DEFAULT NULL, info varchar(100) DEFAULT NULL, PRIMARY KEY(product_id) )ENGINE=InnoDB DEFAULT

JAVA学习笔记--策略设计模式与适配器模式

一.策略设计模式 创建一个能够根据所传递对象的不同而具有不同行为的方法被称为策略设计模式:这类方法包含所要执行的算法中固定不变的部分,而"策略"包含变化的部分.策略就是传递进去的参数对象,它包含要执行的代码. 这种设计模式将算法分别独立封装起来,然后将其当做参数传递给方法从而让方法产生不同的行为,不同的算法可以进行替换(就像给方法不同的实参).我们可以知道,在策略设计模式中有三个部分:策略.策略引用.接收策略引用的方法(这是笔者自己根据理解给出的名词,并没有查询有没有这些术语).下面通

JavaWeb学习笔记——DAO设计模式

Java学习之模板方法设计模式

(1) 模版方法定义: 在定义功能时,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分, 那么这时就将不确定的部分暴露出去.由该类的子类去完成. (2) 示例代码: 1 //获取某方法的执行时间 2 abstract class GetTime 3 { 4 public final void getTime() 5 { 6 long start = System.currentTimeMillis(); 7 8 runcode(); 9 10 long end = Sy

MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4059514.html 联系方式:[email protected] [正文] 一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据库资源中间. DAO模式实际上是两个模式的组合,即Data Accessor (数据

2016最新Java学习计划

一.Java学习路线图 二.Java学习路线图--视频篇 六大阶段 学完后目标 知识点 配套免费资源(视频+笔 记+源码+模板) 密码        第一阶段 Java基础 入门 学习周期: 35天 学完后目标: 1.可进行小型应用程序开发 2.对数据库进行基本的增删改查管理 市场价值:¥5000 计算机基础知识 计算机基础.DOS常用命令.Java概述.JDK环境安装配置.环境变量配置.Java程序入门 1.2015年Java基础视频-深入浅出精华版(强烈推荐) 2.历经5年锤炼(适合初学者入

Java学习笔记4

1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Runtime Environment,Java运行环境),运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库. ③.JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.

5本最佳的 Java 面向对象理论和设计模式的书籍

对于Java程序员来说,掌握面向对象的设计理论和一些设计模式是必备技能.不学理论就开始编程,就类似于学习一种语言而不学习字母表.市面上有很多有关面向对象理论的.设计模式的和最佳实践的,但只有很少的书真正值得我们阅读.这里涉及两件事情,一个是面向对象理论,一个是设计模式.前者是基础,后者是在基于基础的最佳实践.我们应该先学习面向对象理论,再学习设计模式,来看看这些理论是如何帮助我们解决日常碰到的问题的.推荐以下的五本书,能够帮助大家学习面向对象理论和设计模式.这些书从浅到深.J2EE的设计模式和核

Java 学习路线建议

在大家看之前,我要先声明两点.1.由于我本人是Java后端开发出身,因此所推荐的学习内容是Java Web和Java后端开发的路线,非Java Web和Java后端开发的同学请适当参考其学习思想即可,切勿照搬.2.下面对于[第一部分]的推荐内容,目的是让你尽快成为一个可以参加工作的Java开发者,更适用于处于待业状态,准备转行Java的同学. 如果你是在校学生,务必要在学好基础(比如计算机系统.算法.编译原理等等)的前提下,再考虑去进行下面的学习.第一部分:对于尚未做过Java工作的同学,包括一