目录
1. POJO(Plain Old Java Object)
2. Entity / PO(Persistent Object,持久化对象)
5. DTO(Data Transfer Object,数据传输对象)
- 需求评审
- 方案设计(数据库设计,接口设计,架构设计,概念设计,详细设计,上线计划)
- 设计评审,排期->同步给产品经理,提测
- 开发+自测
- 提测+联调
- 上线
这其中开发阶段重要的是2-4阶段
一、数据库表设计:关系表和实体表
用户表和博客表:
在这里偷个懒,在用户表中应该有用户名和昵称,然后一般在创建表的时候,实体一对一的关系不建立关系表,实体多对多的关系建立关系表,实体一对多的关系具体分析,然后就是外键在项目中一般不使用。
-- 建表SQL
create database if not exists java_blog_spring charset utf8mb4;
use java_blog_spring;
-- ⽤⼾表
DROP TABLE IF EXISTS java_blog_spring.user_info;
CREATE TABLE java_blog_spring.user_info(
`id` INT NOT NULL AUTO_INCREMENT,
`user_name` VARCHAR ( 128 ) NOT NULL,
`password` VARCHAR ( 128 ) NOT NULL,
`github_url` VARCHAR ( 128 ) NULL,
`delete_flag` TINYINT ( 4 ) NULL DEFAULT 0,
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now() ON UPDATE now(),
PRIMARY KEY ( id ),
UNIQUE INDEX user_name_UNIQUE ( user_name ASC )) ENGINE = INNODB DEFAULT
CHARACTER
SET = utf8mb4 COMMENT = '⽤⼾表';
-- 博客表
drop table if exists java_blog_spring.blog_info;
CREATE TABLE java_blog_spring.blog_info (
`id` INT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(200) NULL,
`content` TEXT NULL,
`user_id` INT(11) NULL,
`delete_flag` TINYINT(4) NULL DEFAULT 0,
`create_time` DATETIME DEFAULT now(),
`update_time` DATETIME DEFAULT now() ON UPDATE now(),
PRIMARY KEY (id))
ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '博客表';
-- 新增⽤⼾信息
insert into java_blog_spring.user_info (user_name,
password,github_url)values("zhangsan","123456","https://gitee.com/bubble/java45");
insert into java_blog_spring.user_info (user_name,
password,github_url)values("lisi","123456","https://gitee.com/bubble/java45");
insert into java_blog_spring.blog_info (title,content,user_id) values("第⼀篇博客","111我是博客正⽂我是博客正⽂我是博客正⽂",1);
insert into java_blog_spring.blog_info (title,content,user_id) values("第⼆篇博客","222我是博客正⽂我是博客正⽂我是博客正⽂",2);
二、创建项目(项目的准备):
创建一个SpringBoot项目,添加对应的Lombock,Spring Web ,MySQL Driver,Mybatis-plus等依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.6</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
配置配置文件:
spring:
application:
name: springblogdemotemp
datasource:
url: jdbc:mysql://127.0.0.1:3306/java_blog_spring?characterEncoding=utf8&useSSL=false
username: root
password: "123456"
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
# 驼峰自动转换
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
logging:
file:
name: spring-blog.log
准备前端代码部分:
然后写一部分的前端代码,由于对于前端代码来说,涉及不是什么深刻,所以使用三件套进行开发
包括一些登陆页面的设计,然后在后面的开发中再进行对于接口的详细编写
进行测试:http://127.0.0.1:8080/blog_login.html

三、项目的相关代码:
实体类:这些在不同的环境下的用法不一定相同,了解为主
model,entity,pojo,VO,VTO,DO,DTO,BO
在 Java 开发中,Model、Entity、POJO、VO、VTO、DO、DTO、BO 等实体类是分层架构下的不同数据载体,各自承担特定职责。以下是它们的核心含义及分层设计的必要性:
各实体类的定义与核心作用:
1. POJO(Plain Old Java Object)
- 含义:简单 Java 对象,仅包含属性、getter/setter 和基本方法,不依赖任何框架特定类或接口(如不继承
Serializable、不实现Entity等)。 - 作用:是所有轻量级数据容器的 “基类”,
PO、DTO、VO等本质上都是 POJO。
2. Entity / PO(Persistent Object,持久化对象)
- 含义:与数据库表结构严格映射的对象,通常用 ORM 框架(如 MyBatis、Hibernate/JPA)实现数据持久化。
- 作用:在 DAO 层(数据访问层)直接操作数据库,例如通过
@Entity(JPA)或@Table(MyBatis)注解映射表字段。 - 特点:字段与数据库表一一对应,包含主键、外键等数据库相关属性。
3. Model(模型)
- 含义:对业务领域概念的抽象,既包含数据结构,也可封装业务逻辑(如计算、验证规则)。
- 作用:在 MVC 架构中作为 “模型层”,为视图(View)提供数据,同时处理业务规则(如订单状态流转、库存计算)。
- 特点:比
Entity更抽象,可能聚合多个PO或DO的数据。
4. DO(Domain Object,领域对象)
- 含义:领域驱动设计(DDD)中的核心概念,封装业务规则和状态,代表业务领域中的 “实体”(如订单、用户)。
- 作用:在领域层处理复杂业务逻辑(如订单创建时校验库存、用户权限),可能聚合多个
PO或调用领域服务。 - 特点:与数据库结构不一定一致,更关注业务语义。
5. DTO(Data Transfer Object,数据传输对象)
- 含义:用于跨层(如 Controller ↔ Service)或跨服务(如微服务间)传输数据的对象。
- 作用:隔离层与层之间的数据结构,避免直接暴露内部实体(如隐藏敏感字段、聚合多个
PO的字段)。 - 场景:前端通过 REST 接口提交数据(
@RequestBody UserDTO)、微服务通过 Feign 传递数据。
6. VO(View Object,视图对象)
- 含义:面向前端展示定制化的数据模型,仅包含页面需要的字段。
- 作用:在 Controller 层将数据格式化后返回给前端(如日期转字符串、手机号脱敏),避免前端直接操作
Entity或DTO。 - 特点:字段与前端页面强绑定,可能聚合多表数据(如同时包含用户信息和订单信息)。
7. VTO(Transfer Object,传输对象)
- 含义:通常是
DTO或TO的笔误,与DTO功能类似,强调轻量级数据传输(如模块间或进程内的数据传递)。 - 作用:减少远程调用次数,优化数据传输效率(如批量传递多个对象)。
8. BO(Business Object,业务对象)
- 含义:封装跨实体的复杂业务逻辑,协调多个
PO、DO或服务的操作。 - 作用:在 Service 层处理 “跨领域” 逻辑(如订单创建需同时校验库存、用户余额、物流状态)。
- 特点:可能包含多个
PO或DO的引用,是业务逻辑的 “组合器”。
为什么需要这么多实体类?
核心目的是通过 “分层解耦” 提升代码的可维护性、扩展性和安全性,避免 “一个类走天下” 导致的职责混乱。具体原因如下:
-
隔离关注点:
- 数据库层(
Entity/PO)只关心表结构映射; - 业务层(
DO/BO)只关心业务规则; - 表现层(
VO)只关心前端展示; - 传输层(
DTO/VTO)只关心数据传递。
- 数据库层(
-
避免耦合:
- 若直接用
Entity给前端返回数据,会暴露数据库表结构(如主键、冗余字段); - 若用
DTO封装微服务通信数据,可隐藏内部实现(如敏感字段、业务逻辑)。
- 若直接用
-
优化性能:
DTO/VO可仅传递 “必要字段”,减少网络传输或内存消耗(如前端只需用户名和头像,无需返回整个用户表的 20 个字段)。
-
支持演化:
- 当数据库表结构变化时,只需修改
Entity; - 当前端页面需求变化时,只需修改
VO; - 各层独立修改,互不影响。
- 当数据库表结构变化时,只需修改
注意:是否使用这么复杂,看业务复杂程度(业务简单,设计复杂没必要,业务复杂,设计简单扩展性不足)
项目的具体结构:
|

最低0.47元/天 解锁文章
352

被折叠的 条评论
为什么被折叠?



