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

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

DAO 四个包的建立的更多相关文章

  1. java异常处理:建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,如new Bank(100),

    建立exception包,建立Bank类,类中有变量double  balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount ...

  2. Json和Map互转,四个包(org.json/net.sf.json/com.google.gson/com.alibaba.fastjson)

    目前使用的(org.json/net.sf.json/com.google.gson/com.alibaba.fastjson)这四种json-map互转,其他的以后在补充.............. ...

  3. Java之IO(十四)IO包中其它类

    转载请注明出处:http://www.cnblogs.com/lighten/p/7267553.html 1.前言 此章介绍IO包中剩余未介绍的几个流和工具类,包括LineNumberReader. ...

  4. Linux网络编程学习(四) -----守护进程的建立(第三章)

    本文介绍一个例程daemon_init() #include <sys/types.h> #include <signal.h> #include <unistd.h&g ...

  5. shell学习四十九天----进程建立

    进程 前言:进程指的是运行中程序的一个实例.新进程由fork()与execve()等系统调用所起始,然后运行,知道他们下达exit()系统调用为止. linux系统都支持多进程.尽管计算机看起来像是一 ...

  6. 2.建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,

    public class Bank { Double qian=0.0; double newBank(double a) { qian=qian+a; return qian; } double w ...

  7. 《windows核心编程系列》四谈谈进程的建立和终止

    第二部分:工作机理 第一章:进程 上一章介绍了内核对象,这一节开始就要不断接触各种内核对象了.首先要给大家介绍的是进程内核对象.进程大家都不陌生,它是资源和分配的基本单位,而进程内核对象就是与进程相关 ...

  8. go源码分析(四) net包获取主机ip 子网掩码相关分析

    获取本地的ip时 顺便学习了下标准库net中的实现 在net/interface.go中进行了入口调用,返回值为Addr的slice func InterfaceAddrs() ([]Addr, er ...

  9. TCP的三次握手(建立连接)和四次挥手(关闭连接)

    参照: http://course.ccniit.com/CSTD/Linux/reference/files/018.PDF http://hi.baidu.com/raycomer/item/94 ...

随机推荐

  1. Hdu 3001 Travelling 状态DP

    题目大意 一次旅游,经过所有城市至少一次,并且任何一座城市访问的次数不能超过两次,求最小费用 每个城市最多访问两次,用状态0,1,2标识访问次数 把城市1~N的状态按照次序连接在一起,就组成了一个三进 ...

  2. Django学习之三:django-admin 和 项目manage.py程序

    目录 Django django-admin 和 项目manage.py程序 它俩是什么? 命令程序用法 常用命令 Django django-admin 和 项目manage.py程序 它俩是什么? ...

  3. Python进阶之面向对象编程

    面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...

  4. 用canvas给视频图片添加特效

    Canvas制作视频图片特效 1. Canvas介绍 1.1Canvas是html5上的一个画布标签,功能有点类似java的swing.可以在canvas上画线条 弧线, 文字 就是画布的功能. 具体 ...

  5. android Q build 变化

    一 概述 android Q build变化整体上越来越严格,语法上之前能够使用的Q上将不能使用. 二 主要变化 2.1  'USER' 弃用 ‘USER’后面的值会被设置成‘nobody',andr ...

  6. electron入坑指南

    electron入坑指南 简介 electron 实际集成chrome浏览器和node环境, 运行你写的网页 app 基本目录结构 index.html 名称可以不是index, 这个文件与普通网页的 ...

  7. (四)版本控制管理器之VSS

    在上一篇<(二)版本控制管理器值CVS(下)>的文章中,我为大家介绍了CVS这个版本控制器,接下来我继续跟大家分享介绍下一个版本控制管理器--VSS,为什么要说这个版本控制器呢?早已过时的 ...

  8. ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC 视图引擎(Razor)简介 ASP.NET Core MVC 视图(Razor)ViewData使用示例 ASP.NET Core MV ...

  9. Python爬虫之Requests库的基本使用

    import requests response = requests.get('http://www.baidu.com/') print(type(response)) print(respons ...

  10. SQLServr添加数据列

    数据列定义 表中数据行的数据插入和数据类型都是基于数据列的,学会添加数据列在开发过程中是必不可少的. 使用SSMS数据库管理工具添加数据列 在数据表中添加一列或者多列步骤相同 1.连接数据库,选择数据 ...