mysql四个包的作用_DAO 四个包的建立

本文介绍了如何通过DAO分层架构来降低代码耦合性,提高代码可维护性。在实践中,创建了4个包:`dao`用于存放数据库操作相关类,`servlet`存放与浏览器交互的类,`entity`存放实体类,`util`存放工具类。通过`IStudentDAO`接口及其实现类`IStudentDAOImpl`展示了如何进行增删改查操作,利用`DBUtil`工具类简化数据库操作。最后通过`Text`类进行测试,验证了代码分层的效果。
摘要由CSDN通过智能技术生成

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

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

dao(代码分层?)

有利于后期的维护代码,修改方便。

com.aaa.dao 存放dao相关的类型 处理 数据库的链接 存取数据。

com.aaa.servlet 存放servlet相关的类 处理 和浏览器交互的类

com.aaa.entity 存放实体类 eg Student 接受数据库对象模型

com.aaa.util 存放工具类 eg DBUtil

二、 通过servlet调用dao 演示代码分层的好处

packagecom.aaa.entity;/*1. 首先要新建数据库

数据库要有数据 student (id name age)

2.创建 数据库表对应的 实体类?-----放在SRC下的com.aaa.entity包中!

实体类作用: 存储数据库表中的数据。

需要将数据库表中的数据 提取到java中时 , 用对象来存储。

3.entity? 建立数据库对象模型。

4.在entity包下 新建student实体类 ? student实体类的作用是 用来存储数据库中的数据*/

public classStudent {//1.成员变量 属性? 对应数据库的列名

private intid;privateString name;private intage;/*2.创建构造函数? 一个空参数 一个有参数 为啥?

构造函数的作用就是创建对象时完成初始化,当我们在new一个对象并传入参数的时候,会自动调用构造函数并完成参数的初始化。

当定义一个类的时候,通常情况下都会默认一个构造函数,此默认构造函数是不带参数的。

当自定义了含参构造函数时,默认构造函数将需要手动书写出来。*/

publicStudent() {

}// public Student(int id, String name, intage) {this.id =id;this.name =name;this.age =age;

}//get set方法 Alt+insert 自动生成 按住Ctrl键 鼠标勾选就可以选中要生成的方法!//目的 通过set get方法 获取私有的成员变量。

public intgetId() {returnid;

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

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}//生成tostring方法 转字符串。

@OverridepublicString toString() {return "Student{" +

"id=" + id +

", name='" + name + '\'' +

", age=" + age +

'}';

}

}

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

packagecom.aaa.dao;importcom.aaa.entity.Student;/** 一、学生表的DAO

* 在这里 我们写的是一个接口 定义学生类的接口 写在dao包下

* 到包 由 接口 和 实现类组成!

*

* 二、implement功能如下

* 1.添加学生

* 2.根据ID删除学生

* 3.根据ID修改学生

* 注意 接口中都是抽象的方法 !

*

* 三、implement的命名规则?

* IStudent ----------------------- 首字母大写!

* **/

public interfaceIStudentDAO {/*1.添加学生 insert into student (name,age) value(?,?);

2.两个以上的参数 就用对象传参

3.学生对象 存放着需要添加的学生信息

4.Boolean 成功就返回true 失败 就 false*/

booleanadd(Student s);//2.根据ID删除学生 delete from student where ID= ?

boolean delete(intid);//3.根据ID添加学生

booleanupdate(Student s);

}

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

packagecom.aaa.dao.impl;importcom.aaa.dao.IStudentDAO;importcom.aaa.entity.Student;importcom.aaa.util.DBUtil;/*接口的实现类 在dao包下新建 impl包。

接口 和实现类 组成了 dao 包*/

public class IStudentDAOImpl implementsIStudentDAO {

@Overridepublic booleanadd(Student s) {

String sql="insert into student(name,age) values(?,?)";returnDBUtil.executeUpdate(sql,s.getName(),s.getAge());

}

@Overridepublic boolean delete(intid) {

String sql="delete from student where id =?";returnDBUtil.executeUpdate(sql,id);

}

@Overridepublic booleanupdate(Student s) {

String sql="update student set name=?, age=? where id=?";returnDBUtil.executeUpdate(sql,s.getName(),s.getAge(),s.getId());

}

}

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

packagecom.aaa.util;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.SQLException;/*新建dbu工具类 简化操作*/

public classDBUtil {static{try{

Class.forName("com.mysql.jdbc.Driver");

}catch(Exception e) {

e.printStackTrace();

}

}public staticConnection getConnection(){try{return DriverManager.getConnection("jdbc:mysql://localhost:3306/qy66?characterEnconding=UTF-8","root","root");

}catch(SQLException e) {

e.printStackTrace();

}return null;

}/**增删改的通用方法

*@paramString sql 要执行的sql

*@paramObject[] obj 对象类型的数组 里面存放着 sql执行的占位符参数

* 【name,age,id】

* 【id】

* 【name,age】

*

* Object... 可变参数 数组没有固定长度,需要几个放几个

**/

public static booleanexecuteUpdate(String sql, Object... args){

PreparedStatement ps=null;try{

ps=getConnection().prepareStatement(sql);//便利获取

for (int i=0;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类测试。

packagecom.aaa.servlet;importcom.aaa.dao.IStudentDAO;importcom.aaa.dao.impl.IStudentDAOImpl;importcom.aaa.entity.Student;public classText {public static voidmain(String[] args) {

test01();

}public static voidtest01(){

Student s=new Student(5,"周旭辉",18);//测试增删改

IStudentDAO dao=newIStudentDAOImpl();//在数据库表中添加数据//dao.add(s);//删除数据库 表中的数据//dao.delete(4);//修改数据库 表中的数据

dao.update(s);

}

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值