文档章节

DAO设计模式之数据层的构造

柳初心
 柳初心
发布于 2017/06/04 21:37
字数 1457
阅读 32
收藏 0
点赞 0
评论 0

DAO设计模式之数据层的构造

1.0 框架图

 

1.1 需求分析

  • 使用雇员数据的添加,但是需要保证被添加的雇员编号不会重复;

  • 实现雇员数据的修改操作

  • 实现多个雇员数据的删除操作

  • 可以查询所有雇员的信息

  • 可以实现数据的分布显示,同时又可以返回所有的雇员数量。

1.2 数据库的连接类 dbc

取得数据库的连接

DataBaseConnection();

getConnection();

close();

 

1.3 开发valueObjectvo

简单java类

  1. 实现java.io.Serializable接口
  2. 与表名称一致
  3. 类中属性不允许基本类型,必须包装类型。
  4. 属性必须封装
  5. 类中可以定义多个构造参数,但必须保留一个无参构造方法。

 

1.4 开发数据层

数据层最终是交给业务层调用的,所以业务层不需要知道如何实现的过程。

两个独立的层之间需要一个标准。

数据层与数据库之间是JDBC

所以业务层与数据层之间也需要相应的标准。

 

1.4.1 开发数据层标准。定义接口IEmpDAO

对于数据层的接口的要求

         数据层既然是进行数据操作的,那么就将其保存在DAO包中。

         不同的数据表的操作有可能使用不同的数据层开发,那么就针对于数据表命名。

         -emp表,那么数据层的接口就应该宝库为IEmpDAO

         对于整个数据层的开发严格来讲就两类功能

         -数据更新:建议以doXxx()的形式命名,例如:doCreate(),doUpdate()

         -数据查询:分为两种形式。

                  -查询表中数据:以findXxx()形式命名,例如:findByld()、findByName(),findAll()

                  -统计表中数据:getAll()


 

public  interface IEmpDAO {

    /*实现数据的增加操作*/

    public boolean doCreate(Emp vo) throws Exception;

    /*实现数据的修改操作,本次修改是根据id进行全部字段数据的修改*/

    public boolean doUpdate(Emp vo) throws Exception;



    /**

     * 执行数据的批量删除操作,所要删除的数据以Set集合的形式保存

     * @param ids 包含了所有要删除的数据ID,不包含有重复的内容。

     * @return 删除成功返回true (删除的数据个数与要删除的数据个数相同),否则返回false.

     * @throws Exception SQL执行异常。

     */

    public boolean doRemoveBatch(Set<Integer> ids) throws  Exception ;



    /**

     * 根据雇佣编号查询指定的雇员信息

     * @param id 要查询的雇员编号

     * @return 如果雇员信息存在,则将数据以VO类对象的形式返回,如果雇员数据不存在,则返回null

     * @throws Exception SQL 执行异常

     */

    public Emp findById(Integer id) throws Exception;



    /**

     * 查询指定数据表的全部记录,并且以集合的形式返回

     * @return 如果表中有数据,则所有 的数据会封装为VO对象而后利用List集合返回,<br>

     *     如果没有数据,那么集合的长度为0(size() == 0,不是null)

     * @throws Exception SQL执行异常

     */

    public List<Emp> findAll() throws Exception;



    /**

     * 分页进行数据的模糊查询,查询结果以集合形式返回

     * @param currentPage 当前所在的页

     * @param lineSize 每有显示数据行数

     * @param collum 要进行模糊查询的关键列

     * @param keyWord 模糊查询的关键字

     * @return 如果表中有数据,则所有的数据会封装为VO对象后利用List集合,<br>

     *     如果没有数据,那么集合的长度为0(size() == 0,不是null)

     * @throws Exception

     */

    public List<Emp> findAllSplit(Integer current Page, Integer line Size, String column, String keyword) throws Exception;



    public Integer getAllCount(String colum,String keyword) throws Exception;

}

 

1.4.2 数据层实现类。EmpDAOImpl

由于在开发中,业务层需要执行多个数据层的调用。数据库的打开与关闭操作应该由业务层控制会比较合理。

所有的数据层实现类要求保存在dao.impl子包下。

范例:EmpDAOImpl

public class EmpDAOImpl implements IEmpDAO {

    private Connection conn; //需要利用Connection对象操作

    private PreparedStatement pstmt;



    /**

     * 如果要想使用数据层进行原子性的功能操作实现,必须要提供有Connection接口对象<br>

     * 另外由于开发之中业务层要调用数据层,所以数据库的打开与关闭交由业务层处理

     *

     * @param conn

     */

    public EmpDAOImpl(Connection conn) {

        this.conn = conn;

    }



    @Override

    public boolean doCreate(Emp vo) throws Exception {

        String sql = "insert into emp(empno,ename,job,hiredate,sal,comm) values(?,?,?,?,?,?)";

        this.pstmt = this.conn.prepareStatement(sql);

        this.pstmt.setInt(1, vo.getEmpno());

        this.pstmt.setString(2, vo.getEname());

        this.pstmt.setString(3, vo.getJob());

        this.pstmt.setDate(4, new java.sql.Date(vo.getHiredate().getTime()));

        this.pstmt.setDouble(5, vo.getSal());

        this.pstmt.setDouble(6, vo.getComm());

        /*判断是否插入成功*/

        return this.pstmt.executeUpdate() > 0;

    }



    @Override

    public boolean doUpdate(Emp vo) throws Exception {

        String sql = "update emp set ename=?,job=?,hiredate=?,sal=?,comm=? where empno=? ";

        this.pstmt = this.conn.prepareStatement(sql);

        this.pstmt.setString(2, vo.getEname());

        this.pstmt.setString(3, vo.getJob());

        this.pstmt.setDate(4, new java.sql.Date(vo.getHiredate().getTime()));

        this.pstmt.setDouble(5, vo.getSal());

        this.pstmt.setDouble(6, vo.getComm());

        this.pstmt.setInt(1, vo.getEmpno());

        /*判断是否插入成功*/

        return this.pstmt.executeUpdate() > 0;

    }



    @Override

    public boolean doRemoveBatch(Set<Integer> ids) throws Exception {

        if (ids == null || ids.size() == 0) {

            return false;

        }

        StringBuffer sql = new StringBuffer();

        sql.append("delete from emp where empno in(");

        Iterator<Integer> iter = ids.iterator();

        while (iter.hasNext()) {

            sql.append(iter.next()).append(",");

        }

        sql.delete(sql.length() - 1, sql.length()).append(")");

        this.pstmt = this.conn.prepareStatement(sql.toString());

        return this.pstmt.executeUpdate() == ids.size();

    }



    @Override

    public Emp findById(Integer id) throws Exception {

        Emp vo = null;

        String sql = "select empno,ename,job,hiredate,sal,comm fom emp where empno = ?";

        this.pstmt = this.conn.prepareStatement(sql);

        this.pstmt.setInt(1, id);

        ResultSet rs = this.pstmt.executeQuery();

        if (rs.next()) {

            vo = new Emp();

            vo.setEmpno(rs.getInt(1));

            vo.setEname(rs.getString(2));

            vo.setJob(rs.getString(3));

            vo.setHiredate(rs.getDate(4));

            vo.setSal(rs.getDouble(5));

            vo.setComm(rs.getDouble(6));

        }

        return vo;

    }



    @Override

    public List<Emp> findAll() throws Exception {

        List<Emp> all = new ArrayList<Emp>();

        String sql = "select empno,ename,job,hiredate,sal,comm fom emp";

        this.pstmt = this.conn.prepareStatement(sql);

        ResultSet rs = this.pstmt.executeQuery();

        while (rs.next()) {

            Emp vo = new Emp();

            vo.setEmpno(rs.getInt(1));

            vo.setEname(rs.getString(2));

            vo.setJob(rs.getString(3));

            vo.setHiredate(rs.getDate(4));

            vo.setSal(rs.getDouble(5));

            vo.setComm(rs.getDouble(6));

            all.add(vo);

        }

        return all;

    }

 

1.4.3  定义数据层工厂类—DAOFactory

业务层想要进行数据层的调用,那么必须要取得IEmpDAO接口对象,但是不同层之间如果要想取得实例,需要使用工厂设计模式。这个工厂类将其保存在factory子包下。


 

public class DAOFactory {

    public static IEmpDAO getIEmpDAOInstance(Connection connection) {

        return new EmpDAOImpl(connection);

    }

}

使用工厂的特征就是不知道外层有什么子类。

© 著作权归作者所有

共有 人打赏支持
柳初心
粉丝 0
博文 31
码字总数 15977
作品 0
南昌
企业开发珠玑-什么时候使用设计模式

一、我们必须明白一点:设计模式仅仅是个称呼,目标是方便交流记忆。中心点是什么?方便交流记忆,仅仅是个词语,和汉语词典里面的一个词也没什么区别。---------没什么高大上的东西,不怕 ...

fir01
2015/08/24
0
0
springMVC 默认单例 那些变量是线程安全的

springMVC负责的controller层的类默认是单例模式的,单例模式少去了重复创建对象,垃圾内存回收的过程,在性能方面有一些提升。 但是,http请求往往是同时多个请求进来的,这样就会开启多个线...

wsadzxcleg
04/22
0
0
python 与设计模式 ——工厂与单例

python 与设计模式 源码地址:[http://git.oschina.net/duoduo3_69/python_design_pattern][1] git checkout v001(这个版本与此篇博客相符) zarkpy里面运用了很多设计模式,以前一直很费解p...

duoduo3_69
2013/11/27
0
0
JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云
05/18
0
0
系统架构技能之设计模式-单件模式

一、开篇 其实我本来不是打算把系统架构中的一些设计模式单独抽出来讲解的,因为很多的好朋友也比较关注这方面的内容,所以我想通过我理解及平时项目中应用到的一 些常见的设计模式,拿出来给...

wbf961127
2017/11/12
0
0
JavaScript常用设计模式

设计模式 设计模式是一种在长时间的经验与错误中总结出来可服用的解决方案。 设计模式主要分为3类: 创建型设计模式:专注于处理对象的创建 Constructor构造器模式,Factory工厂模式,Singl...

a独家记忆
07/13
0
0
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
0
0
设计模式1——Singleton设计模式

Singleton单例模式是最简单的设计模式,它的主要作用是保证在程序运行生命周期中,使用了单例模式的类只能有一个实例对象存在。单例模式实现了类似C语言中全局变量的功能,单例模式常用于注册...

小米米儿小
2013/12/05
0
0
设计模式知识梳理(1) - 结构型 - 适配器模式

一、基本概念 1.1 定义 适配器模式 将 某个类的接口 转换成 客户端期望的另一个接口 来表示,让原本因接口不能一起工作的两个类可以协同工作。 经典的适配器模式 可以分为下面三类: 类 的适...

泽毛
06/24
0
0
设计模式.策略模式

策略模式跟抽象工厂非常相似,基本逻辑是根据需要实例化出需要用的类。不同的是策略模式需要调用者非常清晰的知道有哪些策略,各个策略的调用规则,而抽象工厂的话,需要知道有哪些类,找到调...

技术小胖子
2017/11/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA @MappedSuperclass 注解说明

基于代码复用和模型分离的思想,在项目开发中使用JPA的@MappedSuperclass注解将实体类的多个属性分别封装到不同的非实体类中。 1.@MappedSuperclass注解只能标准在类上:@Target({java.lang....

海博1600
13分钟前
0
0
Scala Configuration 相关API

Play使用了 Typesafe config library,但是也提供了一个有着更多Scala高级特性的的 Configuration 封装。不熟悉Typesafe配置的开发者可以移步 configuration文件的语法和特性文档。 读取配置...

Landas
今天
1
0
使用cookie技术 记住账号

1. 效果 2. 实现过程 2.1 前端 将用户的选中传递给后台 这个参数的获取是 参考:https://my.oschina.net/springMVCAndspring/blog/1860498 // var rememberLogin = $("#rememberLoginId").i...

Lucky_Me
今天
1
0
《趣谈网络协议》02之网络分层的真实含义

一、提出问题 1.提出问题 当你听到什么二层设备、三层设备、四层 LB 和七层 LB 中层的时候,是否有点一头雾水,不知道这些所谓的层,对应的各种协议具体要做什么“工作”? 2.这四个问题你弄...

aibinxiao
今天
2
0
Python3学习日志二 Python中的集合set和字典dict

1.集合set 定义一个集合set 我们可以看到定义集合set有两种不同的形式,如果要定义一个空的集合set不能用{}而是要用set();另外,集合是无序的,而且set中的元素是不可重复的,如果你定义了一...

Mr_bullshit
今天
0
0
adb 操作指令详解

ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。 注:有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。...

孟飞阳
今天
0
0
nodejs安装以及环境配置(很好的node安装和配置文章,少走很多弯路)

一、安装环境 1、本机系统:Windows 10 Pro(64位) 2、Node.js:v6.9.2LTS(64位) 二、安装Node.js步骤 1、下载对应你系统的Node.js版本:https://nodejs.org/en/download/ 2、选安装目录进...

sprouting
今天
1
0
Redisson

了解了Redisson,发现使用挺简单的,接下来准备深入学习一下。 Redisson介绍 Redisson是架设于Redis基础之上的一个Java驻内存数据网格(In-Memory Data Grid) Redisson在基于NIO的Netty框架上...

to_ln
今天
0
0
python有哪些好玩的应用实现,用python爬虫做一个二维码生成器

python爬虫不止可以批量下载数据,还可以有很多有趣的应用,之前也发过很多,比如天气预报实时查询、cmd版的实时翻译、快速浏览论坛热门帖等等,这些都可以算是爬虫的另一个应用方向! 今天给...

python玩家
今天
0
0
python爬虫日志(3)-爬去异步加载网页

在浏览器检查元素页面中,选取Network中的XHR选项即可观察每次加载页面,网页发出的请求,观察url的规律即可利用封装的函数对每一页进行爬取。

茫羽行
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部