在 Java 企业级开发中,DAO(Data Access Object)层通常用于隔离业务逻辑与数据库访问。随着项目规模扩大,DAO 层一般会进一步分层,以提高可维护性、可测试性和扩展性。
下面从常见分层结构、各层职责、典型代码示例、以及最佳实践几个方面来说明。
一个比较成熟的 Java 项目,DAO 层通常可以这样分层:
Controller
↓
Service(业务逻辑层)
↓
Repository / DAO(数据访问层)
↓
Entity / Model(数据库映射对象)
↓
DataSource / ORM Framework(MyBatis / JPA / JDBC)
在 DAO 内部,常见进一步划分:
@Table("user")
public class UserDO {
private Long id;
private String username;
private Integer age;
}
UserMapper@Mapper
public interface UserMapper {
UserDO selectById(Long id);
void insert(UserDO user);
}
或传统 DAO:
public interface UserDao {
UserDO getById(Long id);
}
@Repository
public class UserDaoImpl implements UserDao {
// JDBC 操作
}
@Repository
public class UserRepository {
@Autowired
private UserMapper userMapper;
public UserDO findById(Long id) {
return userMapper.selectById(id);
}
}
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public UserDO getUser(Long id) {
return userRepository.findById(id);
}
}
Mapper 接口
↓
Repository(可选)
↓
Service
Entity
↓
JpaRepository<T, ID>
↓
Service
public interface UserRepository extends JpaRepository<User, Long> {
}
DAO 接口
↓
DAO 实现
↓
Service
❌ 错误:
if (user.getAge() > 18) {
mapper.insert(user);
}
✅ 正确:
DO 或 Optional<DO>Map 或 JSONObjectList<UserDO> queryByCondition(UserQuery query);
Page<UserDO> pageQuery(PageRequest request);
DAO 层应“只管数据怎么取”,Service 层“管业务怎么走”,Repository 是它们之间的桥梁。
如果你愿意,我可以:
你可以告诉我你用的是 Spring Boot / MyBatis / JPA / 传统 SSM 哪种。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。