zoukankan      html  css  js  c++  java
  • 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表的增删改查就实现了。

  • 相关阅读:
    HTTP断点续传 规格严格
    Java Shutdown 规格严格
    linux 命令源码 规格严格
    JTable调整列宽 规格严格
    linux 多CPU 规格严格
    Hello can not find git path 规格严格
    Kill 规格严格
    拜拜牛人 规格严格
    Swing 规格严格
    Debugging hangs in JVM (on AIX but methodology applicable to other platforms) 规格严格
  • 原文地址:https://www.cnblogs.com/ganhang-acm/p/5202519.html
Copyright © 2011-2022 走看看