JavaEE第一个项目流程:博客系统

目录

一、数据库表设计:关系表和实体表

二、创建项目(项目的准备):

配置配置文件:

准备前端代码部分:

三、项目的相关代码:

各实体类的定义与核心作用:

1. POJO(Plain Old Java Object)

2. Entity / PO(Persistent Object,持久化对象)

3. Model(模型)

4. DO(Domain Object,领域对象)

5. DTO(Data Transfer Object,数据传输对象)

6. VO(View Object,视图对象)

7. VTO(Transfer Object,传输对象)

8. BO(Business Object,业务对象)

为什么需要这么多实体类?

项目的具体结构:

1. 通用组件模块(common)

(1)全局异常处理:ExceptionAdvice

ExceptionAdvice:

BlogException:

(2)统一响应包装:ResponseAdvice

(3)登录拦截器:LoginInterceptor

(4)拦截器配置:WebConfig

(5)工具类

SecurityUtils:

JwtUtils:

登录的传统思路:

集群环境下⽆法直接使⽤Session. 原因分析:

主从集群和分布式存储:

DateUtils:

BeanTransformUtils:

2. 常量与枚举(constant + enums)

(1)Constants 常量类

(2)ResultCodeEnum 枚举

3. 统一响应格式:Result

4. 控制器层(controller)

(1)BlogController(博客接口)

(2)UserController(用户接口)

5. 数据访问层(mapper)

6. 实体类(pojo)

(1)数据对象(dataobject)—— 对应数据库表

(2)请求对象(request)—— 前端传入参数封装

(3)响应对象(response)—— 后端返回数据封装

7. 业务逻辑层(service)

(1)BlogService 业务

(2)UserService 业务

四、核心业务流程示例

五、项目特点与可优化点

1. 项目特点

2. 可优化点

六、总结

  1. 需求评审
  2. 方案设计(数据库设计,接口设计,架构设计,概念设计,详细设计,上线计划)
  3. 设计评审,排期->同步给产品经理,提测
  4. 开发+自测
  5. 提测+联调
  6. 上线

这其中开发阶段重要的是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 开发中,ModelEntityPOJOVOVTODODTOBO 等实体类是分层架构下的不同数据载体,各自承担特定职责。以下是它们的核心含义及分层设计的必要性:

各实体类的定义与核心作用:

1. POJO(Plain Old Java Object)
  • 含义:简单 Java 对象,仅包含属性、getter/setter 和基本方法,不依赖任何框架特定类或接口(如不继承 Serializable、不实现 Entity 等)。
  • 作用:是所有轻量级数据容器的 “基类”,PODTOVO 等本质上都是 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,业务对象)
  • 含义:封装跨实体的复杂业务逻辑,协调多个 PODO 或服务的操作。
  • 作用:在 Service 层处理 “跨领域” 逻辑(如订单创建需同时校验库存、用户余额、物流状态)。
  • 特点:可能包含多个 PO 或 DO 的引用,是业务逻辑的 “组合器”。

为什么需要这么多实体类?

核心目的是通过 “分层解耦” 提升代码的可维护性、扩展性和安全性,避免 “一个类走天下” 导致的职责混乱。具体原因如下:

  1. 隔离关注点

    • 数据库层(Entity/PO)只关心表结构映射;
    • 业务层(DO/BO)只关心业务规则;
    • 表现层(VO)只关心前端展示;
    • 传输层(DTO/VTO)只关心数据传递。
  2. 避免耦合

    • 若直接用 Entity 给前端返回数据,会暴露数据库表结构(如主键、冗余字段);
    • 若用 DTO 封装微服务通信数据,可隐藏内部实现(如敏感字段、业务逻辑)。
  3. 优化性能

    • DTO/VO 可仅传递 “必要字段”,减少网络传输或内存消耗(如前端只需用户名和头像,无需返回整个用户表的 20 个字段)。
  4. 支持演化

    • 当数据库表结构变化时,只需修改 Entity
    • 当前端页面需求变化时,只需修改 VO
    • 各层独立修改,互不影响。

注意:是否使用这么复杂,看业务复杂程度(业务简单,设计复杂没必要,业务复杂,设计简单扩展性不足)

项目的具体结构:

  • com.jqq.springblogdemo(项目根包)
    • common(通用组件:全局异常、统一响应、配置、拦截器、工具类等)
      • advice(增强处理:全局异常、统一响应)
        • ExceptionAdvice.java(全局异常处理器)
        • ResponseAdvice.java(统一响应包装器)
      • config(配置类)
        • WebConfig.java(Spring MVC 配置:拦截器注册)
      • enums(枚举类)
        • ResultCodeEnum.java(响应状态码枚举)
      • exception(自定义异常)
        • BlogException.java(业务异常类)
      • interceptor(拦截器)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值