• 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表的增删改查就实现了。

  • 相关阅读:
    React Native初始化项目后执行react-native run-ios,构建失败
    React Native细节知识点总结<二>
    pod installation failed with react native 0.44
    web项目文件上传
    Type Java compiler level does not match the version of the installed Java project facet.项目内容没错但是项目上报错,不影响运行
    在MyEclipse中改了项目名称,到tomcat的webroot下发现,部署的名称还是原来的。
    jsp页面上读取MySQL数据库datetime时间显示问题
    MySQL日期时间字段
    Date、Calendar、Timestamp的区别与转换
    Java创建Timestamp的几种方式
  • 原文地址:https://www.cnblogs.com/ganhang-acm/p/5202519.html
Copyright © 2020-2023  润新知