DAO 四个包的建立

一、DAO 四个包的建立,降低代码之间的耦合性?

  之前写代码,都是在一个包下。代码耦合性较高,不利于后期的维护。

   dao(代码分层?)
有利于后期的维护代码,修改方便。
com.aaa.dao 存放dao相关的类型 处理 数据库的链接 存取数据。
com.aaa.servlet 存放servlet相关的类 处理 和浏览器交互的类
com.aaa.entity 存放实体类 eg Student 接受数据库对象模型
com.aaa.util 存放工具类 eg DBUtil

二、  通过servlet调用dao 演示代码分层的好处
package com.aaa.entity;
/*
   1. 首先要新建数据库
      数据库要有数据  student (id name age)

    2.创建 数据库表对应的 实体类?-----放在SRC下的com.aaa.entity包中!
        实体类作用: 存储数据库表中的数据。
        需要将数据库表中的数据 提取到java中时 , 用对象来存储。

    3.entity?    建立数据库对象模型。
        
    4.在entity包下 新建student实体类 ?  student实体类的作用是 用来存储数据库中的数据
         
 */
public class Student {
    //1.成员变量  属性? 对应数据库的列名
    private int id;
    private  String name;
    private  int age;
    /*
    2.创建构造函数?    一个空参数  一个有参数  为啥?
    构造函数的作用就是创建对象时完成初始化,当我们在new一个对象并传入参数的时候,会自动调用构造函数并完成参数的初始化。
    当定义一个类的时候,通常情况下都会默认一个构造函数,此默认构造函数是不带参数的。
    当自定义了含参构造函数时,默认构造函数将需要手动书写出来。
    */

    public Student() {
    }
    //
    public Student(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }
//get set方法   Alt+insert  自动生成 按住Ctrl键 鼠标勾选就可以选中要生成的方法!
//目的  通过set  get方法 获取私有的成员变量。
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
//生成tostring方法  转字符串。
    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

com.aaa.entity 实体类完成。建立com.aaa.dao包,定义学生类的接口。

package com.aaa.dao;

import com.aaa.entity.Student;

/*


* 一、学生表的DAO
* 在这里 我们写的是一个接口 定义学生类的接口  写在dao包下
* 到包 由 接口   和  实现类组成!
*
* 二、implement功能如下
* 1.添加学生
* 2.根据ID删除学生
* 3.根据ID修改学生
* 注意  接口中都是抽象的方法  !
*
* 三、implement的命名规则?
* IStudent   ----------------------- 首字母大写!
* * */
public interface IStudentDAO {
   /*1.添加学生 insert into student (name,age) value(?,?);
     2.两个以上的参数  就用对象传参
     3.学生对象  存放着需要添加的学生信息
     4.Boolean 成功就返回true  失败 就 false
    */
    boolean add(Student s);

    //2.根据ID删除学生 delete from student where ID= ?
    boolean delete(int id);
    //3.根据ID添加学生
    boolean update(Student s);

}

接口定义完成,需要建立实现类来实现接口中的功能。在com.aaa.dao包下,新建包impl。

package com.aaa.dao.impl;

import com.aaa.dao.IStudentDAO;
import com.aaa.entity.Student;
import com.aaa.util.DBUtil;

/*
    接口的实现类  在dao包下新建 impl包。
    接口 和实现类  组成了 dao 包

 */
public class IStudentDAOImpl implements IStudentDAO {
    @Override
    public boolean add(Student s) {
        String sql ="insert into student(name,age) values(?,?)";
        return DBUtil.executeUpdate(sql,s.getName(),s.getAge());
    }

    @Override
    public boolean delete(int id) {
        String sql="delete from student where id =?";
        return DBUtil.executeUpdate(sql,id);
    }

    @Override
    public boolean update(Student s) {
        String sql="update student set name=?, age=? where id=?";
        return DBUtil.executeUpdate(sql,s.getName(),s.getAge(),s.getId());
    }


}

在包com.aaa.util下封装DBUtil工具类,简化操作。

package com.aaa.util;

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

/*
    新建dbu工具类  简化操作

 */
public class DBUtil {
    static {
        try {
            Class.forName("com.mysql.jdbc.Driver");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public  static Connection getConnection(){
        try {
            return DriverManager.getConnection("jdbc:mysql://localhost:3306/qy66?characterEnconding=UTF-8","root","root");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
    /** 增删改的通用方法
     * @param  String   sql    要执行的sql
     * @param  Object[] obj    对象类型的数组  里面存放着 sql执行的占位符参数
     *              【name,age,id】
     *              【id】
     *              【name,age】
     *
     *              Object... 可变参数 数组没有固定长度,需要几个放几个
     * */
    public static boolean executeUpdate(String sql, Object... args){
        PreparedStatement ps=null;
        try {
            ps=getConnection().prepareStatement(sql);
            //便利获取
            for (int i=0;i<args.length;i++){
                ps.setObject(i+1,args[i]);
                  /*
                  等同于这个
                         ps.setObject(1,s.getName());
                         ps.setObject(2,s.getAge());
                         ps.setObject(3,s.getId());
                         */

            }
            int i=ps.executeUpdate();//正确情况下 会返回1
            if (i>0)return  true;   //判断 这里是Boolean类型的返回值
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return false;
    }
}

可以开始测试我们的代码了,在com.aaa.servlet包下 创建Text类测试。

package com.aaa.servlet;


import com.aaa.dao.IStudentDAO;
import com.aaa.dao.impl.IStudentDAOImpl;
import com.aaa.entity.Student;

public class Text {
    public static void main(String[] args) {
        test01();
    }
    public static void test01(){
        Student s=new Student(5,"周旭辉",18);
        //测试增删改
        IStudentDAO dao=new IStudentDAOImpl();
        //在数据库表中添加数据
    //     dao.add(s);
        //删除数据库  表中的数据
   //     dao.delete(4);

        //修改数据库  表中的数据
       dao.update(s);

    }

}

总结,代码分层。降低了代码的耦合性,优化代码结构,便于后期维护。

posted @ 2019-04-11 21:38  送外卖的小菜鸟  阅读(2164)  评论(0编辑  收藏  举报