一、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); } }
总结,代码分层。降低了代码的耦合性,优化代码结构,便于后期维护。