设计之道:ORM、DAO、Service与三层架构的规范探索

news/2024/9/16 17:49:37/ 标签: 重构, java, 设计规范, ORM, DAO, Service, 三层架构

 引言:

实际开发中,遵守一定的开发规范,不仅可以提高开发效率,还可以提高项目的后续维护性以及项目的扩展性;了解一下本博客的项目设计规范,对项目开发很有意义

一、ORM思想

ORM(Object-Relational-Mapping)在对象模型和关系型模型之间做一个映射(转换)。

目的是为了解决面向对象编程语言的发展和关系型数据库的发展不匹配的问题

可以理解为:

将Java中的数据结构与MySQL数据库中的数据结构做了一一映射,ORM提供了一种通过面向对象的方式来操作数据库的方式。

 Java对象和数据库数据对比:

模型数据格式
面向对象的语言(Java)类、对象、属性
关系模型的数据库(MySQL)表、行、字段
  • 一张表对应一个实体类
  • 一个字段对应实体类中的一个属性
  • 一行数据对应一个根据实体类生成的对象 

二 、Entity实体设计

用来和数据库中的表对应,解决的是数据格式在Java和数据库间的转换

可以理解为:

如何设计一个Java实体类,使其可以作为接收数据库中数据的载体

 编码规范:Java中将所有数据库的数据,使用Java对象进行表示

  1. 一张表对应一个实体类
  2. 类名与表名相关,如 t_user 的实体类名 User
  3. 一个字段对应一个属性
  4. 属性名必须由字段决定,字段名由1部分组成,则属性名与字段名保持一致,如 字段名 age的属性名也为 age;字段名由多个部分组成,属性名变成小驼峰命名,如字段名 user_id 的属性名为 userId
  5. 属性的数据类型必须与字段的类型保持一致(属性仍然是Java的数据类型)
    1. 对应关系如下:

      对应关系整数小数字符日期
      Javabyte/short/int/longdoubleStringDate
      MySQL整数类型(int...)小数类型(float,double,decimal)char/varchar/enum/text日期类型(datetime...)
  6. 属性的数据类型必须为引用类型(目的是为了处理数据库中的null值)
  7. 必须提供封装和无参构造方法,可以根据需要提供有参构造
  8. 必须实现序列化接口

三、DAO设计模式

DAO模式是一种接口+实现类的模式;

问题分析:

在实际开发中,针对一张表的复杂业务功能通常需要和表交互多次(比如转账)。如果每次针对表的简单操作我们都写一遍,代码中会出现大量的代码冗余

解决思路:

将重复的SQL操作提炼至方法中,达到一条SQL操作多次复用的目的

可以理解:

        在实际开发中,可能的情况是我们的项目需求是固定的,但是方法的实现方式不是固定的,这是将所需的SQL方法的声明和技术实现分离,接口负责提供一套规范,实现类负责利用相关技术完成规范,使用时用接口声明引用,优势在于可以提高项目内容的扩展性和后续的维护性。

核心思想 

DAO模式目的就是将SQL语句转化为通用SQL语句,并封装成Java方法、提高代码复用性。

DAO设计规范 

接口规范:com.xx.dao

  1. 一张表的SQL操作对应一个接口
  2. 接口名: 对应表的实体类名+Dao.如UserDao
  3. 一个SQL对应一个方法(只与sql映射,不映射功能)

实现类书写规范:com.xxx.dao.impl

  1. 一个实现类实现一个接口
  2. 实现类名: 接口名+impl,如UserDaolmpl
  3. 方法实现:使用数据库连接技术实现SQL需求
  4. 通常不会声明独有方法(使用接口引用,无法使用实现类独有方法)

方法定义规范::Xxx为对应类名

  1. 査询多行数据: public List<对象>selectXxxs[By属性名](),如selectUsers()|selectUsersByAge(int age)
  2. 查询单行数据:public 对象 selectXxxBy属性名().如selectUserByUserld(数据类型 属性名)
  3. 增: public int insertXxx(存储了添加信息的对象),当字段值较少时,也可以直接传入对应字段的属性声明
  4. 删: public int deleteXxxBy属性名(筛选条件对应的属性声明),如deleteUserByUserld(int Userld)
  5. 改: public int updateXxxBy属性名(存储了所有修改相关信息的对象),当涉及字段较少时,也可以直接传入相关属性声明

com.xxx.dao:指的是包名

四、三层架构思想

面向对象设计原则:

  1. 各司其职(单一职责):每个Java对象的职责尽可能单一,每个Java对象只负责做某一件事,目的是为了简单化。

  2. 解耦合(开闭原则):业务的变更,对于Java代码的影响,应该是允许增加代码(开放增加),避免修改代码(关闭修改)。

实际开发时,项目的设计规范,也应该遵守单一职责解耦合

三层架构 

 将访问数据库、业务处理、用户交互分为三个模块,遵循单一职责,各司其职,降低耦合

Java代码层 概念作用代码
view视图层与用户交互, 提醒、收集用户输入数据,展示结果等前端代码
service业务层封装业务代码,实现业务功能一个用户操作对应一个service方法
dao数据访问层对数据库进行CRUD操作jdbc和sql语句的代码

如图示:

 五、Service设计模式

面向用户操作的功能代码封装,Service业务层封装了用户的操作功能,一个用户操作,对应Service的一个方法。

执行流程:

视图层->调用业务层->调用DAO 

书写顺序:

先写DAO->书写业务层->再写视图层

书写顺序原因:
因为视图层需要业务层的数据支持,而业务层需要DAO的sql支持

 Service设计规范

接口:com.xxx.service

  1. 一张表的相关的功能对应一个service层接口,如登录|注册功能-UserService,转账-Accountservice
  2. 命名:实体类名+Service
  3. 一个功能对应一个方法

实体类:com.xxx.service.impl

  1. 一个实现类对应一个service接口
  2. 命名: service接口名+impl
  3. 方法实现:调用DAOSQL支持+逻辑代码

方法:

  • 返回值:
    • 查询功能的返回值为List集合或单个对象
    • 增删改查及其他功能,通常返回boolean类型
  • 参数:需要用户提供的数据都应该为功能的参数,参数模式为单个声明还是对象容器存储由参数的数量决定
  • 命名:
    • 功能逻辑复杂:以功能命名,如登陆 login,注册 register ,转账 transfer
    • 功能逻辑简单(功能结构只与SQL执行结构相关):在DAO模式命名的基础上更改方法前端的关键字
      • 查询:query... ,如查询所有用户信息-queryUsers
      • 增加:add...,如新增用户信息-addUser
      • 删除:remove...,如根据用户ID删除用户信息-removeUserByUserId
      • 更改:change...,如根据用户名修改密码-changeUserByUserName |changePasswordByUserName

视图层

视图层:在实际开发中对应前端页面

规范:

  1. 包名:com.xxx.view
  2. 命名:以View结尾

总结 

这样子创建一个项目,看上去比较复杂,但是在后续的框架学习中,我们是能够更好理解框架设计的规范,一个好的框架在设计上,也一定时遵循一定的设计规范,例如解耦合和单一职责等特性。


http://www.ppmy.cn/news/1521768.html

相关文章

P0.9/P1.25全倒装共阴节能COB超微小间距LED显示屏已抢占C位

COB&#xff08;Chip on Board&#xff09;技术最早发源于上世纪60年代&#xff0c;是将LED芯片直接封装在PCB电路板上&#xff0c;并用特种树脂做整体覆盖。COB实现“点” 光源到“面” 光源的转换。点间距有P0.3、P0.4、P0.5、P0.6、P0.7、P0.9、P1.25、P1.538、P1.5625、P1.…

pytorch计算张量中三维向量的欧式距离

如果 X 是一个包含多个三维向量的张量&#xff0c;形状为 [b, n, 3]&#xff0c;其中 b 是批次大小&#xff0c;n 是每个批次中的向量数量&#xff0c;那么可以使用类似的广播机制来计算同一批次内不同位置的三维向量之间的欧式距离。 以下是具体实现步骤&#xff1a; 扩展张量…

时序预测 | 基于DLinear+PatchTST多变量时间序列预测模型(pytorch)

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 DLinearPatchTST多变量时间序列 dlinear,patchtst python代码&#xff0c;pytorch架构 适合功率预测&#xff0c;风电光伏预测&#xff0c;负荷预测&#xff0c;流量预测&#xff0c;浓度预测&#xff0c;机械领域预…

Java 基于微信小程序的小区服务管理系统,附源码

博主介绍&#xff1a;✌stormjun、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…

websocket和轮询的区别?

问&#xff1a; websocket和轮询的区别&#xff1f; 回答&#xff1a; WebSocket 和定时轮询&#xff08;每隔几秒发送一次请求&#xff09;是两种不同的实时通信方法&#xff0c;各有优缺点&#xff0c;适用于不同的场景。以下是它们的主要区别及适用场景&#xff1a; WebSo…

Node.js sqlite3事件深入解析:trace、profile、change、error、open

在Node.js环境中&#xff0c;sqlite3库不仅提供了丰富的API用于数据库操作&#xff0c;还定义了一系列的事件&#xff0c;使得开发者能够监听和响应数据库操作过程中的各种状态变化。本文将深入解析sqlite3库中的trace、profile、change、error、open这五个事件&#xff0c;包括…

0903,LIST(merge,splice,sort,unique),SET(insert,erase)

目录 03_vector_delete.cc 04_vector_shrink.cc 05_vec_emplace_back.cc 06_listspec_splice.cc 07_classstruct.cc 08_set.cc 09_setErase.cc 作业 01 STL中的容器包括哪些&#xff1f;各自具有哪些特点&#xff1f; 02 题目&#xff1a;编写代码&#xff1a;将…

Android Camera系列(一):SurfaceView+Camera

心行慈善&#xff0c;何需努力看经—《西游记》 Android Camera系列&#xff08;一&#xff09;&#xff1a;SurfaceViewCamera Android Camera系列&#xff08;二&#xff09;&#xff1a;TextureViewCamera Android Camera系列&#xff08;三&#xff09;&#xff1a;GLSur…

20240902软考架构-------软考96-100答案解析

每日打卡题96-100答案 96、【2018年真题】 难度&#xff1a;难 CORBA服务端构件模型中&#xff0c; 是CORBA对象的真正实现&#xff0c;负责完成客户端请求。 A.伺服对象&#xff08;Servant&#xff09; B.对象适配器&#xff08;Object Adapter&#xff09; C.对象请求代理&…

回溯——7.子集II

力扣题目链接 给定一个可能包含重复元素的整数数组 nums&#xff0c;返回该数组所有可能的子集&#xff08;幂集&#xff09;。 说明&#xff1a;解集不能包含重复的子集。 示例: 输入: [1,2,2]输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ] 解题思路总结&#xff1a; …

AIStarter改进计划:功能优化与内测预告【欢迎吐槽】

随着技术的不断进步&#xff0c;AIStarter也在持续进化&#xff0c;以更好地满足用户的需求。本文将探讨AIStarter的改进计划&#xff0c;包括应用版本号、市场排序、描述和筛选功能的优化&#xff0c;并预告即将到来的内测消息。此外&#xff0c;还将介绍AIStarter在网络加速、…

东南大学研究生-数值分析上机题(2023)Python 3 线性代数方程组数值解法

列主元Gauss消去法 3.1 题目 对于某电路的分析&#xff0c;归结为就求解线性方程组 R I V \pmb{RIV} RIV&#xff0c;其中 R [ 31 − 13 0 0 0 − 10 0 0 0 − 13 35 − 9 0 − 11 0 0 0 0 0 − 9 31 − 10 0 0 0 0 0 0 0 − 10 79 − 30 0 0 0 − 9 0 0 0 − 30 57 − 7 …

【2024-2025源码+文档+调试讲解】微信小程序的城市公交查询系统

摘 要 当今社会已经步入了科学技术进步和经济社会快速发展的新时期&#xff0c;国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统城市公交查询管理采取了人工的管理方法…

怎么摆脱非自然链接?

什么是非自然链接&#xff1f; 非自然链接是人为创建的链接&#xff0c;用于操纵网站在搜索引擎中的排名。非自然链接违反了Google 的准则&#xff0c;网站可能会因此受到惩罚。 它们不是由网站所有者编辑放置或担保的。示例包括带有过度优化锚文本的链接、通过 PR 的广告、嵌…

Nginx部署前端VUE项目

要部署一个Vue项目&#xff0c;可以使用nginx作为web服务器。下面是一些步骤&#xff1a; 确保你已经在本地机器上安装了nginx。如果没有安装&#xff0c;请按照官方文档进行安装。 将Vue项目构建为静态文件。在项目根目录下运行以下命令&#xff1a; npm run build这将在项…

如何在Excel中创建一个VBA宏,并设置一个按钮来执行这个宏

下面是一个详细的步骤指南 步骤1&#xff1a;创建VBA宏 1. 打开Excel并按 Alt F11 打开VBA编辑器。 2. 在VBA编辑器中&#xff0c;选择 Insert > Module 来插入一个新的模块。 3. 将以下代码粘贴到模块中&#xff1a; vba Sub CreateNewSheet() 声明一个工作表对象Dim …

【STM32项目设计】STM32F411健康助手--MPU6050陀螺仪驱动(6)

硬件设计 软件设计 此项目使用的是软件I2C&#xff0c;MPU6050的SCL连接到STM32的PB10&#xff0c;SDA连接到STM32的PB9 mpuiic.c #include "mpuiic.h" #include "delay.h"//MPU IIC 延时函数 void MPU_IIC_Delay(void) {delay_us(2); }//初始化IIC voi…

AWS账号关闭后的影响:您需要知道的一切

亚马逊网络服务&#xff08;AWS&#xff09;作为全球领先的云计算平台&#xff0c;为众多企业和个人提供了便捷、高效的云服务。然而&#xff0c;当用户决定关闭其AWS账号时&#xff0c;可能会对其现有的服务和资源产生重大影响。我们九河云将通过本文将深入探讨AWS账号关闭后的…

SQLite 创建表:一场数据库里的“造物运动”

嘿&#xff0c;各位数据库的“造物主”们&#xff01;今天咱们来聊聊SQLite里的一场有趣活动——创建表。没错&#xff0c;就像上帝创造了世界&#xff0c;我们也可以在SQLite数据库里创造属于我们自己的“小世界”。 一、创建表的“魔法咒语” 在SQLite这个“魔法世界”里&a…

ARM基础知识---CPU---处理器

目录 一、ARM架构 1.1.RAM---随机存储器 1.2.ROM---只读存储器 1.3.flash---闪存存储器 1.4.时钟&#xff08;振晶&#xff09; 1.5.复位 二、CPU---ARM920T 2.1.R0~R12---通用寄存器 2.2.PC程序计数器 2.3.LR连接寄存器 2.4.SP栈指针寄存器 2.5.CPSR当前程序状态寄存…