SPRINGBOOT从入门到精通

**************************************************************************************************************************************************************

1、入门概述
【1】共计十六章节
【2】入门、配置、日志、Web开发、数据访问、启动配置原理、starters
【3】缓存、消息、检索、任务、安全、分布式、开发热部署、监控管理
【4】J2EE的整个解决方案,牛批

**************************************************************************************************************************************************************

2、SpringBoot很优秀
【1】约定大于配置
【2】User—>SpringBoot—>Spring
【3】Spring全家桶时代
【4】一个伟大的框架
【5】使用嵌入式的Servlet容器,再不需要war包,直接jar包
【6】starters自动依赖于版本控制
【7】自动化配置,无需XML,开箱即用
【8】运维监控
【9】与云计算天然集成

**************************************************************************************************************************************************************

3、微服务概述
【1】微服务是一种架构风格 small services,小型服务
【2】ALL IN ONE
【3】每个功能元素,都是一个可独立替换,可以独立升级的软件单元
【4】SpringBoot---SpringCloud---SpringCloudDataFlow(这就是微服务的实现路径)

**************************************************************************************************************************************************************

4、环境准备
【1】Spring、Maven、Idea
【2】Springboot以2.1.6.RELEASE为准
【3】设置Maven路径

**************************************************************************************************************************************************************

5、HelloWorld
【1】@SpringBootApplication来标注主程序类
【2】 SpringApplication.run(StudyApplication.class, args); 主程序启动
【3】写Controller
package com.day.study.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@org.springframework.stereotype.Controller
public class Controller {
    @RequestMapping("hello")
    @ResponseBody
    public String hello() {
        return "Hello World";
    }
}
【4】server.port=8002  访问http://localhost:8002/hello
【5】这个插件的作用:将应用打包成可执行的jar包(自带tomcat)
 <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
 </plugins>

**************************************************************************************************************************************************************

6、场景启动器
【1】父项目spring-boot-starter-parent
【2】他也有父项目springboot-dependencies,这个项目时真正管理所有依赖版本的
【3】spring-boot-starter-web 场景启动器
【4】springboot将所有的功能场景都抽取出来,做成了starters(启动器),非常厉害的东西

**************************************************************************************************************************************************************

7、自动配置
【1】入口类
【2】SpringBootApplication标注在哪里,哪里的类就是主配置类,启动main即启动了Springboot
【3】SpringBootConfiguration配置类、就是配置文件(想起了Spring---难)
【4】EnableAutoConfiguration开启自动配置功能
【5】@AutoConfigurationPackage扫描主配置类的所在包类等到Spring容器中
(1)注意:如果在主配置类以外的包是扫描不到的。
(2)免去了我们手动配置的注入功能组件的工作。以前需要自己指定的配置类,都被自动做了。
(3)站在巨人肩膀上就是厉害呀,J2EE的全套解决方案

**************************************************************************************************************************************************************

8、快速创建SpringBoot应用
【1】使用Spring Initializr—>下一步—>选择starters
【2】.gitignore、Help、mvnw、mvnw.cmd都可以删除
【3】@ResponseBody也可以加在Controller头部、@org.springframework.stereotype.Controller
【4】@RestController等于3的两个@注解
【5】优点
(1)主程序有了
(2)resources里面有static静态资源、templates保存所有的模板页面
(3)application.properties是Springboot的默认配置文件,可以修改配置

**************************************************************************************************************************************************************

9、配置文件概述
【1】会用两种配置文件,但是我觉得application.properties更好用,更直观。yml太不直观
【2】YAML(以数据为中心)替代了xml,但是我觉得没有application.properties牛批

**************************************************************************************************************************************************************

10、YAML语法概述
【1】KV键值对
【2】空格控制层级关系
【3】大小写敏感
【4】字符串不需要单双引号

**************************************************************************************************************************************************************

11、yaml配置文件值
【1】但是我觉得基本没用,直接设置类属性不得了
【2】Springboot单元测试:@Runwith(SpringRunner.class) @SpringBootTest
【3】获取值需要加上@ConfigurationProperties  @Component

**************************************************************************************************************************************************************

12、配置文件properties设置属性值
【1】这个配置很香啊
person.name=陈翔
person.age=18
person.dog.name=小黑
【2】properties需要设置编码—>File—>Setting—>Editor—>File Encodings—>选择UTF-8,勾选Transparenet...

**************************************************************************************************************************************************************

13、@ConfigurationProperties与@Value区别
【1】@Value("${person.name}")
private String personName;
【2】用@Value好用

**************************************************************************************************************************************************************

14、@PropertySource、@ImportResource、@Bean
【1】@PropertySource(value={"classpath:person.properties"})
【2】ImportResource:导入Spring的配置文件,很少用了,都听困了
【3】建议使用全注解的形式。@Configuration 这就是指明当前类是一个配置类,就是来替代Spring配置文件的
(1)以前是用bean标签添加
(2)现在是@Bean来指明

**************************************************************************************************************************************************************

15、配置文件的占位符
【1】person.name=张三${random.uuid}
person.name=张三${random.int}
【2】也可以使用占位符获取之前设置的值

**************************************************************************************************************************************************************

16、Profile多环境支持
【1】开发、生产环境的配置文件
【2】spring.profiles.active=dev在配置环境中指定
【3】花里胡哨,没有必要。方式真多,能用的能有几个

**************************************************************************************************************************************************************

17、配置文件的加载位置
【1】根据config所在的位置一次是:文件下/config---文件**/config---classpath:config/---classpath:/
【2】约定大于配置,真是啰嗦呀

**************************************************************************************************************************************************************

18、外部配置加载顺序
【1】总体就是:从高—>低
【2】命令行:java -jar xxx --server.port=8003
【3】来自java:comp/env的NDI属性
【4】Java系统属性(System.getProperties())
【5】讲的很多,都这么玩,不乱套了

**************************************************************************************************************************************************************

19、自动配置的原理
【1】@EnableAutoConfiguration允许自动配置
【2】所有配置文件中能配置的属性都是在XXXProperties类中封装着
【3】底层原理真乏味
【4】比如在properties中配置,spring.http.encoding.enabled=false

**************************************************************************************************************************************************************

20、自动配置报告
【1】Conditional派生注解
ConditionalOnBean
ConditionalOnProperty...
【2】自动配置类只有在一定条件下才会生效
【3】debug=true属性,就可以知道哪些配置类生效了

**************************************************************************************************************************************************************

第三篇SpringBoot与日志
21、日志框架分类与选择
【1】日志框架System.out.println(""); from老板的需求
【2】框架就来了:zhangLog.jar
【3】高大上的功能?异步模式、自动归档...zhangLogGood.jar
【4】框架更新后,需要换新框架,zhangLogPerfect.jar
【5】写了日志的接口层,日志门面 zhangLogAbstract.jar
【6】需要哪个,导入具体的日志实现就行了
【7】logback、log4j、slf4j...
【8】日志门面slf4j、commons logging;日志实现log4j、logback
【9】slf4j门面就选择它,日志实现选择Logback
【10】Springboot也是选择的slf4j与logback一对组合

**************************************************************************************************************************************************************

22、slf4j使用原理
【1】日志不应该直接调用实现类,而是日志的抽象类

**************************************************************************************************************************************************************

23、日志框架统一转换为slf4j
【1】统一转换为slf4j
【2】思路:就是就是用新包换就日志包的思维,中间的转换包
【3】实现---------------重点重点重点!!!
 <!--logging-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>
【4】日志的使用
package com.day.study.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Hello {
    private static final Logger logger = LoggerFactory.getLogger(Hello.class);
    public static void main(String[] args) {
        logger.info("大家好");
        logger.debug("调试");
    }
}

**************************************************************************************************************************************************************

24、Springboot日志的使用
【1】pom.xml右击—>Diagrams—>show Dependencies查看依赖关系图谱
【2】spring-boot-starter-logging可以查看他的依赖关系
【3】springboot也是使用slf4j+logback的方式进行日志记录
【4】springboot也把其他的日志都替换成了slf4j
【5】logging.file=my.log 配置这个就可以把日志打印到文件---------------重点重点重点!!!
【6】如果引入spring-core等包,应该在artifactId下面填写
<exclusions><exclusion>commons-logging</exclusion></exclusions>
排除掉这个包,和实际写法不太一样。请注意自己修改。

**************************************************************************************************************************************************************

25、日志默认配置
【1】Springboot默认帮我们配置好了日志
【2】日志级别从低到高trace、debug、info、warn、error
【3】private static final Logger logger = LoggerFactory.getLogger(Controller.class);
【4】指定位置:logging.file=my.log
【5】能配置使用即可

**************************************************************************************************************************************************************

26、指定日志文件和日志Profile功能
【1】logback.xml 个性化的配置,感觉没必要

**************************************************************************************************************************************************************

第四篇Web开发
28、概述
【1】创建Springboot应用
【2】选择场景配置
【3】编写业务代码
【4】自动配置原理
【5】XXXAutoConfiguration 自动配置组件
XXXProperties 配置类来封装配置文件信息

**************************************************************************************************************************************************************

29、静态资源映射规则
【1】RESTful风格开发
【2】以webjars来引入jquery等文件(没必要,找js资源就可以了)
【3】默认找资源的路径resources、static、public
【4】访问JS CSS静态资源,可以放到上面3个路径下
【5】localhost:8002/hello 默认是静态资源下的html文件
【6】图标也是放在静态文件夹下,favicon.ico

**************************************************************************************************************************************************************

30、Thymeleaf概述
【1】也是模板引擎的一种JSP、Thymeleaf、Vue
【2】引入Thymeleaf
<!-- Thymeleaf 自动配置 -->
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

**************************************************************************************************************************************************************

31、Thymeleaf的原语法
【1】时间不同,原来重要的东西在后来的时间已经不重要了...
【2】th:text 看自己的笔记吧,比较全了。
【3】语法规则概述:th语法
【4】th:each、 th:if 、th:case、th:attrappend、th:href、th:src...
【5】th:utext
【6】表达式:${...} 没有Vue好用呀,讲道理

**************************************************************************************************************************************************************

32、SpringMVC自动配置原理
【1】SpringBoot自动配置好了SpringMVC
【2】有以下配置
(1)自动配置了ViewResolver 视图解析器,根据方法返回值得到视图对象
(2)自动注册了Converter转换器、Formatter格式化器
(3)静态首页访问

**************************************************************************************************************************************************************

33、Springboot-web扩展与全面接管
【1】implements WebMvcConfigurer可以用于扩展SpringMVC的功能
【2】所以我们的配置也会起作用,这样就能实现拦截与指定页面放行

**************************************************************************************************************************************************************

35、国际化
【1】基本不怎么用到

**************************************************************************************************************************************************************

36、登录与拦截器
【1】如果报错4开头的,说明是客户端的错误
【2】拦截器,用到HttpSession中设置的属性是否为null来判断是否登录

**************************************************************************************************************************************************************

37、RESTful实验
【1】查询emp-GET、添加emp-POST、修改emp-PUT、删除emp-DELETE
【2】用请求方式来区分增删改查

**************************************************************************************************************************************************************

38、公共页面抽取
【1】而我传参都是用封装类,更清晰点,对象就是大总管
【2】公共部分就是导航页面,而我已经提炼出来一套框架了
【3】Thymeleaf也可以抽取,但是不需要了,后面前端统一用Vue+Element~

**************************************************************************************************************************************************************

39、点击的链接高亮
【1】我的哥,这也需要讲解吗...
【2】页面里面加判断真的不友好,很混乱,这一点Vue做的很好
【3】费了这么大劲,就和Vue+Element动个手指头一样...

**************************************************************************************************************************************************************

40、员工添加页面
【1】添加与修改都是两个步骤的,但是跳转没有Vue的体验好(Vue和自己实现的好像)

**************************************************************************************************************************************************************

41、员工添加功能实现
【1】mv = new ModelAndView("redirect:/welcome");
(1)重定向的知识redirect+需要跳转的页面名称
(2)日期配置处理

**************************************************************************************************************************************************************

42、员工修改、删除
【1】会用到form表单
【2】点击事件

**************************************************************************************************************************************************************

44、错误处理机制
【1】默认效果:404
【2】如何定义错误页面、如何定义错误数据—>让我想起VUE
【3】定义错误的Html,当发生错误时跳转即可

**************************************************************************************************************************************************************

46、嵌入式Servlet容器配置修改
【1】Springboot默认使用tomcat作为嵌如式的servlet容器
【2】修改定制servlet容器配置、server相关的就是
server.port=8002
【3】编写servlet容器配置类(不推荐)

**************************************************************************************************************************************************************

47、注册servlet三大组件
【1】extends HttpServlet{} 这个没必要了呀,Controller都实现了,技术过时真的快
【2】Servlet、Filter、Listener

**************************************************************************************************************************************************************

48、使用其他的嵌如式容器
【1】Jetty(长连接)、Undertow(不支持JSP)
【2】配置下pom.xml依赖即可
【3】排除与引入
(1)spring-boot-starter-web中排除exclusions-exclusion-spring-boot-starter-tomcat
(2)spring-boot-starter-undertow或spring-boot-starter-jetty

**************************************************************************************************************************************************************

49、嵌入式servlet自动配置原理
【1】代码底层说明this.tomcat.start

**************************************************************************************************************************************************************

51、使用外部servlet容器与支持JSP
【1】外部安装tomcat,为什么要支持JSP,这么老的技术...

**************************************************************************************************************************************************************

53、Docker概述
【1】Windows原生系统(必须自己装驱动与软件)
【2】Windows镜像系统(个性化配置的东西都在)
【3】这个和Docker的思路是一致的
【4】安装配置好的软件,打包成一个镜像。另外一台电脑把打包好的镜像运行就行
【5】运行中的镜像就叫做“容器”

**************************************************************************************************************************************************************

54、Docker核心概念
【1】docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统上)
【2】dcoker客户端(Client):连接docker主机进行操作(类似mysql的操作)
【3】docker仓库(Registry):保存打包好的镜像
【4】docker镜像(Images): 打包好的软件,存放在docker仓库中
【5】docker容器(Container):镜像启动后的实例就是一个容器,能独立运行的一个或一组应用
【6】使用docker的步骤:
(1)安装docker
(2)去dcoker仓库找到这个软件对应的镜像
(3)使用docker运行这个镜像,这个镜像就会生成一个docker容器
(4)对容器的启动停止,就是对软件的启动停止

**************************************************************************************************************************************************************

55、Linux环境准备
【1】VMWare、VirtualBox;
【2】按照移动硬盘提供的导入即可,启动虚拟机
【3】账号root 密码123456
【4】使用客户端xshell连接服务器
【5】设置虚拟机网络(自动选择就行了),设置好后重启下虚拟机网络
service network restart
【6】查看IP地址 ip addr
【7】用xshell、xftp连接即可
------------------------------------------------------------------------------------------------
【8】连接方式-桥接网卡-根据连接的是什么连接方式(来选择是有线网卡还是无线网卡),接入网线打勾!!!
【9】设置好网络后重启虚拟机 或 service network restart
【10】配置vi /etc/sysconfig/network-scripts/ifcfg-enp0s3
BOOTPROTO=dhcp # 不是static重要重要重要!!!
ONBOOT=yes
IPADDR=192.168.0.205 # 重要重要重要!!! 根据windows网段做对应修改,用205是为了防止IP冲突!修改box热键是一路点击第一个
GATEWAY= 192.168.0.1 # 重要重要重要!!!根据windows网段做对应修改
【11】最后service network restart 或者执行systemctl restart network
------------------------------------------------------------------------------------------------
【12】虚拟机启动是从光盘启动,虚拟机设置为从硬盘优先启动就解决了。### 重要重要重要!!!
可以看到默认顺序是:软驱、光驱、硬盘,VirtualBox会一直找到光驱然后从光驱启动,不会直接启动装在硬盘上的系统。
------------------------------------------------------------------------------------------------
牛批!!! 运维之路就此开始!!!

**************************************************************************************************************************************************************

56、docker的安装、启动、停止-重要重要重要!!!这个玩意在终极篇不是更详细的描述吗?
【1】安装vim:yum -y install vim*
【2】检查内核版本,uname -r 要求必须是3.10以上
(1)查看安装过的包:yum list installed | grep docker
本机安装过的旧版本:docker.x86_64,docker-client.x86_64,docker-common.x86_64
(2)删除安装的Docker相关的软件包:
yum -y remove docker.x86_64
yum -y remove docker-client.x86_64
yum -y remove docker-common.x86_64
(1)查看内核版本【Docker要求Centos系统的内核版本高于3.10】
uname -r【本机的内核版本:3.10.0-327.el7.x86_64】
(2)把yum包更新到最新(时间可能有点长,慢慢等待…)
yum update
(3)安装需要的软件包。【yum-util提供yum-config-manager功能,另外两个是devicemapper驱动所需依赖】
yum install -y yum-utils device-mapper-persistent-data lvm2
配置下从阿里云下载:重要重要重要!!!
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
(4)查看仓库的docker版本
yum list docker-ce --showduplicates | sort -r
(5)安装docker
yum -y install docker-ce-18.03.1.ce #安装指定版本的docker 重要重要重要~~~
(6)启动docker
systemctl start docker
systemctl enable docker #设置开机启动docker
systemctl stop docker #停止docker的命令
systemctl status docker #查看docker启动状态
(7)查看版本
docker version
(8)检测是否启动成功,可以使用search命令。docker search mysql(查看仓库里镜像,分为官方非官方、是否自动构建、点赞星数)

**************************************************************************************************************************************************************

57、常用镜像操作命令
【1】docker search xxx 搜索什么的镜像
【2】配置镜像加速器,这是我的阿里云的
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://vtaihzzp.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
【3】下载镜像指定版本 docker pull mysql:5.6
【4】docker images 查看所有镜像
【5】删除镜像 docker rmi 镜像ID(docker images可以查看)

**************************************************************************************************************************************************************

58、容器操作命令
【1】搜索镜像 docker search tomcat
【2】下载镜像 docker pull tomcat:8.0.52
【3】根据镜像启动容器
docker run --name my_tomcat -d tomcat:latest
【4】查看在运行的容器:docker ps
【5】停止运行中的容器:docker stop 容器ID(也可写容器的名字)
【6】查看所有容器 docker ps -a
【7】docker start 容器ID
【8】docker rm -f 容器ID(强制删除容器)
【9】使得启动的tomcat可以访问
docker run -d -p 8080:8080 tomcat:8.0.52
【10】进入容器里面
docker exec -it b326cb0d874c /bin/bash #进入虚拟centos的tomcat目录
【11】关闭防火墙:systemctl stop firewalld

**************************************************************************************************************************************************************

59、安装MySQL
【1】docker logs 容器ID,可以查看日志
【2】启动:docker run -p 3306:3306 --name my_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6
【3】进入测试:docker exec -it 容器ID /bin/bash 
【4】命令搞的火大,重新安装了centos7
【5】果然是版本的问题,用了CENTOS7.ios后一路顺畅,一路歌唱,一路到远方呀,卧槽 牛批
【6】docker run --name my_mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6 -v /opt/mysql:/etc/mysql/conf.d
把/opt/mysql挂载到容器的指定位置,这样改mysql的配置文件,只需要把配置文件放在/opt/mysql就行了
【7】docker run -p 3306:3306 --name my_mysql -e MYSQL_ROOT_PASSWORD=123456 -v /root/mysql:/etc/mysql/conf.d -d mysql:5.6

**************************************************************************************************************************************************************

60、数据库访问-概述
【1】Spring data:无论是SQL还是NOSQL都进行了统一处理
 <!--jdbc-->
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
 <!--mysql-->
<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
</dependency>

**************************************************************************************************************************************************************

61、JDBC自动配置原理
【1】数据库配置
spring.datasource.url=jdbc:mysql://192.168.0.105:3306/mydb?useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
【2】测试类的使用
package com.day.study.controller;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
@RunWith(SpringRunner.class)
@SpringBootTest
public class Controller {
    @Autowired
    DataSource dataSource;
    @Test
    public void contextLoads() throws SQLException {
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
        connection.close();
    }
}
【3】自定义数据源、schema可以创建数据库表
【4】数据库实操,不实用
package com.day.study.controller;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest
public class Controller {

    @Autowired
    DataSource dataSource;
    @Autowired
    JdbcTemplate jdbcTemplate;

    @Test
    public void contextLoads() throws SQLException {
        List<Map<String, Object>> list = jdbcTemplate.queryForList("select * from department");
        System.out.println(list.get(0));
    }
}

**************************************************************************************************************************************************************

62、整合Druid与配置数据源监控
【1】配置Maven
 <!--druid-->
  <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.8</version>
  </dependency>
【2】在properties指定数据源
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
【3】启动测试类,发现切换成功
2022-07-17 13:56:48.548  INFO 12676 --- [           main] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited
{id=1, name=人力资源}
【4】druid的其他属性与监控配置

**************************************************************************************************************************************************************

63、整合MyBatis
【1】引入依赖
 <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
【2】schema的用法可以简单了解下

**************************************************************************************************************************************************************

64、Mybatis注解版
【1】注解版挺舒服呀
package com.day.study.pojo;
import lombok.Data;
@Data
public class Department {
    private Integer id;
    private String name;
}
【2】注意@的使用
package com.day.study.mapper;
import com.day.study.pojo.Department;
import org.apache.ibatis.annotations.*;
// 指定这是一个操作数据库的Mapper
@Mapper
public interface DepartmentMapper {
    // 查的注解
    // 删的注解
    // 增的注解
    // 改的注解
}
【3】Controller
package com.day.study.controller;
import com.day.study.mapper.DepartmentMapper;
import com.day.study.pojo.Department;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DepartmentController {
    @Autowired
    DepartmentMapper departmentMapper;
    @GetMapping("/department/{id}")
    public Department selectDepartment(@PathVariable Integer id) {
        return departmentMapper.selectDepartmentById(id);
    }
    @GetMapping("/department")
    public Department insertDepartment(Department department) {
        departmentMapper.insertDepartment(department);
        return department;
    }
}
【4】请求
http://localhost:8080/department/1
http://localhost:8080/department?name=IT
【5】在启动类指定@MapperScan=XXX包,也能批量找到Mapper
【6】缺点是:长的SQL用注解写就嘎住了

**************************************************************************************************************************************************************

65、Mybatis-配置版
【1】写Mapper
package com.day.study.mapper;
import com.day.study.pojo.Employee;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface EmployeeMapper {
    Employee selectEmployeeById(Integer id);

    void insertEmployee(@Param("employee") Employee employee);
}
【2】写Mapper.xml
【3】指定xml的位置
# mybatis
mybatis.mapper-locations=classpath:mapper/*.xml
【4】使用
package com.day.study.controller;
import com.day.study.mapper.DepartmentMapper;
import com.day.study.mapper.EmployeeMapper;
import com.day.study.pojo.Department;
import com.day.study.pojo.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DepartmentController {
    @Autowired
    DepartmentMapper departmentMapper;
    @Autowired
    EmployeeMapper employeeMapper;
    @GetMapping("/department/{id}")
    public Department selectDepartment(@PathVariable Integer id) {
        return departmentMapper.selectDepartmentById(id);
    }
    @GetMapping("/department")
    public Department insertDepartment(Department department) {
        departmentMapper.insertDepartment(department);
        return department;
    }
    @GetMapping("/employee/{id}")
    public Employee selectEmployee(@PathVariable Integer id) {
        return employeeMapper.selectEmployeeById(id);
    }
}

**************************************************************************************************************************************************************

66、整合JPA概述
【1】原则和目的:简化数据库操作
【2】这好像MybatisPlus呀,不用关心实现,但是能实现增删改查
【3】但是还有RedisTemplate、MongoTemplate,还是有用的
【4】面向Spring Data编程 JPA就是操作数据库的(但是这个用MP代替了呀)

**************************************************************************************************************************************************************

67、整合JPA
【1】还是跟着了解下吧
【2】基于ORM思想 Object Relational Mapping
【3】真的没有MP好用,我的哥,没必要花太多心思
【4】还用hibernate呢 多老...

**************************************************************************************************************************************************************

68、Springboot原理-第一步:创建SpringApplication
【1】创建SpringApplication对象
【2】判断当前是否为Web应用
【3】找到配置spring.factories,然后保存起来
【4】从类路径下找到spring.factories配置
【5】从多个配置类中,找到有main方法的配置类

**************************************************************************************************************************************************************

69、Springboot原理-第二步:启动应用
【1】从spring.factories获取SpringApplicationRunListeners
【2】调用SpringApplicationRunListeners.starting()方法
【3】封装命令行参数
【4】准备环境
【5】创建环境完成回调
【6】调用SpringApplicationRunListeners.environmentPrepared()表示环境准备完成
【7】创建ApplicationContext(决定是web的ioc还是普通的ioc,若为web还会创建嵌入式tomcat)
【8】准备上下文ioc
【9】contextPrepared
【10】刷新容器,进行回调,启动完毕返回ioc容器

**************************************************************************************************************************************************************

70、Springboot原理-第三步:事件监听机制
【1】各种Listener的实现与重写,看什么时候执行的

**************************************************************************************************************************************************************

71、Springboot原理:自定义starter
【1】@Configuration自动配置类
【2】ConfigurationProperties
【3】EnableConfigurationProperties
【4】自动配置类spring.factories
【5】就是引入父工程包,这个dubbo已经实现过一次了

**************************************************************************************************************************************************************

72、结束概述
【1】前八章是基础
【2】后面八章整合是高级部分
【3】Springboot与各种技术的整合与使用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker挂载数据卷-以nginx为例

目录 一、什么是数据卷 二、数据卷的作用 三、如何挂载数据卷 1、创建nginx容器挂载数据卷 2、查看数据卷 3、查看数据卷详情 4、尝试在宿主机修改数据卷 5、查看容器内对应的数据卷目录 6、 访问nginx查看效果 ​​​​​​​一、什么是数据卷 挂载数据卷本质上就是实…

基于springboot实现公司日常考勤系统项目【项目源码+论文说明】

基于springboot实现公司日常考勤系统演示 摘要 目前社会当中主要特征就是对于信息的传播比较快和信息内容的安全问题&#xff0c;原本进行办公的类型都耗费了很多的资源、传播的速度也是相对较慢、准确性不高等许多的不足。这个系统就是运用计算机软件来完成对于企业当中出勤率…

Unity3D初级实战项目之方块跑酷

目录 初始化项目开发环境初始化项目屏幕自适应 游戏UI界面元素布局开始界面UI角色选择&#xff08;商城&#xff09;界面UI游戏界面UI 地图生成算法之菱形布局Resources资源加载代码生成地图菱形布局 地图生成算法之墙壁边界菱形地图双排布局地图瓷砖颜色美化墙壁边界生成 地图…

git提交错了?别慌,直接删除提交记录

为什么要删除提交历史 前几天产品提了个很扯淡的需求&#xff0c;我在代码了进行了吐槽.... 要命的是我不下心进行了代码提交&#xff1a; 我们的远程仓库大家都能看见的 这要是被其他人发现就惨了&#xff01;当务之急&#xff0c;我必须立刻马上删除这一条提交记录&#xff…

菜鸡学习netty源码(一)——ServerBootStrap启动

1.概述 对于初学者而然,写一个netty本地进行测试的Server端和Client端,我们最先接触到的类就是ServerBootstrap和Bootstrap。这两个类都有一个公共的父类就是AbstractBootstrap. 那既然 ServerBootstrap和Bootstrap都有一个公共的分类,那就证明它们两个肯定有很多公共的职…

EMP.DLL是什么东西?游戏提示EMP.DLL文件缺失怎么解决

emp.dll文件是Windows操作系统中的一种动态链接库文件&#xff0c;它被设计为可以被多个程序共享使用的模块化文件。这种设计旨在提高系统效率&#xff0c;减少内存消耗&#xff0c;并简化软件的维护和更新。DLL文件通常包含了一系列相关的函数和变量&#xff0c;这些函数和变量…

全景剖析阿里云容器网络数据链路(七):Terway DataPath V2(Terway≥1.8.0)

作者&#xff1a;余凯 前言 近几年&#xff0c;企业基础设施云原生化的趋势越来越强烈&#xff0c;从最开始的IaaS化到现在的微服务化&#xff0c;客户的颗粒度精细化和可观测性的需求更加强烈。容器网络为了满足客户更高性能和更高的密度&#xff0c;也一直在高速的发展和演…

qt学习篇---界面按键关联(信号和槽)

目录 1.qt基础 2.做一个界面 创建project UI界面设计 信号和槽 1.控件改名字 2.什么是信号和槽 3.怎么关联信号和槽 自动关联 手动关联 1.qt基础 qt可移植性强&#xff0c;不久会用到MCU。很有意义学习 2.做一个界面 创建project 不要中文路径 选择QWidget .pro文件…

ASP.NET实验室预约系统的设计

摘 要 实验室预约系统的设计主要是基于B/S模型&#xff0c;在Windows系统下&#xff0c;运用ASP.NET平台和SQLServer2000数据库实现实验室预约功能。该设计主要实现了实验室的预约和管理功能。预约功能包括老师对实验室信息、实验项目和实验预约情况的查询以及对实验室的预约…

LeetCode 69—— x 的平方根

阅读目录 1. 题目2. 解题思路一3. 代码实现一4. 解题思路二5. 代码实现二 1. 题目 2. 解题思路一 二分查找法&#xff0c;对于整数 i ∈ [ 0 , x ] i \in [0,x] i∈[0,x]&#xff0c;我们判断 i 2 i^2 i2 和 x x x 的关系&#xff0c;然后找到最后一个平方小于等于 x x x …

向量语义学

书籍&#xff1a;Vector Semantics 作者&#xff1a;Andrs Kornai 出版&#xff1a;Springer Singapore 书籍下载-《向量语义学》本书通过提出一个以线性多面体术语表达的形式理论来弥合这一差距&#xff0c;该理论将字向量和概念结构进行了概括&#xff0c;将每个词典定义视…

45. UE5 RPG 使用元属性(Meta Attributes)以及使用Set by Caller修改伤害

在RPG游戏中&#xff0c;我们是不会直接修改生命值的属性&#xff0c;是因为在修改角色属性时&#xff0c;需要获取角色的属性并进行复杂的计算&#xff0c;所以&#xff0c;我们正常情况下使用元属性&#xff08;Meta Attributes&#xff09;作为计算的中间的媒。在服务器上先…

前端-React项目初始化

大家好我是苏麟 , 今天聊聊前端依赖 Ant Desgin Pro 快速初始化项目 . Ant Desgin Pro 官网 : 开始使用 - Ant Design Pro 初始化项目 找到文档->快速上手 脚手架命令 : # 使用 npm npm i ant-design/pro-cli -g创建项目命令 : pro create 项目名称 选择简单还是全量 : …

Python | Leetcode Python题解之第64题最小路径和

题目&#xff1a; 题解&#xff1a; class Solution:def minPathSum(self, grid: List[List[int]]) -> int:if not grid or not grid[0]:return 0rows, columns len(grid), len(grid[0])dp [[0] * columns for _ in range(rows)]dp[0][0] grid[0][0]for i in range(1, r…

五大开放式耳机推荐,选对耳机让运动更带感!

看似精彩的户外运动经历背后&#xff0c;其实是枯燥的体能运动和训练&#xff0c;以及独自长途和长时间旅行伴随的孤独感&#xff0c;而排解这些不良情绪的最佳方式就是音乐。如果你希望在运动、舒适、安全和音质之间获得一个最佳平衡&#xff0c;那相比入耳式耳机&#xff0c;…

71.网络游戏逆向分析与漏洞攻防-角色与怪物信息的更新-分析并利用角色与怪物创建的数据包

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 现在的代码都是依据数据包来写的&#xff0c;如果看不懂代码&#xff0c;就说明没看懂数据包…

『项目整理』易CAR通项目说明文档-我的第一款APP

『项目整理』易CAR通项目说明文档-我的第一款APP 项目介绍功能介绍技术栈介绍实现效果如何运行备注 项目介绍 易CAR通项目是我的第一个Android项目。是一款结合了AR技术的模仿懂车帝的看车软件。因为是初学&#xff0c;所示实现的效果差强人意&#xff0c;很多的功能界面只实现…

文件批量高效管理,批量将PDF类型文件移动到指定文件夹里,实现文件高效管理

文件的管理与整理成为了我们生活中不可或缺的一部分。面对堆积如山的PDF文件&#xff0c;你是否也曾感到手足无措、焦头烂额&#xff1f;现在&#xff0c;有了我们的批量文件管理工具&#xff0c;PDF文件的管理将变得前所未有的高效与简单&#xff01; 首先&#xff0c;我们要…

对于Servlet项目无法显示css样式

有可能你在过滤器中拦截了.css文件&#xff0c;并且你设置了响应格式导致的&#xff0c;就比如我的项目如下图所示 删除servletResponse.setContentType("text/html; charsetUTF-8");即可

Android C++ 开发调试 LLDB 工具的使用

文章目录 调试环境准备基础命令Breakpoint CommandsWatchpoint CommandsExamining VariablesEvaluating ExpressionsExamining Thread StateExecutable and Shared Library Query Commands 参考&#xff1a; Android 中在进行 NDK 开发的时候&#xff0c;我们经常需要进行 C 代…
最新文章