课程设计小知识

DAO

DAO是Data Access Object三个首字母的组合,是和数据库打交道的,夹在业务逻辑与数据资源中间。一个标准的DAO模式包含:

(1)VO:数据传输对象,一般和数据库中的一张数据表对应(一个实例相当于数据表中的一条记录,具体看例子比较好理解)

(2)DAO接口:一个接口,声明包含的需要的操作

(3)DAOImpl:DAO接口的具体实现类,只负责实现DAO接口声明的功能,不包括数据库的打开和关闭

(4)DAOProxy:代理,借助DAOImpl实现了DAO接口,但也包括数据库的打开和关闭

(5)DAOFactory:DAO工厂,就是提供dao的地方,只包含public类型的返回dao类型的getInstance()静态方法,该方法提供DAOProxy实例,并返回

(6)DataBaseConnection:负责打开关闭数据库。

例子:比如我们要操作名称为program的数据库中的一张名为reader的表,按照上面的步骤,写出如下代码:

(1)在VO包里写出Reader类:

/*只用写出类中的成员变量(也叫属性),对应数据库中的字段,后面的get,set,已经构造完全自动生成,一个该类实例可以表示一条记录*/
package vo;
public class Reader {
    private int readerid;//读者id号
    private String cardid;//借书证id
    private String readername;//读者姓名
    private String password;//密码
    private String sex;//读者性别
    private String idcard;//身份证
    private String homeaddress;//家庭住址
    private String phone;//电话
    private String jobaddress;//工作单位地址
    private int booksum;//可以借书数量
    private String carddate;//办证日期
    private String abatedate;//失效日期
    private int borrowersum;//以借书数量
    private String xueli;//学历
    private String remark;//备注信息
    public Reader() {
        super();
    }

    public Reader(String cardid, String readername, String password,
            String sex, String idcard, String homeaddress, String phone,
            String jobaddress, int booksum, String carddate, String abatedate,
            int borrowersum, String xueli, String remark) {
        super();
        this.cardid = cardid;
        this.readername = readername;
        this.password = password;
        this.sex = sex;
        this.idcard = idcard;
        this.homeaddress = homeaddress;
        this.phone = phone;
        this.jobaddress = jobaddress;
        this.booksum = booksum;
        this.carddate = carddate;
        this.abatedate = abatedate;
        this.borrowersum = borrowersum;
        this.xueli = xueli;
        this.remark = remark;
    }

    public Reader(int readerid,
            String cardid,
            String readername,
            String password,
            String sex,
            String idcard,
            String homeaddress,
            String phone,
            String jobaddress,
            int booksum,
            String carddate,
            String abatedate,
            int borrowersum,
            String xueli,
            String remark) {
        super();
        this.readerid = readerid;
        this.cardid = cardid;
        this.readername = readername;
        this.password = password;
        this.sex = sex;
        this.idcard = idcard;
        this.homeaddress = homeaddress;
        this.phone = phone;
        this.jobaddress = jobaddress;
        this.booksum = booksum;
        this.carddate = carddate;
        this.abatedate = abatedate;
        this.borrowersum = borrowersum;
        this.xueli = xueli;
        this.remark = remark;
    }

    public int getReaderid() {
        return readerid;
    }
    public void setReaderid(int readerid) {
        this.readerid = readerid;
    }
    public String getCardid() {
        return cardid;
    }
    public void setCardid(String cardid) {
        this.cardid = cardid;
    }
    public String getReadername() {
        return readername;
    }
    public void setReadername(String readername) {
        this.readername = readername;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    public String getIdcard() {
        return idcard;
    }
    public void setIdcard(String idcard) {
        this.idcard = idcard;
    }
    public String getHomeaddress() {
        return homeaddress;
    }
    public void setHomeaddress(String homeaddress) {
        this.homeaddress = homeaddress;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getJobaddress() {
        return jobaddress;
    }
    public void setJobaddress(String jobaddress) {
        this.jobaddress = jobaddress;
    }
    public int getBooksum() {
        return booksum;
    }
    public void setBooksum(int booksum) {
        this.booksum = booksum;
    }
    public String getCarddate() {
        return carddate;
    }
    public void setCarddate(String carddate) {
        this.carddate = carddate;
    }
    public String getAbatedate() {
        return abatedate;
    }
    public void setAbatedate(String abatedate) {
        this.abatedate = abatedate;
    }
    public String getXueli() {
        return xueli;
    }
    public void setXueli(String xueli) {
        this.xueli = xueli;
    }
    public int getBorrowersum() {
        return borrowersum;
    }
    public void setBorrowersum(int borrowersum) {
        this.borrowersum = borrowersum;
    }
    public String getRemark() {
        return remark;
    }
    public void setRemark(String remark) {
        this.remark = remark;
    }

}

(2)在dao包中声明具体要实现的操作

/*声明具体要实现的操作*/
package dao;
import java.util.List;
import vo.Reader;
public interface ReaderDAO {
    /*向reader表中插入一条记录*/
    public int add(Reader reader)throws Exception;
    /*向reader表中删除一条记录*/
    public int delete(int id)throws Exception;
    /*向reader表中修改一条记录*/
    public int update(Reader reader)throws Exception;
    /*向reader表中根据id搜索一条记录*/
    public Reader findByID(int id)throws Exception;
    /*向reader表中查询所有记录*/
    public List<Reader> findAll()throws Exception;
}

(3)在impl包里写出如下实现:

package dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import vo.Reader;
import dao.ReaderDAO;

public class ReaderDAOImpl implements ReaderDAO {

    private Connection con = null;//数据库连接,由外部提供,只负责声明操作的实现
    public ReaderDAOImpl(Connection con) {
        super();
        this.con = con;
    }
    @Override
    public int add(Reader reader) throws Exception {
        // TODO Auto-generated method stub
        int count = 0;
        String sql = "INSERT reader (readerid,cardid,readername,password,sex,idcard,homeaddress,phone,jobaddress,booksum,carddate,abatedate,borrowersum,xueli,remark) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
        PreparedStatement pstmt = null;
        try {
            pstmt = this.con.prepareStatement(sql);
            pstmt.setInt(1, reader.getReaderid());
            pstmt.setString(2, reader.getCardid());
            pstmt.setString(3, reader.getReadername());
            pstmt.setString(4, reader.getPassword());
            pstmt.setString(5, reader.getSex());
            pstmt.setString(6, reader.getIdcard());
            pstmt.setString(7, reader.getHomeaddress());
            pstmt.setString(8, reader.getPhone());
            pstmt.setString(9, reader.getJobaddress());
            pstmt.setInt(10, reader.getBooksum());
            pstmt.setString(11, reader.getCarddate());
            pstmt.setString(12, reader.getAbatedate());
            pstmt.setInt(13,reader.getBorrowersum());
            pstmt.setString(14,reader.getXueli());
            pstmt.setString(15, reader.getRemark());

            count = pstmt.executeUpdate();//执行更新
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            pstmt.close();
        }
        return count;
    }

    @Override
    public int delete(int id) throws Exception {
        // TODO Auto-generated method stub
        int count = 0;
        String sql = "DELETE FROM reader WHERE readerid=?";
        PreparedStatement pstmt = null;
        try {

            pstmt = this.con.prepareStatement(sql);
            pstmt.setInt(1, id);
            count = pstmt.executeUpdate();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            pstmt.close();
        }
        return count;
    }

    @Override
    public int update(Reader reader) throws Exception {
        // TODO Auto-generated method stub
        int count = 0;
        String sql = "UPDATE reader SET cardid=?,readername=?,password=?,sex=?,idcard=?,homeaddress=?,phone=?,jobaddress=?,booksum=?,carddate=?,abatedate=?,borrowersum=?,xueli=?,remark=? WHERE readerid=?";
        PreparedStatement pstmt = null;
        try {
            pstmt = this.con.prepareStatement(sql);
            pstmt.setString(1, reader.getCardid());
            pstmt.setString(2, reader.getReadername());
            pstmt.setString(3, reader.getPassword());
            pstmt.setString(4, reader.getSex());
            pstmt.setString(5, reader.getIdcard());
            pstmt.setString(6, reader.getHomeaddress());
            pstmt.setString(7, reader.getPhone());
            pstmt.setString(8, reader.getJobaddress());
            pstmt.setInt(9, reader.getBooksum());
            pstmt.setString(10, reader.getCarddate());
            pstmt.setString(11, reader.getAbatedate());
            pstmt.setInt(12, reader.getBorrowersum());
            pstmt.setString(13,reader.getXueli());
            pstmt.setString(14,reader.getRemark());
            pstmt.setInt(15, reader.getReaderid());
            count = pstmt.executeUpdate();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            pstmt.close();
        }
        return count;
    }

    @Override
    public Reader findByID(int id) throws Exception {
        // TODO Auto-generated method stub
        Reader reader = null;
        String sql = "SELECT * FROM reader WHERE readerid=?";
        PreparedStatement pstmt = null;
        try {
            pstmt = this.con.prepareStatement(sql);
            pstmt.setInt(1, id);
            ResultSet set = pstmt.executeQuery();
            //System.out.println(set);
            if(set.next()){
                reader = new Reader();
                reader.setReaderid(id);
                reader.setCardid(set.getString(2));
                reader.setReadername(set.getString(3));
                reader.setPassword(set.getString(4));
                reader.setSex(set.getString(5));
                reader.setIdcard(set.getString(6));
                reader.setHomeaddress(set.getString(7));
                reader.setPhone(set.getString(8));
                reader.setJobaddress(set.getString(9));
                reader.setBooksum(set.getInt(10));
                reader.setCarddate(set.getString(11));
                reader.setAbatedate(set.getString(12));
                reader.setBorrowersum(set.getInt(13));
                reader.setXueli(set.getString(14));
                reader.setRemark(set.getString(15));
                set.close();
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            pstmt.close();
        }
        return reader;
    }

    @Override
    public List<Reader> findAll() throws Exception {
        // TODO Auto-generated method stub
        List<Reader> readers = null;
        Reader reader = null;
        String sql = "SELECT * FROM reader";
        PreparedStatement pstmt = null;
        try {
            pstmt = this.con.prepareStatement(sql);
            ResultSet set = pstmt.executeQuery();
            if(set!=null){
                readers = new ArrayList<Reader>();
                while(set.next()){
                    reader = new Reader();
                    reader.setReaderid(set.getInt(1));
                    reader.setCardid(set.getString(2));
                    reader.setReadername(set.getString(3));
                    reader.setPassword(set.getString(4));
                    reader.setSex(set.getString(5));
                    reader.setIdcard(set.getString(6));
                    reader.setHomeaddress(set.getString(7));
                    reader.setPhone(set.getString(8));
                    reader.setJobaddress(set.getString(9));
                    reader.setBooksum(set.getInt(10));
                    reader.setCarddate(set.getString(11));
                    reader.setAbatedate(set.getString(12));
                    reader.setBorrowersum(set.getInt(13));
                    reader.setXueli(set.getString(14));
                    reader.setRemark(set.getString(15));
                    readers.add(reader);
                }
                set.close();
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            pstmt.close();
        }
        return readers;
    }

}

(4)proxy包中写出dao的代理

package dao.proxy;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

import vo.Reader;
import dao.ReaderDAO;
import dao.impl.ReaderDAOImpl;
import dbc.DataBaseConnection;

public class ReaderDAOProxy implements ReaderDAO {

    private DataBaseConnection dbc = null;//数据库连接
    private Connection con = this.dbc.getConnection();
    private ReaderDAO dao = null;

    public ReaderDAOProxy(){
        super();
        dbc = new DataBaseConnection();
        con = dbc.getConnection();
        dao = new ReaderDAOImpl(con);
    }
    @Override
    public int add(Reader reader) throws Exception {
        // TODO Auto-generated method stub
        int count = 0;
        if(dao.findByID(reader.getReaderid())==null){
            count = dao.add(reader);
        }
        return count;
    }
    @Override
    public int delete(int id) throws Exception {
        // TODO Auto-generated method stub
        return dao.delete(id);
    }

    @Override
    public int update(Reader reader) throws Exception {
        // TODO Auto-generated method stub
        return dao.update(reader);
    }

    @Override
    public Reader findByID(int id) throws Exception {
        // TODO Auto-generated method stub
        return dao.findByID(id);
    }

    @Override
    public List<Reader> findAll() throws Exception {
        // TODO Auto-generated method stub
        return dao.findAll();
    }
    public void close(){
        try {
            if(con != null)
                con.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

(5)在factory包中写出工厂类

package dao.factory;
import dao.ReaderDAO;
import dao.proxy.ReaderDAOProxy;
public class DAOFactory {
    /*得到reader表的操作实例*/
    public static ReaderDAO getReaderDAOInstance(){
        return new ReaderDAOProxy();
    }
}

(6)数据库的链接

package dbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/* 连接book数据库
 * 对外提供打开连接,和关闭连接操作
 * */
public class DataBaseConnection {
    private static final String DRIVER = "com.mysql.jdbc.Driver";//数据库驱动
    private static final String URL = "jdbc:mysql://localhost/program";//URL
    private static final String USER = "root";//数据库用户名
    private static final String PASSWORD = "root";//数据库密码
    private Connection con = null;//数据库连接引用声明
    /*构造函数,完成数据库连接的生成*/
    public DataBaseConnection() {
        try {
            //注册驱动
            Class.forName(DRIVER);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            System.err.println("注册驱动失败!");
        }
        try {
            //实例化连接
            con = DriverManager.getConnection(URL,USER,PASSWORD);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            System.err.println("实例化连接失败!");
        }
    }
    /*得到数据库连接*/
    public Connection getConnection(){
        return this.con;
    }
    /*关闭数据库连接*/
    public void close(){
        if(this.con!=null){
            try {
                this.con.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

看一下具体的结构:

时间: 2024-10-10 10:56:12

课程设计小知识的相关文章

数据仓库设计小知识之一个属性的维度设计

我们通常在数据仓库的设计中碰到这种问题:在维度设计中如果这个维度只有一个属性,那我们面临的选择是为这个属性单独创建一个维度,还是将这个维度的属性直接放在事实表中作为事实表的一部分? 假设这里有一个维度,通常在设计上至少会有两列(DimKey 和 DimAttribute 属性),事实表通过 DimKey 关联到这个维度.首先,在查询阶段多表的 JOIN 关系比较单表的查询在效率上肯定要低一些,我们来看下下面的这个例子: CREATE DIM_TABLE ( DIM_KEY INT PRIMARY

HTML页面设计小知识

http://v2.bootcss.com/javascript.html#tabs标签页设置 http://v2.bootcss.com/components.html#breadcrumbs标签页式导航 http://jingyan.baidu.com/article/066074d6564f39c3c21cb014.html=====CSS省略号text-overflow超出溢出显示省略号===== .can .content .span2 ul li a{ display: block;

【软件工程】02组软件工程组队项目——课程管理小助手数据库设计文档

一.引言 1.1编写目的 数据库的表结构设计是整个项目开发中一个非常重要的环节,一个良好的数据库设计,可以提高开发效率,方便系统维护,并且为以后项目功能的扩展留下余地.我们通过书写这份文档说明,从各方面进行学生课程管理小助手系统的数据库设计规划,用它指导该系统在数据库各方面的内容,为系统开发的程序员.系统分析员提供基准文档.我们也希望通过写数据设计说明书,规范数据名称.数据范围.数据代码等.这份文档是项目小组共同作战的基础,有了开发规范.程序模块之间和项目成员之间的接口规则.数据方式,大家就有了

Java课程设计—学生成绩分析系统

Java课程设计 - 我的选题是学生成绩分析系统. 下面是课程的需求图: 完成的这个小系统其实逻辑代码是非常简单的,唯一感觉有难点的地方在于涉及到了知识点比较多.当时只是匆匆地大概学了Java的一些基本知识,书上的例题和代码也没怎么敲过, 几乎都是在边做的过程中边学具体需要用到的东西: 其中感觉最麻烦的地方就是JTable.文件读取IO流以及绘图和给各个组件布局的时候. 另外还花了些功夫在UI上面:我这次是用到了substance.jar的swing美化包,想了解的可以百度下,网上有很多教程.

计算机组成原理 课程设计报告

        计算机组成原理 课程设计报告      成员:许恺   2014011329          胡强勇  2014011315     时间:2016.12.20                 一.简要总结计算机组成原理实验 计算机组成原理实验总共五个实验,首先我们熟悉了教学机的使用方法,后面的实验我们分为运算器.存储器.控制器,控制器分为两次实验.紧接的第二次实验我们就进行了运算器的实验,对运算器的内部构造极其原理进行了验证理解,在这里我们学习了运算器ALU的8种运算功能,以

JavaWeb网上商城课程设计的反思

不知道从什么时候起,我爱上了写博客,对之前学得的只是进行反思.写了几天课程设计,代码量量8.9千左右. 然后下面文字是我在博客上复制过来的,说得很详细 MVC(Model View Controller)设计模式在JavaFX中有着比Swing更好的表现方式.它使得程序界面设计和程序逻辑设计完全分开,便于代码的可读性和以后的可维护性. JavaEE体系架构采用传统的MVC设计模式,分为Model.View.Controller三层,其中:Model即模型层,定义数据模型和业务逻辑.为了将数据访问

2109春第一次课程设计实验报告

2019春第一次课程设计实验报告 一.实验项目名称: 飞机游戏的编写 二.实验项目功能描述: 这个实验主要是实现游戏的正常运行,实现控制飞机的移动功能,增加其实用度, 同时还实现发射子弹和出现敌机的操作,通过发射子弹,击败静止的或者移动的 敌机,最终实现通关或者死亡: 三.项目模块结构介绍: 第一步:代码重构,实现控制飞机移动的功能. 第二步:新式子弹,初始化子弹在飞机的正上方,子弹发射后自动向上移动: 第三步:静止的敌机,增加静止的敌机: 第四步:敌机移动,让敌机自动向下移动: 第五步:击中敌

校园宿舍管理系统课程设计报告

课程设计报告 学    号   201610411418  /  2016104114122 姓    名   吴帝勇 /谢志良 班    级   16计科4班 题    目   校园宿舍管理系统 授课老师    袁飞 目录 第一章系统概述..............................................................................................................................1 1.

南京邮电大学课程设计——加速度检测应用

2周的课程设计花了3天(其实真相是花了2个小时就写好了,只是老师一会让我改这一会让我改那而已)..这个时间可能有点长了,况且读者们看以下的的题目或许就要开始嘲笑我了,"这么简单的一个东西居然还要用那么久"...哈哈,不喜勿吐槽.... 题目3.压力监测应用 (1) 检测压力是否超过阈值 (2) 若超过压力阈值,则通过一条短信通知联系人,短信内容需包含当前压力. (3) 可设置联系人名称和联系手机号码 (4) 可设置压力阈值 (5) 记录告警信息到数据库,方便查询 以下开始直接贴代码: