DAO 四个包的建立

Wesley13
• 阅读 634

一、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);

    }

}

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这