如何高效地架构一个Java项目

引言

        Java是企业级应用开发的主流语言之一,而我们作为使用Java语言的程序员,职称有初级、中级、高级、资深、经理、架构,但我们往往只是慢慢通过经验的积累迭代了自己的等级,如果没有保持学习的习惯,大多数程序员会停留在接近高级的位置,简单来讲就是CRUD工程师,小编不甘心于此,所以长期保持学习新知识的习惯,尝试很多大于自身能力的事情,我相信未来的某一天我会感谢曾经努力的自己,下面的内容是我在尝试架构项目时总结的经验,希望能帮助到大家

前期准备

  • 需求分析:明确项目的功能需求
  • 技术选型:
    • Java版本
      • 8,17
    • 框架选择
      • 应用:Spring,SpringBoot,SpringCloud
      • ORM(对象关系映射):JPA,MyBatis(Plus)
    • 数据库选择
      • 关系型:MySQL,PostgreSQL,Oracle
      • 非关系型:Redis,MongoDB
      • 时序数据库(物联网):TDengine,IoTDB
    • 构建工具
      • Maven,Gradle

项目结构设计

  • 分层架构
    • 认证授权
    • 控制层
    • 业务层
    • 数据层
  • 模块划分
    • 按功能划分
    • 按业务划分

简单示例

        跳过项目的功能需求分析(具体项目具体分析),技术选型,Java版本选择17,应用框架选择SpringBoot,ORM(对象关系映射)框架选择MyBatis-Plus,数据库选择MySQL 8.x,构建工具选择Maven,项目结构,拦截器中完成认证授权,控制层接收用户请求调用业务层的方法,业务层处理逻辑调用数据层的方法,数据层与数据库交互,跳过模块划分(具体项目具体分析)

准备开发环境

1.下载安装配置Java17

访问官方的下载地址:Java Archive Downloads - Java SE 17

1.下载并解压 

2.配置环境变量

我的电脑 -> 属性 -> 高级系统设置 -> 环境变量 ->系统变量(S) -> 新建(W)

双击系统变量(S)中的Path -> 新建(N) 

确定后打开命令提示符界面(快捷键 win+R 输入 cmd 回车),输入java -version命令查看是否安装成功

2.下载安装MySQL 8.x

访问官方的下载地址:MySQL :: Download MySQL Installer (Archived Versions)

参考文章:【MySQL8.0.39下载安装】_mysql8.0.39.0安装教程-CSDN博客 

架构项目

1.创建SpringBoot项目 

2.创建包/文件结构

3.认证与授权 

        首先确定使用什么标准和框架进行认证与授权,常见的标准有:OAuth 2.0,JWT,常见的框架有:Spring Security,Apache Shiro,我采用的是近几年很火的轻量级框架:SaToken,如何集成可以参考我的另一篇文章:Java集成Sa-Token进行认证与授权_基于satoken的 sop-CSDN博客

4.创建数据库、用户表(含索引)

DROP DATABASE IF EXISTS `muze`;
CREATE DATABASE `muze` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
USE `muze`;
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',username VARCHAR(30) COLLATE utf8mb4_0900_bin NOT NULL COMMENT '用户名',password VARCHAR(255) COLLATE utf8mb4_0900_bin NOT NULL COMMENT '密码',PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表';
CREATE INDEX idx_username ON t_user(username);

5.创建用户实体

        为了方便实体类的编写,我们引入依赖 - 小辣椒

<!-- 小辣椒 -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>
/*** 用户实体* @author muze*/
@Data
@TableName("t_user")
public class User implements Serializable {@Serialprivate static final long serialVersionUID = 684552117916625567L;/*** 主键*/@TableId(type = IdType.AUTO)private Long id;/*** 账号*/private String username;/*** 密码*/private String password;
}

6.创建用户数据层

       技术选型时数据库是MySQL,ORM(对象关系映射)框架是MyBatis-Plus,因此引入对应依赖

<!-- MySQL -->
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.33</version>
</dependency>
<!-- MyBatis-Plus -->
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.7</version>
</dependency>

在启动类上打MyBatis-Plus提供的@MapperScan("MyBatis Mapper 接口包路径"),自动扫描指定包下的 MyBatis Mapper 接口,并将它们注册为 Spring 容器中的 Bean

/*** 启动类* @author muze*/
@MapperScan("com.muze.project.mapper")
@SpringBootApplication
public class ProjectApplication {public static void main(String[] args) {SpringApplication.run(ProjectApplication.class, args);}}

在配置文件application.yml中添加数据库连接信息

spring:datasource:url: jdbc:mysql://localhost:3306/muze?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8username: 你的用户名password: 你的密码driver-class-name: com.mysql.cj.jdbc.Driver

用户数据层

/*** 用户数据层* @author muze*/
public interface UserMapper extends BaseMapper<User> {
}

7.创建用户业务层

        我习惯将业务层分离为接口层和实现层,所以我会在sevice包下创建一个impl包,如果你不习惯可以只编写实现层,编写用户登录方法前需要定义方法入参和返回值

入参:请求实体(用户名 + 密码)

返回值:登录结果

创建DTO(请求实体)

/*** 用户登录请求实体* @author muze*/
@Data
public class UserLoginDTO implements Serializable {@Serialprivate static final long serialVersionUID = -1706553212610156227L;/*** 用户名*/private String username;/*** 密码*/private String password;
}

用户登录业务接口层和实现层

/*** 用户业务接口层*/
public interface IUserService {/*** 登录* @param userLoginDTO 用户登录请求实体* @return 登录结果*/String login(UserLoginDTO userLoginDTO);
}
/*** 用户业务实现层* @author muze*/
@Service
public class UserServiceImpl implements IUserService {/*** 注入用户数据层*/@Autowiredprivate UserMapper userMapper;@Overridepublic String login(UserLoginDTO userLoginDTO) {// 取出用户名和密码String username = userLoginDTO.getUsername();String password = userLoginDTO.getPassword();// 构建查询条件LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<User>().eq(User::getUsername, username);// 查询用户User user = userMapper.selectOne(userLambdaQueryWrapper);// 如果用户为空或者输入密码与用户密码不匹配则返回:用户名或密码错误if (user == null || !password.equals(user.getPassword())) return "用户名或密码错误";// 使用SaToken的工具类StpUtil调用登录方法login,入参:用户idStpUtil.login(user.getId());// 返回:登录成功return "登录成功";}
}

8.创建用户控制层

        编写控制层前我们要先确定请求路径,请求方式,请求参数,响应数据

请求路径:/user/login

请求方式:POST

请求参数:用户名 + 密码

响应数据:响应码 + 响应消息 + 响应数据

DTO(请求实体)已经在编写用户业务层时创建好了

VO(响应实体)使用SaToken提供的SaResult

/*** 用户控制层*/
@RestController
@RequestMapping("/user")
public class UserLogin {/*** 注入用户业务接口层*/@Autowiredprivate IUserService userService;/*** 登录* @param userLoginDTO 用户登录请求实体* @return 响应码 + 响应消息 + 响应数据*/@PostMapping("/login")public SaResult login(@RequestBody UserLoginDTO userLoginDTO) {return SaResult.ok(userService.login(userLoginDTO));}
}

测试

编写sql语句新增一条用户信息用于测试登录

INSERT INTO t_user (username, password) VALUES ("muze", "123456");

启动项目,使用接口调试工具测试登录功能

端口默认为8080 

可以发现,Cookie中放入了一个令牌

 

        到此,一个拥有基础功能:登录,认证与授权的Java项目就架构完成了,后续就是按照功能需求划分模块进行开发了,希望能对你有所帮助!

彩蛋:你肯定也发现了,密码并没有进行加密解密,虽然在HTTPS协议中Post请求会对传输数据加密,但在HTTP协议中Post请求不会对传输数据加密,因此我们还应该对数据传输进行加密,小编会在后续更新一篇与数据加密相关的文章,敬请期待

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/62686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP 探秘之旅:从入门到未来

文章目录 导言&#xff1a;目录&#xff1a;第一篇&#xff1a;HTTP&#xff0c;互联网的“快递员”第二篇&#xff1a;从点开网页到看到内容&#xff0c;HTTP 究竟做了什么&#xff1f;第三篇&#xff1a;HTTP 的烦恼与进化史第四篇&#xff1a;HTTP 的铠甲——HTTPS 的故事第…

前端处理sql参数替换问题,即使有重复参数,也可以按顺序替换

我们可以创建一个通用的模板函数,能够处理任意SQL语句中的占位符替换。这个函数将接受两个参数: sqlTemplate:包含占位符的SQL模板字符串。params:一个对象数组,每个对象包含name和value,用于替换SQL模板中的占位符。通用模板函数 function replaceSqlPlaceholders(sqlT…

Fabric.js 中文文档

Fabric.js 中文文档 基于canvas画布的实用类Fabric.js的使用 4、Fabric.js 常用的方法&事件 Fabric.js 画布 defaultCursor 属性(1) 官网文档地址&#xff1a;http://fabricjs.com/docs/github 地址&#xff1a;https://github.com/fabricjs/fabric.js Demo地址&#x…

c++:thread(线程)

1.基本使用 1.1创建线程 join()函数用于&#xff1a;主程序等待子线程执行完毕之后再继续 #include <iostream> #include <thread>void printHello() {std::cout << "hello world" << std::endl; }int main() {// 1.创建线程std::thread …

第六届金盾信安杯-SSRF

操作内容&#xff1a; 进入环境 可以查询网站信息 查询环境url https://114.55.67.167:52263/flag.php 返回 flag 就在这 https://114.55.67.167:52263/flag.php 把这个转换成短连接&#xff0c;然后再提交 得出 flag

Spark优化--开发调优、资源调优、数据倾斜调优和shuffle调优等

针对Spark优化&#xff0c;我们可以从多个角度进行&#xff0c;包括开发调优、资源调优、数据倾斜调优和shuffle调优等。以下是一些具体的优化方法&#xff1a; 1. 开发调优 避免创建重复的RDD&#xff1a;对于同一份数据&#xff0c;只应该创建一个RDD&#xff0c;避免创建多…

PHP和GD库如何调整图片尺寸

PHP和GD库可以通过一系列函数调整图片的尺寸。以下是一个详细的步骤说明&#xff1a; 一、准备工作 检查GD库是否安装&#xff1a; 使用命令php -i | grep -i gd来检查GD库是否已经安装。如果返回类似于“GD Support > enabled”的内容&#xff0c;则表示安装成功。如果没有…

递归算法讲解(c基础)

递归的定义 递归是指在函数的定义中使用函数自身的方法。它是一种解决问题的策略&#xff0c;将一个大型复杂的问题逐步分解为规模更小的、与原问题相似的子问题来解决。当子问题的规模足够小&#xff0c;达到一个可以直接求解的基本情况&#xff08;也称为终止条件&#xff09…

有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。-多语言

目录 C 语言实现 Python 实现 Java 实现 Js 实现 题目&#xff1a;有一个已经排好序的数组。现输入一个数&#xff0c;要求按原来的规律将它插入数组中。 程序分析&#xff1a;首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的数,依次后移…

SpringMVC(2)

前言 这一节我们终结springmvc 1. SSM整合配置 先导入坐标 先创建包 配置类 然后开始创建jdbc的config和mybatis的config&#xff0c;还有properties SpringConfig&#xff1a; jdbc.properties&#xff1a; JdbcConfig: MybatisConfig: 下面开始spring整合mvc&#…

颜色分类

颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地 对它们进行排序&#xff0c;使得相同颜色的元素相邻&#xff0c;并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sort 函数…

零基础Python学习

1.环境搭建 1.1 安装运行环境python3.13 Welcome to Python.org 1.2 安装集成开发环境PyCharm PyCharm: the Python IDE for data science and web development 1.3 创建项目 && 设置字体 2.基础语法 2.1 常量与表达式 在python中整数除整数不会优化&#xff0c;所…

vue3项目创建方式记录

目录 创建vue3常用的方式有三种&#xff1a;一.使用vue cli创建二.使用vite创建三.使用vue3官方推荐创建方式&#xff08;create-vue&#xff09; 创建vue3常用的方式有三种&#xff1a; 一.使用vue cli创建 vue create 项目名二.使用vite创建 vite是下一代前端开发与构建工…

【无标题】JAVA策略模式代码例子

在Java中&#xff0c;您可以使用面向对象编程中的继承和多态性来实现您的需求。首先&#xff0c;我们定义一个Good类&#xff0c;该类包含满减策略和打折策略。然后&#xff0c;我们可以让Shoe类和Cloth类继承自Good类。为了实现不同的折扣或满减策略&#xff0c;可以考虑使用策…

cocos creator 触摸事件官方案例

cocos creator 触摸事件官方案例 1、官方示例&#xff1b; 2、对官方示例的总结&#xff1a; &#xff08;1&#xff09;介绍了鼠标事件和触摸事件的类型&#xff0c;这里主要关注的是在移动端和PC端都可以触发的触摸事件。 &#xff08;2&#xff09;节点事件的派发&#…

用MATLAB符号工具建立机器人的动力学模型

目录 介绍代码功能演示拉格朗日方法回顾求解符号表达式数值求解 介绍 开发机器人过程中经常需要用牛顿-拉格朗日法建立机器人的动力学模型&#xff0c;表示为二阶微分方程组。本文以一个二杆系统为例&#xff0c;介绍如何用MATLAB符号工具得到微分方程表达式&#xff0c;只需要…

Mongodb入门到放弃

Mongodb分片概括 分片在多台服务器上分布数据的方法&#xff0c; Mongodb使用分片来支持具有非常大的数据集和高吞吐量的操作的部署 具有大数据集和高吞吐量应用程序的数据库系统&#xff0c;可以挑战单台服务器的容量。 例如&#xff0c;高查询率可以耗尽服务器的cpu容量&…

SpringAi整合大模型(进阶版)

进阶版是在基础的对话版之上进行新增功能。 如果还没弄出基础版的&#xff0c;请参考 https://blog.csdn.net/weixin_54925172/article/details/144143523?sharetypeblogdetail&sharerId144143523&sharereferPC&sharesourceweixin_54925172&spm1011.2480.30…

Android电视项目焦点跨层级流转

1. 背景 在智家电视项目中&#xff0c;主要操作方式不是触摸&#xff0c;而是遥控器&#xff0c;通过Focus进行移动&#xff0c;确定点击进行的交互&#xff0c;所以在电视项目中焦点、选中、确定、返回这几个交互比较重要。由于电视屏比较大&#xff0c;在一些复杂页面中会存…

Mysql高可用架构方案

Mysql 介绍 Mysql是典型的开源关系型数据库&#xff0c;是许多网站、应用程序、企业软件产品的首选数据库。 Mysql特性&#xff1a; 易于使用&#xff0c;功能强大&#xff0c;支持事务、触发器、存储过程管理工具多种多样且功能丰富可以作为千万级数据管理的大型数据库采用…