java中的dao、service、controler

本文详细解析了后端开发中常见的三层架构:DAO层负责数据访问,Service层提供业务服务,Controller层处理请求转发。通过实例说明各层职责及交互,帮助读者理解如何在项目中合理运用。

DAO层:
DAO层叫数据访问层,全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表的增删改查,也就是说某个DAO一定是和数据库的某一张表一一对应的,其中封装了增删改查基本操作,建议DAO只做原子操作,增删改查。

Service层:
Service层叫服务层,被称为服务,内置服务,接收来自Controller层的消息和将Dao层反馈信息传递至Controller层。粗略的理解就是对一个或多个DAO进行的再次封装,封装成一个服务,所以这里也就不会是一个原子操作了,需要事物控制。

Controler层:
Controler负责请求转发,接受页面过来的参数,传给Service处理,接到返回值,再传给页面。
在这里插入图片描述
总结:
个人理解DAO面向表,Service面向业务。后端开发时先数据库设计出所有表,然后对每一张表设计出DAO层,然后根据具体的业务逻辑进一步封装DAO层成一个Service层,对外提供成一个服务。

在 Express 框架中,`service` 和 `controller` 是常见的模块划分方式,用于实现业务逻辑的解耦和代码的可维护性。它们各自承担不同的职责,并通过清晰的结构提升代码的可读性和扩展性。 ### Controller 的作用与使用方法 `controller` 主要负责接收 HTTP 请求并调用相应的 `service` 方法进行处理。它通常包含处理请求的函数,这些函数会被路由(`router`)调用。`controller` 不包含复杂的业务逻辑,而是将请求参数传递给 `service` 层进行处理,并将处理结果返回给客户端。 例如,一个博客系统的 `controller` 可能如下所示: ```javascript const blogService = require('../service/blogService'); exports.createBlog = async function(req, res) { const result = await blogService.insertBlog(req.body); res.json(result); }; ``` 该函数接收请求对象 `req` 和响应对象 `res`,调用 `blogService` 中的 `insertBlog` 方法,并将请求体中的数据传递过去。处理完成后,使用 `res.json()` 返回结果[^1]。 ### Service 的作用与使用方法 `service` 是业务逻辑的核心部分,它负责执行具体的业务操作,例如数据库操作、数据验证、第三方 API 调用等。`service` 通常不关心请求和响应的具体细节,而是专注于数据的处理和业务规则的实现。 例如,`blogService` 的实现可能如下所示: ```javascript const blogDao = require('../dao/blogDao'); exports.insertBlog = async function(blog) { return await blogDao.insertBlog(blog); }; ``` 该方法调用 `blogDao` 中的 `insertBlog` 方法,执行数据库插入操作,并将结果返回给 `controller`。这种分层结构使得代码更易于测试和维护[^4]。 ### 示例:结合 Controller 和 Service 实现博客功能 假设需要实现一个简单的博客系统,包含创建、删除、更新和查询博客文章的功能。以下是完整的代码示例: #### 1. 定义 DAO(数据访问对象) ```javascript // dao/blogDao.js const BlogModel = require('../model/blogModel'); exports.insertBlog = async function(blog) { return await BlogModel.create(blog); }; exports.removeBlog = async function(b_id) { return await BlogModel.deleteOne({ blogId: b_id }); }; exports.modifyBlog = async function(blog) { return await BlogModel.findOneAndUpdate( { blogId: blog.blogId }, { $set: { title: blog.title, content: blog.content, type: blog.type } } ); }; exports.findAll = async function() { return await BlogModel.find(); }; ``` #### 2. 定义 Service ```javascript // service/blogService.js const blogDao = require('../dao/blogDao'); exports.insertBlog = async function(blog) { return await blogDao.insertBlog(blog); }; exports.removeBlog = async function(b_id) { return await blogDao.removeBlog(b_id); }; exports.modifyBlog = async function(blog) { return await blogDao.modifyBlog(blog); }; exports.getAllBlogs = async function() { return await blogDao.findAll(); }; ``` #### 3. 定义 Controller ```javascript // controller/blogController.js const blogService = require('../service/blogService'); exports.createBlog = async function(req, res) { const result = await blogService.insertBlog(req.body); res.json(result); }; exports.deleteBlog = async function(req, res) { const result = await blogService.removeBlog(req.params.id); res.json(result); }; exports.updateBlog = async function(req, res) { const result = await blogService.modifyBlog(req.body); res.json(result); }; exports.getBlogs = async function(req, res) { const result = await blogService.getAllBlogs(); res.json(result); }; ``` #### 4. 定义 Router ```javascript // router/blogRouter.js const express = require('express'); const router = express.Router(); const blogController = require('../controller/blogController'); router.post('/blogs', blogController.createBlog); router.delete('/blogs/:id', blogController.deleteBlog); router.put('/blogs', blogController.updateBlog); router.get('/blogs', blogController.getBlogs); module.exports = router; ``` #### 5. 主应用文件 ```javascript // app.js const express = require('express'); const app = express(); const blogRouter = require('./router/blogRouter'); app.use(express.json()); app.use('/api', blogRouter); const PORT = 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); }); ``` 通过上述代码,可以实现一个结构清晰的 Express 应用,其中 `controller` 负责处理请求和响应,`service` 负责业务逻辑,而 `dao` 负责数据库操作。这种分层架构使得代码更易于维护和扩展。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值