目录
DAO模式 含义
DAO模式 的理解
分层思维
分层含义
分层目的
dao层
dao包(对接的是操作数据库的接口)
dao包下lmpl 包(dao包中接口的实现类)
补充
1 你创建的实体类需要和数据库中建的表一一对应。
总结
DAO模式 含义
数据访问对象(Data Access Object)模式,是一种设计模式,主要用于将业务逻辑与数据访问代码分离,以提高代码的模块化、可维护性和可测试性。
DAO模式 的理解
理解DAO模式,我认为最为重要的:理解分层思维
分层思维
分层含义
- 将系统分解成多个层次,每个层次都有明确的职责和功能,并且层次之间通过定义良好的接口进行交互
- 我认为应该把,同一功能/同一技术类型的类,放在同一包下
例如,Java分为经典三层模型
经典的三层架构(表现层、业务逻辑层、数据访问层)
- 表现层:负责用户界面和用户交互,如Web页面、桌面应用界面等。
- 业务逻辑层:处理业务规则和业务流程,如订单处理、用户认证等。
- 数据访问层:负责数据的持久化,如数据库操作。
- 以下是一些常见的
- web层:表现层负责用户界面和用户交互,如Web页面、桌面应用界面
- service层:业务逻辑层(主要处理业务,逻辑代码,数据加工,条件判断)
- dao层:数据访问层,封装与数据库操作
- entity/domain..层 实体类(对应的数据库的表的类)
- util :工具类(如jdbcUtil 封装 连接的数据库的一些操作)
分层目的
1 技术隔离
- 比如dao层使用的技术jdbc jdbc中的核心的api 类 不能在其他的类出现
2 不能跨层调用
如下图 展示的:
dao层
数据访问层,封装数据库的操作
- dao包(对接的是操作数据库的接口)
- dao包下lmpl 包(dao包中接口的实现类)
dao包(对接的是操作数据库的接口)
StudentDao 接口实例代码
// 查询public Student showStudent(int id);//查询所有学生public List<Student> showAllStudent();// 删除public boolean delete(int id);// 修改public boolean update(Object...params);// 添加public boolean add(Object...params);
UserDao接口实例代码
// 登录int login( String username, String password);// 注册int register(String username, String password);
dao包下lmpl 包(dao包中接口的实现类)
- StudentDaoImpl类 实现StudentDao 接口
- UserDaoImpl 类 实现UserDao接口
StudentDaoImpl 实例代码
package it.dao.impl;import it.Util.jdbcUtil; import it.dao.StudentDao; import it.dao.UserDao; import it.entity.Student;import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.Scanner;/*** @Author: Administrator* @Description:* @Date: 2024/11/8 下午4:54* @Version: 1.0*/ public class StudentDaoImpl implements StudentDao {Scanner input = new java.util.Scanner(System.in);/** 根据id查询学生*/@Overridepublic Student showStudent(int id) {String sql = "select stuId, stuName, stuSex, stuAge from student where stuId=?";String stuName = null;int stuAge = 0;int stuId = 0;String stuSex = null;try {ResultSet resultSet = jdbcUtil.executeQuery(sql, id);if (resultSet.next()) {stuId = resultSet.getInt("stuId");stuName = resultSet.getString("stuName");stuSex = resultSet.getString("stuSex");stuAge = resultSet.getInt("stuAge");return new Student(stuName, stuAge, stuSex, stuId);} else {System.out.println("该学生不存在");return null;}} catch (SQLException e) {throw new RuntimeException(e);}}/** 查询所有学生*/@Overridepublic List<Student> showAllStudent() {String sql = "select stuId, stuName, stuSex, stuAge from student";List<Student> list = new ArrayList<>();try {Connection conn = jdbcUtil.getConnection();Statement statement = conn.createStatement();ResultSet resultSet = statement.executeQuery(sql);while (resultSet.next()) {int stuId = resultSet.getInt("stuId");String stuName = resultSet.getString("stuName");String stuSex = resultSet.getString("stuSex");int stuAge = resultSet.getInt("stuAge");Student student = new Student(stuName, stuAge, stuSex, stuId);list.add(student);}} catch (SQLException e) {throw new RuntimeException(e);}return list;}/*删除学生信息*/@Overridepublic boolean delete(int id) {String sql = "delete from student where stuId=?";int i = jdbcUtil.executeUpdate(sql, id);if (i > 0) {return true;}return false;}@Overridepublic boolean update(Object... params) {String sql = "update student set stuName=?,stuAge=?,stuSex=? where stuId=?";int i = jdbcUtil.executeUpdate(sql, params);if (i > 0) {return true;} else {return false;}}/* 添加学生信息 */@Overridepublic boolean add(Object... params) {String sql = "insert into student(stuName,stuSex,stuAge) values(?,?,?)";int i = jdbcUtil.executeUpdate(sql, params);if (i > 0) {return true;} else {return false;}} }
UserDaoImpl 类的实例代码
package it.dao.impl;import it.Util.jdbcUtil; import it.dao.StudentDao; import it.dao.UserDao;import java.sql.Date; import java.sql.ResultSet; import java.sql.SQLException;/*** @Author: Administrator* @Description:* @Date: 2024/11/9 下午4:20* @Version: 1.0*/ public class UserDaoImpl implements UserDao {/** 登录*/@Overridepublic int login( String username, String password) {String sql = "select username,pwd from user where username=? and pwd=?";ResultSet resultSet = null;try {resultSet = jdbcUtil.executeQuery(sql, username, password);if (resultSet.next()) {return 0;} else {return 1;}} catch (SQLException e) {throw new RuntimeException(e);}} /*注册*/@Overridepublic int register(String username, String password) {String sql = "insert into user(username,pwd) values(?,?)";Date date = new Date(System.currentTimeMillis());int i = jdbcUtil.executeUpdate(sql, username, password);if (i > 0) {return 1;} else {return 0;}} }
补充
1 你创建的实体类需要和数据库中建的表一一对应。
如下图所示:
数据库的字段类型 | 实体类的属性数据类型 |
char/varchar/text[文本型] | String |
int [数值型] | Integer |
bigint | Long |
double | Double |
decimal | BigDecimal |
注意:数据库中 data/time/datetime 字段类型 ,对应在Java中有两种形式:
- Java.util.Date
- java.sql.Date
但我们推荐使用Java.util.Date
原因
这里 存在向上转型:Java.util.Date 是java.sql.Date 的父类
总结
本篇博客,简单的介绍了DAO模式。但我认为这是远远不够的在之后的学习中,还无法理解其中的精髓。因此在之后的学习中,我会及时补充