DAO 四个包的建立

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

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

1   dao(代码分层?) 有利于后期的维护代码,修改方便。 com.aaa.dao 存放dao相关的类型 处理 数据库的链接 存取数据。 com.aaa.servlet 存放servlet相关的类 处理 和浏览器交互的类 com.aaa.entity 存放实体类 eg Student 接受数据库对象模型 com.aaa.util 存放工具类 eg DBUtil 2 3二、 通过servlet调用dao 演示代码分层的好处 4 5package com.aaa.entity; 6/* 7 1. 首先要新建数据库 8 数据库要有数据 student (id name age) 9 10 2.创建 数据库表对应的 实体类?-----放在SRC下的com.aaa.entity包中! 11 实体类作用: 存储数据库表中的数据。 12 需要将数据库表中的数据 提取到java中时 , 用对象来存储。 13 14 3.entity? 建立数据库对象模型。 15 16 4.在entity包下 新建student实体类 ? student实体类的作用是 用来存储数据库中的数据 17 18 */ 19public class Student { 20 //1.成员变量 属性? 对应数据库的列名 21 private int id; 22 private String name; 23 private int age; 24 /* 25 2.创建构造函数? 一个空参数 一个有参数 为啥? 26 构造函数的作用就是创建对象时完成初始化,当我们在new一个对象并传入参数的时候,会自动调用构造函数并完成参数的初始化。 27 当定义一个类的时候,通常情况下都会默认一个构造函数,此默认构造函数是不带参数的。 28 当自定义了含参构造函数时,默认构造函数将需要手动书写出来。 29 */ 30 31 public Student() { 32 } 33 // 34 public Student(int id, String name, int age) { 35 this.id = id; 36 this.name = name; 37 this.age = age; 38 } 39//get set方法 Alt+insert 自动生成 按住Ctrl键 鼠标勾选就可以选中要生成的方法! 40//目的 通过set get方法 获取私有的成员变量。 41 public int getId() { 42 return id; 43 } 44 45 public void setId(int id) { 46 this.id = id; 47 } 48 49 public String getName() { 50 return name; 51 } 52 53 public void setName(String name) { 54 this.name = name; 55 } 56 57 public int getAge() { 58 return age; 59 } 60 61 public void setAge(int age) { 62 this.age = age; 63 } 64//生成tostring方法 转字符串。 65 @Override 66 public String toString() { 67 return "Student{" + 68 "id=" + id + 69 ", name='" + name + '\'' + 70 ", age=" + age + 71 '}'; 72 } 73}

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

1package com.aaa.dao; 2 3import com.aaa.entity.Student; 4 5/* 6 7 8* 一、学生表的DAO 9* 在这里 我们写的是一个接口 定义学生类的接口 写在dao包下 10* 到包 由 接口 和 实现类组成! 11* 12* 二、implement功能如下 13* 1.添加学生 14* 2.根据ID删除学生 15* 3.根据ID修改学生 16* 注意 接口中都是抽象的方法 ! 17* 18* 三、implement的命名规则? 19* IStudent ----------------------- 首字母大写! 20* * */ 21public interface IStudentDAO { 22 /*1.添加学生 insert into student (name,age) value(?,?); 23 2.两个以上的参数 就用对象传参 24 3.学生对象 存放着需要添加的学生信息 25 4.Boolean 成功就返回true 失败 就 false 26 */ 27 boolean add(Student s); 28 29 //2.根据ID删除学生 delete from student where ID= ? 30 boolean delete(int id); 31 //3.根据ID添加学生 32 boolean update(Student s); 33 34}

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

1package com.aaa.dao.impl; 2 3import com.aaa.dao.IStudentDAO; 4import com.aaa.entity.Student; 5import com.aaa.util.DBUtil; 6 7/* 8 接口的实现类 在dao包下新建 impl包。 9 接口 和实现类 组成了 dao 包 10 11 */ 12public class IStudentDAOImpl implements IStudentDAO { 13 @Override 14 public boolean add(Student s) { 15 String sql ="insert into student(name,age) values(?,?)"; 16 return DBUtil.executeUpdate(sql,s.getName(),s.getAge()); 17 } 18 19 @Override 20 public boolean delete(int id) { 21 String sql="delete from student where id =?"; 22 return DBUtil.executeUpdate(sql,id); 23 } 24 25 @Override 26 public boolean update(Student s) { 27 String sql="update student set name=?, age=? where id=?"; 28 return DBUtil.executeUpdate(sql,s.getName(),s.getAge(),s.getId()); 29 } 30 31 32}

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

1package com.aaa.util; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.PreparedStatement; 6import java.sql.SQLException; 7 8/* 9 新建dbu工具类 简化操作 10 11 */ 12public class DBUtil { 13 static { 14 try { 15 Class.forName("com.mysql.jdbc.Driver"); 16 17 } catch (Exception e) { 18 e.printStackTrace(); 19 } 20 } 21 public static Connection getConnection(){ 22 try { 23 return DriverManager.getConnection("jdbc:mysql://localhost:3306/qy66?characterEnconding=UTF-8","root","root"); 24 } catch (SQLException e) { 25 e.printStackTrace(); 26 } 27 return null; 28 } 29 /** 增删改的通用方法 30 * @param String sql 要执行的sql 31 * @param Object[] obj 对象类型的数组 里面存放着 sql执行的占位符参数 32 * 【name,age,id】 33 * 【id】 34 * 【name,age】 35 * 36 * Object... 可变参数 数组没有固定长度,需要几个放几个 37 * */ 38 public static boolean executeUpdate(String sql, Object... args){ 39 PreparedStatement ps=null; 40 try { 41 ps=getConnection().prepareStatement(sql); 42 //便利获取 43 for (int i=0;i<args.length;i++){ 44 ps.setObject(i+1,args[i]); 45 /* 46 等同于这个 47 ps.setObject(1,s.getName()); 48 ps.setObject(2,s.getAge()); 49 ps.setObject(3,s.getId()); 50 */ 51 52 } 53 int i=ps.executeUpdate();//正确情况下 会返回1 54 if (i>0)return true; //判断 这里是Boolean类型的返回值 55 } catch (SQLException e) { 56 e.printStackTrace(); 57 }finally { 58 try { 59 ps.close(); 60 } catch (SQLException e) { 61 e.printStackTrace(); 62 } 63 } 64 return false; 65 } 66}

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

1package com.aaa.servlet; 2 3 4import com.aaa.dao.IStudentDAO; 5import com.aaa.dao.impl.IStudentDAOImpl; 6import com.aaa.entity.Student; 7 8public class Text { 9 public static void main(String[] args) { 10 test01(); 11 } 12 public static void test01(){ 13 Student s=new Student(5,"周旭辉",18); 14 //测试增删改 15 IStudentDAO dao=new IStudentDAOImpl(); 16 //在数据库表中添加数据 17 // dao.add(s); 18 //删除数据库 表中的数据 19 // dao.delete(4); 20 21 //修改数据库 表中的数据 22 dao.update(s); 23 24 } 25 26}

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

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

DAO 四个包的建立 - HelloWorld