到底DAO是什么?为什么要有它的存在?

本文详细介绍了DataAccessObject(DAO)模式的使用方式及其在数据库交互中的优势。通过将数据访问逻辑封装于DAO接口中,可以有效地分离业务逻辑与数据访问逻辑,并简化了数据库类型的更换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Data Access Object 数据访问接口,就是访问数据库方法的 interface

1. DAO用来封装Data Source的..就比如,Connection conn = DAOFacotry.createConnection()..
就可以把Driver. URL. username, passpword这一些放在DAO中
以后要更改数据库的类型.比如要把MSSQL换成Oracle的话..只需要更改DAOFacory里面的createConnection()里面的Driver.URL.之类的..
2. DAO也是把对数据库的操作(比如最基本的CRUD操作)全部封装在里面..
比如说你要你要插入一个新的用户..那么.在DAO中我们只需要提供一个insertUser(User user)这一个方法就可以了..具体的操作是在DAO中实现的...
那么对于要调用DAO的时候.我们只要知道insertUser(User)是用来插入一个新的用户...而不需要知道是如何实现的..

下面是form的三个字段(也就是用户要输三个注册信息)
firstname
lastname
password
分别对应数据库中的三个字段:
firstname
lastname
password:password

当用用户提交了一个注册Form后我就得到了一个fromBean,在完成了对这个formBean的验证(validate)之后我的我的控制转到Action的execute(),到了这里我有两个选择:
*****************************************************************
1:当有没有用到DAO时我会直接在execute()中完成这个formBean对数据库的提交下面是我的伪码:
Sesseion session=.....;
session.save(formBean);
*****************************************************************
2:当有用到DAO时是不是下面这样呢(我自己想的错了不要打我)
  a: 先定义一个DAO
Public class UserDao{
private Static Session sessioon=......;(定义一个静态的hibernate session 并initialize)
private String firstName;
private String lastName;
private String password;
public UserDao(String firstName,String lastName,String password){
this.firstName=firstName;
this.lastName=lastName;
this.password=password;
}
public UserDao(UserFormBean useBean){
this.firstName=useBean.firstName;
...
....
}
public void delUser(){
session.delete(this);
session.close();
}
public void addUser( ){
session.saveorUpdate(this);
session.close();
}
.....
...
}
b:在Action中的execute()
UserDao useDao=new UserDao(userFormBean);
useDao.save()
DAO一般是跟Factory和Abstract模式一起用的..
Factory来建立数据库和定位具体的DAO(比如说是UserDao..CustomerDao..)..

Abstract用来定义接口方法的比较:
public interface UserDao {
public insertUser(FormBean) ;
public updateUser(FormBean);
}
然后就实现DAO的接口:
public class UserDaoImpl implements UserDao {
public insertUser(FormBean) {
..//..
session.save(UserPO);
..//..
return FormBean;
}
public FormBean updateUser(FormBean) {
..//..
session.update(UserPO);
..//..
return FormBean;
}
}
最后定义你的PO:
public class UserPO {
String firstname, lastname, password..........
}
<think>嗯,用户现在想了解DAO接口的定义和用途。我需要结合之前的对话和提供的引用来回答。首先,用户之前问了关于数据库连接的接口,我详细解释了JDBC的各种接口和API。现在用户转向DAO模式,特别是DAO接口。根据引用,DAO模式包括DAO接口、实现类、实体类等组件,用于数据库的增删改查操作。用户提到的引用1、3、4都涉及DAO的结构和实现。 用户的问题集中在DAO接口本身:定义和用途。我需要明确DAO接口是什么,它的作用,以及为什么使用它。首先,DAO是数据访问对象,接口用于定义操作数据库的方法,而不涉及具体实现。这样可以让业务逻辑与数据访问解耦,提高可维护性和可扩展性。引用4中的StudentDao.java示例展示了接口中的方法,如findAll、update等,这些都是典型的DAO接口方法。 用户可能想知道DAO接口如何工作,尤其是在没有实现类的情况下,像引用2提到的,通过MyBatis的getMapper获取接口实例。这里需要解释动态代理机制,比如MyBatis如何生成接口的实现类,这样用户不需要手动编写实现代码,而是由框架处理。这可能涉及到引用2中的问题,关于TestDAO接口的实现类来源。 另外,需要强调DAO接口的好处,比如支持多种数据库,更换实现类即可切换数据库,如引用1所述。还要提到与JDBC的关系,如引用3中的EmpDaoMySQL实现类使用JDBC操作数据库。可能还需要提到最佳实践,比如分层架构、事务管理、异常处理等。 用户可能存在的潜在疑问包括:DAO接口如何与具体数据库交互,为什么使用接口而不是直接写实现类,以及在实际项目中如何组织DAO层。需要确保回答覆盖这些点,并引用提供的例子来具体说明。例如,引用3中的EmpDaoMySQL类实现了EmpDao接口,使用JDBC执行SQL,而引用4中的StudentDao接口定义了CRUD方法。 最后,用户可能需要了解DAO模式的优势,如解耦、可测试性、代码复用等。结合引用中的信息,确保回答结构清晰,分点说明,并给出实际代码示例,如接口定义和实现类,以及框架中的动态代理例子。同时,相关问题部分需要引导用户深入探讨DAO的实现机制、设计优势和应用场景。</think>### DAO接口的定义与核心作用解析 --- #### 一、DAO接口的本质定义 **DAO(Data Access Object)接口**是数据访问层的抽象契约,通过**声明式方法**定义对数据库的操作规范,不包含具体实现细节。例如引用[4]中的`StudentDao`接口: ```java public interface StudentDao { ArrayList<Student> findAll(); // 声明查询所有学生的方法 void update(Student student); // 声明更新方法 // 其他CRUD方法... } ``` **核心特征**: - **标准化操作**:统一所有数据库访问方法的签名(如参数类型、返回值) - **技术解耦**:业务层仅依赖接口,无需关心具体数据库类型(MySQL/Oracle等) --- #### 二、DAO接口的核心作用 1. **业务逻辑与数据访问解耦** - **业务层**调用`dao.findAll()`方法时,无需知道底层是JDBC还是MyBatis实现[^3] - 如引用[1]所述,更换数据库只需替换DAO实现类(如`EmpDaoMySQL`→`EmpDaoOracle`) 2. **多态性支持** ```java // 通过接口类型引用实现类 EmpDao empDao = new EmpDaoMySQL(); // 可替换为其他实现 List<Emp> list = empDao.findAllEmp(); ``` 3. **框架动态代理的基石** - MyBatis等ORM框架通过动态代理生成接口实现类(引用[2]示例): ```java // MyBatis自动创建TestDAO接口的实现类 TestDAO testDAO = sqlSession.getMapper(TestDAO.class); ``` --- #### 三、典型DAO接口设计模式 1. **基础CRUD模板**(引用[4]) ```java public interface BaseDao<T> { T findById(int id); List<T> findAll(); void insert(T entity); void update(T entity); void delete(int id); } ``` 2. **扩展查询接口** ```java public interface UserDao extends BaseDao<User> { // 添加领域特定方法 List<User> findActiveUsers(boolean isActive); int countByDepartment(String deptName); } ``` --- #### 四、DAO接口的实现方式对比 | **实现类型** | **示例** | **特点** | |--------------------|------------------------------|----------------------------------| | 传统JDBC实现类 | 引用[3]的`EmpDaoMySQL` | 直接使用`PreparedStatement`操作 | | ORM框架动态代理 | 引用[2]的MyBatis Mapper | 零实现类,SQL通过注解/XML配置 | | Spring Data JPA | `JpaRepository<User, Long>` | 基于接口自动生成查询方法 | --- #### 五、DAO接口的最佳实践 1. **分层规范** - 严格禁止业务层直接访问`Connection`或`ResultSet`(引用[3]中通过工具类封装连接) 2. **事务边界控制** ```java @Transactional // 声明式事务管理 public void transferMoney(Account from, Account to) { accountDao.withdraw(from); accountDao.deposit(to); } ``` 3. **异常处理策略** - 统一将`SQLException`转换为自定义异常(如`DataAccessException`) --- ### 相关问题 1. MyBatis如何通过接口动态生成SQL实现类?其底层原理与JDK动态代理有何关联?[^2] 2. 在使用Spring Data JPA时,为什么只需定义接口而不需要实现类就能完成复杂查询?[^2] 3. DAO层与Repository模式在架构设计中的主要区别是什么?[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值