• 实用工具 小学数学练习 字帖生成 在线画板 函数绘制 拼音字母表 在线词典 黄历查询 中国历史 Excel函数 模拟请求 json格式化
  • 最新更新
  • 全站导航
  • 登陆/注册
  • 原创投稿
名师互学网
  • 知识解答知识解答
  • 合同文书合同文书
  • 教育问答教育问答
  • 最新资讯最新资讯
  • 学术期刊学术期刊
  • 资料下载资料下载
高考报名时间2022年11月1日还剩 天 距离2023年6月7日高考还有 天
  • 网站首页
  • 小学
  • 初中
  • 高中
  • 语言
  • 会计
  • 驾考
  • 学历
  • 司法
  • IT
  • 医护
  • 建筑
  • 作文
栏目分类:
  • 前沿技术
  • 软件开发
  • 系统运维
  • 产品运营
  • 生活办公
  • 面试经验
  • 考试题库
子分类:
  • 人工智能
  • 大数据
  • 云计算
  • 区块链
  • 物联网
  • 深度学习
  • 机器学习
  • NLP
  • 计算机视觉
  • 语音识别
  • 其他
  • 大数据系统
  • 数据可视化
  • 数据挖掘与分析
  • 其他
  • Docker/k8s
  • 虚拟化
  • 云平台
  • 其他
  • 基本原理
  • 数字货币
  • 智能合约
  • EOS应用
  • 其他
  • 通讯技术
  • 嵌入式开发
  • 单片机
  • 物联网应用
  • HarmonyOS
  • 其他
  • 后端开发
  • Web开发
  • 移动开发
  • 游戏开发
  • Python
  • Java
  • 架构设计
  • C/C++/C#
  • PHP
  • .Net
  • Go语言
  • R语言
  • asp
  • Html/CSS
  • 易语言
  • JavaScript
  • 汇编语言
  • Vue.js
  • React.JS
  • Ruby开发
返回
名师互学网
名师互学网用户登录
名师互学网
快速导航关闭
当前搜索
当前分类
前沿技术 软件开发 系统运维 产品运营 生活办公 面试经验 考试题库
子分类
人工智能 大数据 云计算 区块链 物联网 深度学习 机器学习 NLP 计算机视觉 语音识别 其他 大数据系统 数据可视化 数据挖掘与分析 其他 Docker/k8s 虚拟化 云平台 其他 基本原理 数字货币 智能合约 EOS应用 其他 通讯技术 嵌入式开发 单片机 物联网应用 HarmonyOS 其他 后端开发 Web开发 移动开发 游戏开发 Python Java 架构设计 C/C++/C# PHP .Net Go语言 R语言
实用工具
学习工具 小学数学练习 字帖生成 在线画板 函数绘制 拼音字母表 在线词典 黄历查询 亲戚关系计算 安全期计算 中国历史 Excel函数 模拟请求 json格式化 浏览器指纹
热门搜索
路由器设置 木托盘 宝塔面板 儿童python教程 心情低落 朋友圈 vim 双一流学科 专升本 我的学校 日记学校 西点培训学校 汽修学校 情书 化妆学校 塔沟武校 异形模板 西南大学排名 最精辟人生短句 6步教你追回被骗的钱 南昌大学排名 清朝十二帝 北京印刷学院排名 北方工业大学排名 北京航空航天大学排名 首都经济贸易大学排名 中国传媒大学排名 首都师范大学排名 中国地质大学(北京)排名 北京信息科技大学排名
名师互学网 > IT > 软件开发 > 后端开发 > Java

学习笔记(狂神SpringBoot全部笔记及员工管理系统整合数据库版)

Java 更新时间:2026-04-01 22:18:11 发布时间:1551天前 IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

学习笔记(狂神SpringBoot全部笔记及员工管理系统整合数据库版)

学习网站:https://www.bilibili.com/video/BV1PE411i7CV

学习笔记源码:https://gitee.com/zy-hao/StudySpringBoot

SpringBoot基本概念:

  • 简化配置:Springboot是对Spring的进一步封装,基于注解开发,舍弃了笨重的xml配置,使用yml或者properties配置
  • 产品级独立运行:每一个工程都可以打包成一个jar包,内置了Tomcat和Servlet容器,可以独立运行
  • 强大的场景启动器:每一个特定场景下的需求都封装成了一个starter,只要导入了这个starter就有了这个场景所有的一切
一、Hello World 1、环境
  • JDK
  • Maven
  • MySQL
  • SpringBoot
2、Idea中创建

选择spring initalizr,初学勾选Web即可

3、启动
  • 必须和主启动类在同一级目录下创建包和方法才能生效,这里创建包controller并创建一个JavaController类
@RestController
public class HelloWordController {

    
    @RequestMapping("/hello")
    public String hello() {
        return "hello world";
    }
}

  • 来到主启动类右击鼠标点击运行后来到浏览器中地址栏输入http://localhost:8080/hello即可访问。
4、打包
  • 在idea右边的工具栏中点击Maven 选择要打包的微服务点击LifeCycle选择package打包发布(target中就会出现xxx.jar包,显示打包成功)
二、原理 1、依赖
  • 主要是是依赖一个父项目,是管理项目的资源过滤及插件!

    org.springframework.boot
    spring-boot-starter-parent
    2.2.6.RELEASE
    


  • 点spring-boot-starter-parent进去看,就会看到官方配置好的依赖和资源版本号

    org.springframework.boot
    spring-boot-dependencies
    2.2.5.RELEASE
    ../../spring-boot-dependencies

  • 这里才是真正管理SpringBoot应用里面所有依赖版本的地方,SpringBoot的版本控制中心;
2、启动器
  • SpringBoot将所有的功能场景都抽取出来,做成一个个的starter (启动器),只需要在项目中引入这些starter即可,所有相关的依赖都会导入进来 , 我们要用什么功能就导入什么样的场景启动器即可 ;我们未来也可以自己自定义 starter;

springboot-boot-starter-xxx:就是spring-boot的场景启动器


    org.springframework.boot
    spring-boot-starter-web


3、主启动类
//@SpringBootApplication 来标注一个主程序类
//说明这是一个Spring Boot应用
@SpringBootApplication
public class SpringbootApplication {
   public static void main(String[] args) {
     //以为是启动了一个方法,没想到启动了一个服务
      SpringApplication.run(SpringbootApplication.class, args);
   }
}

3.1、@SpringBootApplication

  • 作用:标注在某个类上说明这个类是SpringBoot的主配置类 , SpringBoot就应该运行这个类的main方法来启动SpringBoot应用;

我们点进去看一下

3.2、@ComponentScan

  • 作用:自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中

3.3、@SpringBootConfiguration

  • 作用:SpringBoot的配置类 ,标注在某个类上 , 表示这是一个SpringBoot的配置类;

我们继续点进去看一下

这里的 @Configuration,说明这是一个配置类 ,配置类就是对应Spring的xml 配置文件;

3.3、@EnableAutoConfiguration

作用:开启自动配置功能

以前我们需要自己配置的东西,而现在SpringBoot可以自动帮我们配置 ;@EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效;

点进注解接续查看:


@AutoConfigurationPackage :自动配置包

@import :Spring底层注解@import , 给容器中导入一个组件

Registrar.class 作用:将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring容器 ;

这个分析完了,退到上一步,继续看

@import({AutoConfigurationimportSelector.class}) :给容器导入组件 ;

我们继续点进去看一下AutoConfigurationimportSelector,有如下的一个类

上面的这个方法又调用了 SpringFactoriesLoader 类的静态方法!我们进入SpringFactoriesLoader类loadFactoryNames() 方法

我们继续点击查看 loadSpringFactories 方法

发现一个多次出现的文件:spring.factories,全局搜索它

spring.factories

我们在上面的自动配置类随便找一个打开看看,比如 :WebMvcAutoConfiguration

可以看到这些一个个的都是JavaConfig配置类,而且都注入了一些Bean,可以找一些自己认识的类,看着熟悉一下!

所以,自动配置真正实现是从classpath中搜寻所有的meta-INF/spring.factories配置文件 ,并将其中对应的 org.springframework.boot.autoconfigure. 包下的配置项,通过反射实例化为对应标注了 @Configuration的JavaConfig形式的IOC容器配置类 , 然后将这些都汇总成为一个实例并加载到IOC容器中。

结论:
  • SpringBoot在启动的时候从类路径下的meta-INF/spring.factories中获取EnableAutoConfiguration指定的值

  • 将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;

  • 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中;

  • 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;

  • 有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;

三、yml配置注入 1、对比传统xml语法是以标记语言为中心

    8081


2、yml配置以数据为中心
server:
  prot: 8080
  servlet:
    # 原先的Tomcat工程路径在这里修改
    context-path: /laosong      

3、yml语法
  • 空格不能省略,键值对中间必须要有一个空格
  • 以缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。
  • 属性和值的大小写都是十分敏感的。
4、yml配置bean属性,导入依赖
  • 依赖

    org.springframework.boot
    spring-boot-configuration-processor
    true


  • 创建一个application.yml

  • @ConfigurationProperties(prefix = “person”)默认是从全局配置获取,文件名只能是application.yml

  • 测试

// 3 编写测试类
@SpringBootTest
class DemoApplicationTests {
    @Autowired
    Person person;
    @Test
    void personTest() {
        System.out.println(person);
    }
}

5、yml可以安装的位置
  • file:./config和file:./config
  • file:config/appplication.yml
  • file:application.yml
  • resources:/config/application.yml
  • resources:application.yml
    执行的优先级依次递减:
四、Web开发 1、静态资源的位置

优先级:resources > static(默认) > public

2、Thymeleaf

template @-webkit-keyframes chartjs-render-animation { from { opacity: 0.99 } to { opacity: 1 } } @keyframes chartjs-render-animation { from { opacity: 0.99 } to { opacity: 1 } }

   
2、国际化
  • Idea中setting中“file-encoding”修改项目编码、配置文件编码均为“utf-8”,否则配置文件中文会显示乱码

  • resources下配置i18n文件,index.html前端页面使用th:text="#{login.btn}"等接收配置文件里的参数

    login.properties
login.btn=登录
login.password=密码
login.remember=记住我
login.tip=请登录
login.username=用户名

在启动类的同级目录下创建config软件包

编写MyLocalResolver

package com.zhu.config;

import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Locale;

//国际化
public class MyLocaleResolver implements LocaleResolver {
    //解析请求
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        //获取请求中的语言参数
        String lan = request.getParameter("l");
        Locale locale = Locale.getDefault(); //如果没有就使用默认的
        
        //如果请求的链接携带了国际化的参数
        if (!StringUtils.isEmpty(lan)) {
            String[] split = lan.split("_");
            //国家,地区
            locale = new Locale(split[0], split[1]);
        }
        return locale;
    }

    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
    }
}

MyMvcConfig

package com.zhu.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;


@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/index.html").setViewName("index");
        registry.addViewController("/main.html").setViewName("dashboard");
    }

    //自定义的国际化组件就生效了
    @Bean
    public LocaleResolver localeResolver() {
        return new MyLocaleResolver();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginHandlerInterceptor())
                .addPathPatterns("
public class LoginHandlerInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //登录成功之后,应该有用户的session
        Object loginUser = request.getSession().getAttribute("loginUser");

        if (loginUser == null) {
            //没有登录,而是直接进入的首页,肯定是不让进的
            request.setAttribute("msg", "没有权限,请先登录");
            request.getRequestDispatcher("/index.html").forward(request, response);
            return false;
        } else {
            return true;
        }
    }
}
4、CRUD
  • 这里我链接的数据库和狂神原版视频不太一样,请参考一下文章内容

  • 创建数据库
create table department
(
    id    int         not null
        primary key,
    dname varchar(20) not null
);

create table employee
(
    id       int auto_increment
        primary key,
    ename    varchar(50) not null,
    email    varchar(50) null,
    gender   int         null,
    birthday datetime    null,
    did      int         null
);
  • 配置yml’
spring:
  thymeleaf:
    cache: false
  messages:
    basename: i18n.login
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: root
    url: jdbc:mysql://127.0.0.1:3306/springbootweb?useUnicode=true&characterEncoding=UTF-8&useSSL=true&serverTimezone=UTC

mybatis:
  type-aliases-package: com.zhu.pojo
  mapper-locations: classpath:com/zhu/mapper/*.xml

导入依赖

 
            org.projectlombok
            lombok
            1.18.22
        

        
            org.springframework.boot
            spring-boot-starter-test
            2.6.1
        

        
            org.springframework.boot
            spring-boot-starter-jdbc
            2.6.1
        

        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            2.2.0
        

        
            mysql
            mysql-connector-java
            8.0.25
        

实体类

Department

package com.zhu.pojo;


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
//部门表
public class Department {
    private Integer id;
    private String dname;
}

Employee

package com.zhu.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@NoArgsConstructor
@AllArgsConstructor
//员工表
public class Employee {
    private Integer id;
    private String ename;
    private String email;
    private Integer gender;
    private int did;
    private String birthday;
    private String dname;
}

实现类接口

DepartmentMapper

package com.zhu.mapper;

import com.zhu.pojo.Department;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@Mapper
public interface DepartmentMapper {
    //获得所有部门信息
    List getAll();

    //通过ID的到部门
    int getIdByDname(@Param("dname") String dname);
}

EmployeeMapper

package com.zhu.mapper;

import com.zhu.pojo.Employee;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@Mapper
public interface EmployeeMapper {
    //查询全部的员工信息
    List getAll();

    //通过ID查询员工
    Employee getEmployeeById(@Param("id") int id);

    //通过ID删除员工
    int delete(@Param("id") int id);

    //增加一个员工
    int save(Employee employee);

    //修改员工
    int updateEmpById(Employee employee);
}

接口实现类

DepartmentService

package com.zhu.service;

import com.zhu.pojo.Department;

import java.util.List;

public interface DepartmentService {
    List getAll();
}

EmployeeService

package com.zhu.service;

import com.zhu.pojo.Employee;

import java.util.List;


public interface EmployeeService {
    List getAll();

    //通过ID查询员工
    Employee getEmployeeById(int id);

    //通过ID删除员工
    int delete(int id);

    //增加一个员工
    int save(Employee employee);

    int updateEmpById(Employee employee);
}

DepartmentServiceImpl

package com.zhu.service;

import com.zhu.mapper.DepartmentMapper;
import com.zhu.pojo.Department;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class DepartmentServiceImpl implements DepartmentService {

    @Autowired
    private DepartmentMapper departmentMapper;

    @Override
    public List getAll() {
        return departmentMapper.getAll();
    }
}

EmployeeServiceImpl

package com.zhu.service;

import com.zhu.mapper.EmployeeMapper;
import com.zhu.pojo.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;


@Service
public class EmployeeServiceImpl implements EmployeeService {
    @Autowired
    private EmployeeMapper employeeMapper;

    @Override
    public List getAll() {
        return employeeMapper.getAll();
    }

    @Override
    public Employee getEmployeeById(int id) {
        return employeeMapper.getEmployeeById(id);
    }

    @Override
    public int delete(int id) {
        return employeeMapper.delete(id);
    }

    @Override
    public int save(Employee employee) {
        return employeeMapper.save(employee);
    }

    @Override
    public int updateEmpById(Employee employee) {
        return employeeMapper.updateEmpById(employee);
    }
}

sql 的xml

DepartmentMapper.xml






    
        select e.id, e.ename, e.email, e.gender, e.birthday, e.did, dname
        from springbootweb.employee e
                 left join springbootweb.department d on d.id = e.did