Featured image of post java学习

java学习

Java后端开发入门知识

创建日期:
最后修改:

“Work! ”

Java学习相关顺序


学习思路

学习完java基础之后,先学习mysql,然后稍微了解一下javaweb的层,直接去学习springboot,学完了然后往前学ssm,理解为什么springboot淘汰了以前的ssm框架,然后再往前学javaweb,理解框架的好处。这样每个学习都有目标,不至于说学习了javaweb,然后学习ssm的时候觉得之前学习的东西都白学了,学习springboot,觉得ssm白学了。 等这一套学习了完了之后,去学习设计模式,了解设计思想。然后再去学习数据结构,了解底层。最后才是jvm 从入门,到实际开发,一开始给你成就感,让你有动力继续学习下去,而不是从javaweb开始,盼着早日学到springboot,我就能够出去找工作了。
还有一点,springboot相较与javaweb和ssm,会简单很多,毕竟springboot约定大于配置。

java语言方面常规八股要熟,那些java的集合,重点背hashmap八股吧,jvm类加载机制,运行时分区,垃圾回收算法,垃圾回收器CMS、G1这些,各种乐观锁悲观锁,线程安全,threadlocal这些。 在进阶一些的比如jvm参数,内存溢出泄漏排查,jvm调优。我这里说的只是冰山一角,详细八股可以去网上找,这不用去买,都免费资源。mysql、redis可以去看小林coding, 我看你简历上写了,你一定要熟,什么底层b+树、索引结构、innodb、mvcc、undo log、redo log、行级锁表级锁,这些东西高频出现,如果面试官问我这些我都能笑出来。消息队列rabbitmq也好kafka也好,学一种就行, 什么分区啊副本啊确认机制啊怎么保证不重复消费、怎么保证消息不丢失这些基本的一定要会,进阶一点的比如LEO、高水位线、kafka和rocketmq底层零拷贝的区别等等。计算机网络和操作系统既然你是科班应该理解起来问题不大,去看小林coding这两块吧,深度够了。 spring boot的八股好好看看吧,一般字节腾讯不这么问,其他的java大厂挺爱问的,什么循环依赖啥的去网上看看。数据结构的话科班应该问题不大,多去力扣集中突击刷题吧。 项目还是结合八股来,想一想你写的这些技术会给你挖什么坑。除此之外,还有场景题、rpc、设计模式、linux命令、ddd等。不会的就别往简历上写了,虽然技术栈很多的话好看些,但背起来确实累。总结一下,多去实习吧,多跳槽,直到跳到一个不错的中厂做跳板,这是一条可行的进大厂的路线。 找个小厂的工作的话,没必要全都照这些准备,重点放在框架的使用和一些基础八股吧。

java架构层次

  • pojo(或entity):实体类
  • util:工具类
  • service:代码逻辑
  • mapper:数据库接口层
  • web:

表现层(servlet,SpringMVC) 业务层() 数据层(JDBC,MyBatis)

创建接口后,在接口中定义方法,在接口的实现类中实现方法

spring MVC(表现层框架)

导jar包
创建SpringMVC控制类
创建SpringMVC配置类
方法前加@controller
设置访问路径@requestmapping("/aaa")
@responsebody
get请求与post请求
rest代码风格
查询get
添加post
修改put
删除delete

静态资源放行tomcat处理

SSM整合

  • spring
    • springConfig
  • mybatis
    • mybatisConfig
    • jdbcConfig
    • jdbc.properties
  • SpringMVC
    • servletConfig
    • SpringMVCConfig

功能模块

  • 表与实体类
  • dao(接口+自动代理)
  • service(接口+实现类)
    • 业务层接口测试(整合JUnit)
  • controller
    • 表现层接口测试(PostMan)

表现层数据封装规范
异常处理器
表现层 → 业务层:表现层接收用户请求,调用业务层的接口处理请求。
业务层 → 持久层:业务层通过调用持久层的接口(如Repository)来访问和操作数据库。
持久层 → 数据库:持久层通过JPA、MyBatis或JDBC等技术与数据库进行交互。

  • 简单的流程示例:
    • 用户通过浏览器发起HTTP请求。
    • 控制器(Controller)接收请求,调用业务层(Service)的方法。
    • 业务层(Service)处理逻辑,并可能调用持久层(Repository)进行数据库操作。
    • 持久层(Repository)查询数据库或更新数据。
    • 业务层(Service)将结果返回给控制器(Controller)。
    • 控制器(Controller)将结果传递给视图层(View),并最终展示给用户。

MyBatisPlus

新增
删除
修改
根据id查询
查询全部
分页查询(配置拦截器)
按条件查询
代码生成器(快速搭建框架)

项目描述:

瑞吉外卖是一款专门为餐饮企业(餐厅、饭店)定制的软件产品,包括系统管理后台和移动端应用两部分。系统管理后台主要提供给餐饮企业内部员工使用,用于对餐厅的分类、菜品、套餐、订单、员工等进行管理维护。移动端应用主要提供给消费者使用,可以在线浏览菜品、添加购物车、下单等。

  • 开发环境: 环境(软件): JDK +MySQL +IDEA+Git+Tomcat
    技术: Spring Boot、SSM、Mybatis Plus、Spring Security、Redis、Spring Cache、Swagger、Linux、ShardingJDBC、Nginx
  • 责任描述:
    • 负责系统管理后台的员工、分类、菜品、套餐模块的编写。
    • 负责移动端应用的开发,实现短信验证码登录功能。
    • 开发移动端应用的菜品浏览功能,使用户可以方便地浏览菜品信息。
    • 实现移动端应用中用户地址簿信息的管理功能,方便用户管理收货地址。
    • 开发移动端应用的购物车功能,使用户可以方便地添加菜品到购物车并管理订单。
    • 实现移动端应用中提交订单的功能,确保用户能够成功下单。
    • 进行移动端应用的数据展示缓存优化,提高系统的响应速度和用户体验。
    • 负责数据库主从配置以及读写分离的实现,提高数据库的性能和可靠性。
    • 实现项目接口API文档生成功能,使用Swagger生成清晰明了的接口文档。
  • 技术描述:
    • 使用Redis缓存高频数据,并使用Spring Cache优化代码,提高系统的性能和响应速度。
    • 在整个开发过程中使用Linux系统进行部署,充分利用Linux系统的稳定性和安全性。
    • 使用Nginx部署前端项目,实现前后端分离的部署方式,提高系统的灵活性和可维护性。
    • 使用Nginx实现反向代理和负载均衡,提高系统的并发处理能力和可用性。
    • 使用ShardingJDBC实现数据库读写分离,提高数据库的读取性能和写入性能。
    • 使用Spring Security框架进行权限模块的开发,采用经典的RBAC模型进行精细的权限管理。
    • 使用YApi实现前后端分离开发,并使用Swagger生成接口API文档,提高团队的协作效率。
    • 使用Git进行项目的版本控制和代码管理,充分利用分支功能进行项目优化和问题修复。

Controller 接收请求,调用 Service 层处理业务逻辑。
Service 层调用 Mapper 层进行数据库操作。
Mapper 层操作 Entity 对象,与数据库交互。
DTO 用于在 Controller 和 Service 之间传递数据。
Utils 和 Common 提供通用的工具和常量,供其他层级使用。
Config 定义全局配置,Filter 处理请求和响应的拦截逻辑。

  • common:
    • 功能:存放项目中通用的工具类、常量、枚举、异常处理等。
    • 示例:自定义异常类、全局常量、通用工具类等。
  • config:
    • 功能:存放项目的配置类,用于配置Spring Boot应用的各种行为。
    • 示例:数据库配置、安全配置、Swagger配置、自定义Bean配置等。
  • controller:
    • 功能:负责处理HTTP请求,接收前端传递的参数,调用Service层处理业务逻辑,并返回结果。
    • 示例:RESTful API接口、请求参数校验、返回JSON数据等。
  • dto:
    • 功能:存放数据传输对象(Data Transfer Object),用于在不同层之间传递数据,通常用于封装请求和响应的数据。
    • 示例:前端传递的请求参数封装、返回给前端的响应数据封装等。
  • entity:
    • 功能:存放与数据库表对应的实体类,通常使用JPA或MyBatis等ORM框架进行映射。
    • 示例:数据库表的实体类,包含字段、getter/setter方法等。
  • filter:
    • 功能:存放过滤器类,用于在请求到达Controller之前或响应返回客户端之前进行一些处理,如日志记录、权限校验等。
    • 示例:自定义过滤器、拦截器等。
  • mapper:
    • 功能:存放与数据库交互的接口或类,通常使用MyBatis或JPA进行数据库操作。
    • 示例:MyBatis的Mapper接口、JPA的Repository接口等。
  • service:
    • 功能:负责业务逻辑的处理,通常被Controller层调用,并调用Mapper层进行数据持久化操作。
    • 示例:业务逻辑处理、事务管理、调用Mapper层接口等。
  • utils:
    • 功能:存放项目中常用的工具类,提供一些通用的方法供其他模块调用。
    • 示例:日期处理工具类、字符串处理工具类、加密解密工具类等。

后端代码部署tomcat
前端代码部署nginx

docker相关配置与命令

docker源:

1
2
3
4
5
6
7
8
"https://registry.docker-cn.com",
"http://f1361db2.m.daocloud.io",
"https://dockerhub.azk8s.cn",
"https://docker.mirrors.ustc.edu.cn",
"https://ud6340vz.mirror.aliyuncs.com",
"https://reg-mirror.qiniu.com",
"https://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com"
  • docker自定义tag:
1
docker tag local-image:tagname new-repo:tagname
  • docker镜像上传到hub:
1
docker push new-repo:tagname
  • 查看容器ip:
1
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-slave
  • 创建Docker网络
1
docker network create mysql-net
  • 查看所有网络:
1
docker network ls
  • 删除对应网络:
1
docker network rm my_net
  • 进入容器内部:
1
docker exec -it <container> bash
  • 启动redis容器:
1
docker run --name docker-redis -it -p 6379:6379 -v /data/redis-data  ayljzj/redis:7.4.2 --requirepass "123456"
  • 启动mysql容器:
1
docker run --name mysql- -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d ayljzj/mysql:8.0.41

rabbitmq

创建一个目录用于挂载 RabbitMQ 数据: mkdir -p /usr/local/docker/rabbitmq 启动 RabbitMQ 容器 使用以下命令启动一个新的 RabbitMQ 容器:

1
docker run -id --name=rabbitmq --network rabbit -v /usr/local/docker/rabbitmq:/var/lib/rabbitmq -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=123456 ayljzj/rabbitmq:3.8-management

在这条命令中,我们做了以下配置:

  • -id:以交互模式启动容器并在后台运行。
  • –name=rabbitmq:为容器指定一个名称。
  • -v /usr/local/docker/rabbitmq:/var/lib/rabbitmq:将主机目录挂载到容器内的 /var/lib/rabbitmq,用于持久化数据。
  • -p 15672:15672:映射 RabbitMQ 管理页面端口。
  • -p 5672:5672:映射 RabbitMQ 消息接收端口。
  • -e RABBITMQ_DEFAULT_USER=admin:设置默认用户名。
  • -e RABBITMQ_DEFAULT_PASS=admin:设置默认密码。

CentOs下redis设置

中文官网
进入路径:/usr/local/redis-4.0.0/src
运行命令:src/redis-server ./redis.conf
修改为后台运行:/usr/local/redis-4.0.0/redis.conf
配置修改:daemonize yes
密码:123456
退出:redis-cli -h 你的IP地址 -p 你的redis端口号 shutdown
设置允许远程链接:127.0.0.1添加注释#
./redis-cli.exe -h 192.168.179.135 -p 6379 -a 123456
centOs关闭防火墙:firewall-cmd –zone=public –add-port=6379/tcp –permanent
centOs重启防火墙:firewall-cmd –reload
centOs关机:shutdown -h now

redis

启动数据库:systemctl start mysqld
update user set authentication_string=passworD(“root”) where user=‘root’;
–name:容器名称
-p 6379:6379 将端口设置为6379
-it参表示控制台显示Redis安装的交互信息
如果后台运行,用-d参数
-v /data/redis-data 将redis数据挂载到根目录的 /data/redis-data 目录下
-v $PWD/data/redis-data 将redis数据挂载到当前目录的data/redis-data 目录下
–requitepass “123456” : 指定redis连接密码,此参数要放在镜像名后面

Nginx

安装依赖:yum -y install gcc pcre-devel zlib-devel openssl openssl-devel

docker cp nginx:/var/log/nginx C:\afordocker\nginx\log docker cp nginx:/usr/share/nginx/html C:\afordocker\nginx
docker cp nginx:/etc/nginx/nginx.conf C:\afordocker\nginx\conf docker cp nginx:/etc/nginx/conf.d C:\afordocker\nginx\conf\conf.d

docker run -d –name nginx -p 8880:80
-v C:\afordocker\nginx\conf\nginx.conf:\etc\nginx\nginx.conf
-v C:\afordocker\nginx\conf\conf.d:\etc\nginx\conf.d
-v C:\afordocker\nginx\log\log:\var\log\nginx
-v C:\afordocker\nginx\log\html:\usr\share\nginx\html
–privileged=true ayljzj/nginx:1.24.0

Windows下docker的Mysql(5.7)主从辅助(一主一从)

1、拉取Mysql镜像

1
docker pull mysql:5.7

2、启动Mysql容器

  • 先启动mysql-master容器:(即之后的主机)
1
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql-master ayljzj/mysql:5.7
  • 先启动mysql-slave容器:(即之后的从机)
1
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql-slave ayljzj/mysql:5.7

命令解释:

  • -d: 后台运行容器,并返回容器ID
  • -p 3307:3306 :将容器的3306端口映射到宿主机3307端口
  • –name mysql-slave:将容器命名为mysql-slave
  • -e MYSQL_ROOT_PASSWORD=123456 :配置数据库连接密码
  • ayljzj/mysql:5.7:使用该镜像

3、编写主从复制文件

对主库文件进行如下配置:

找到file中的/etc/my.cnf文件,将以下内容复制进去

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[mysqld]
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库 需要复制的主数据库名字
binlog-do-db=testdb
#设置logbin格式
binlog_format=STATEMENT

对从库文件进行如下配置:

找到file中的/etc/my.cnf文件,将以下内容复制进去

1
2
3
4
#从服务器唯一ID,必须要与主服务器不同
server-id=2
#启用中继日志
relay-log=mysql-relay

4、搭建主从复制

4.1、主机设置

进入主机容器:

1
docker exec -it mysql-master bash

连接容器:

1
mysql -uroot -p123456

4.2、主机上建立帐户并授权(slave)

给从机授权,为了让从机能够和主机连接起来。 创建账户:slave,设置密码:123456

1
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

对slave账户进行授权

1
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';

或者二者代码写为一行:

1
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';

GRANT REPLICATION SLAVE ON . TO ‘slave’@’%’ IDENTIFIED BY ‘123456’;

4.3、查询master状态

1
show master status; #查询master的状态

记录出现的File和Position的值,后续要用
注意:此步骤后不要再操作主服务器MySQL,防止主服务器状态值变化!

4.4、从机设置

进入从机容器:

1
2
docker exec -it mysql-slave bash
mysql -uroot -p123456

进入容器后输入以下命令:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
CHANGE MASTER TO MASTER_HOST='主机的ip地址',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_PORT=3306, 
MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=438;
#解释:
# 	CHANGE MASTER TO MASTER_HOST='主机的IP地址',
#	MASTER_USER='slave'(刚刚配置的用户名),
#	MASTER_PASSWORD='123456'(刚刚授权的密码),
#	master_port=主机开放的端口 我这里是3310端口,
#	MASTER_LOG_FILE='mysql-bin.具体数字',MASTER_LOG_POS=具体值(之前的Position);

若在这里出现错误,先执行完下面两条命令重置:

1
2
stop slave;
reset master;

完成后,启动从服务器复制功能

1
start slave;

查看从服务器状态

1
show slave status\G

观察输出的结果,下面两个参数都是Yes,则说明主从配置成功!
Slave_IO_Running: Yes,Slave_SQL_Running: Yes

最后更新于 2025-05-19 12:16