在 Java 项目中,DAO(Data Access Object,数据访问对象)通常用于把“业务逻辑”和“数据库访问”解耦。一个清晰、可维护的 DAO 分层方式,一般如下(从下到上):
├── entity / model (实体层)
├── dao (DAO 接口层)
├── dao.impl (DAO 实现层)
├── service (业务层接口)
├── service.impl (业务层实现)
├── controller / web (控制层)
作用:
示例:
public class User {
private Long id;
private String username;
private String password;
}
✅ 只负责“数据载体”,不包含任何逻辑
public interface UserDao {
User findById(Long id);
List<User> findAll();
int insert(User user);
int update(User user);
int delete(Long id);
}
特点:
@Repository
public class UserDaoImpl implements UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public User findById(Long id) {
String sql = "select * from user where id = ?";
return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), id);
}
}
常见实现方式:
JdbcTemplateMyBatis MapperJPA Repository❗ DAO 不能直接给 Controller 用
public interface UserService {
User getUserById(Long id);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public User getUserById(Long id) {
return userDao.findById(id);
}
}
Service 层特点:
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
}
mapper(DAO 接口)
└── UserMapper.java
resources/mapper
└── UserMapper.xml
@Mapper
public interface UserMapper {
User selectById(Long id);
}
✅ 此时 Mapper = DAO
public interface UserRepository extends JpaRepository<User, Long> {
}
✅ Repository 就是 DAO
✅ 解耦数据库和业务逻辑
✅ 方便切换数据库实现
✅ 易于单元测试(Mock DAO)
✅ 符合单一职责原则
❌ Controller 直接调用 DAO
❌ DAO 里写业务逻辑
❌ Service 里写 SQL
❌ Entity 里写数据库操作
DAO 只负责“怎么存取数据”,Service 负责“怎么用数据”,Controller 负责“怎么接收请求”。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。