zoukankan      html  css  js  c++  java
  • 9_SpringBoot

    一. SpringBoot介绍

    1.1. 引言

    • 为了使用SSM框架去开发, 准备SSM框架的模板配置
    • 为了使Spring整合第三方框架, 单独的去编写xml文件
    • 导致SSM项目后期xml文件特别多, 维护xml文件的成本是很高的
    • SSM工程部署也是很麻烦, 依赖第三方的容器
    • SSM开发方式很是笨重

    1.2 SpringBoot

    • SpringBoot是由Pivota团队研发的,. SpringBoot并不是一门新技术, 只是将之前常用的Spring, SpringMVC, MyBatis等常用的框架封装到了一起, 帮助你隐藏这些框架的实现细节, 实现敏捷开发
    • SpringBoot就是一个工具集
    • SpringBoot的特点:
      • SpringBoot不需要模板化的配置
      • SpringBoot在整合第三方框架时, 只需要导入响应的starter依赖包, 就自动整合了
      • SpringBoot默认只有一个properties配置文件, 不推荐使用xml, 后期会采用Java的文件去编写配置信息
      • SpringBoot工程在部署时, 采用的是jar包的方式, 内部自动依赖Tomcat容器, 提供了多环境的配置
      • 后期要学习的SpringCloud需要建立在SpringBoot的基础上

    二. SpringBoot快速入门

    2.1 快速构建SpringBoot

    • IDEA中使用Spring Initializr创建SpringBoot项目
    • 创建过程和创建Maven项目区别不大
    • 中间可以选择语言(默认Java), 打包方式(默认Jar), Java版本(默认最新版,我手动改为Java8了), 还有各种依赖的选择(一般选Web)
    • 第一次创建SpringBoot工程时, 会下载大量的依赖, 一定要确保Maven已经配置了私服, 不然可能会下载失败
    • 创建完成后删除目前不需要的文件, 只留下.idea,src目录和pom.xml,以及.iml, .gitignore文件
    • 如果创建过程中没有勾选Web, 则需要在pom.xml中修改依赖
      • 把spring-boot-starter修改为spring-boot-starter-web即可
    • 然后编写Controller进行测试
    package com.dz.springboot_study.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    @RequestMapping("/hello")
    public class HelloController {
    
        @RequestMapping("/hello")
        @ResponseBody
        public String hello() {
            return "Hello SpringBoot!";
        }
    }
    
    • 启动SpringBoot工程(运行启动类中的main方法)

    2.2 SpringBoot的目录结构

    1. pom.xml文件
      1. 指定了一个父工程: 指定当前工程为SpringBoot, 帮助我们声明了starter依赖的版本
      2. 项目的元数据: 包名, 项目名, 版本号
      3. 指定了properties的信息: 指定了java版本为1.8
      4. 导入依赖: 默认情况导入spring-boot-starter, spring-boot-starter-test
      5. 插件: spring-boot-maven-plugin
    2. .gitignore文件: 默认帮我们忽略一些文件和目录
    3. src目录
    -src
    	-main
    		-java
    			-包名
    				启动类.java		  #需要将controller类, 放在启动类的子包中或者同级目录下
    		-resources
    			-static					#存放静态资源的
    			-templates  			#存放模板页面的
    			application.properties	#SpringBoot提供的唯一配置文件(可以改为yaml或yml的格式)
    	-test	#为了测试		
    	
    

    2.3 SpringBoot两种启动方式

    1. 运行启动类中的main方法即可运行SpringBoot工程
    2. 采用jar包的方式
      • 将当前项目打包成一个jar文件
      • 通过java -jar jar文件

    三. SpringBoot常用注解

    3.1 @Configuration和@Bean

    • 之前使用SSM去开发时, 在xml文件中编写bean标签, 但是在SpringBoot不推荐使用xml文件
    • 导入lombok依赖(正常使用lombok还需在IDEA中下载插件)
    <!--lombok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    
    • @Configuration注解相当于bean标签
    • @Bean注解相当于bean标签
      • id="方法名 | 注解中的name属性"
      • class="方法的返回结果"
    @Configuration//代表当前类是一个配置类
    public class UserConfig {
    
        @Bean(name = "user1")  //构建一个实例, 放进Spring容器中
        public User user() {
    
            return new User("张三",18,true);
        }
        /*
        * 以上写法相当于在.xml文件中的
        * <beans>
        *   <bean id="user1" class="com.dz.pojo.User"/>
        * </beans>
        * */
    }
    

    3.2 @SpringBootApplication

    • @SpringBootApplication就是一个组合注解
    1. @SpringBootConfiguration就是@Configuration注解, 代表启动类就是一个配置类

    2. @EnableAutoConfiguration是用来实现自动装配的, SpringBoot工程启动时, 运行一个SpringFactoriesLoader的类, 加载META-INF/spring.factories配置类(已经开启的), 通过SpringFactoriesLoader中的load方法, 以while循环的方式, 一个一个加载

      好处: 无需编写大量的整合配置信息, 只需按照SpringBoot提供好的约定去整合即可

      坏处: 如果说我们导入了一个starter依赖, 那么就需要填写其对应的配置信息,否则就会报错

      手动关闭自动装配指定内容: @SpringBootApplication(exclude = QuartzAutoConfiguration.class)

    3. @ComponentScan就相当于<context:component-scan base-Package="包名" /> 帮助扫描注解的

    四. SpringBoot常用配置

    4.1 SpringBoot的配置文件格式

    • SpringBoot配置文件支持propertiesyml, 甚至还支持json
    • 更推荐使用yml文件格式
      1. yml文件, 会根据换行和缩进帮助我们管理配置文件的所在位置
      2. yml文件, 相比properties更轻量级一些
    • yml文件的劣势:
      1. 严格遵循换行和缩进
      2. 在填写value时, 一定要在: 后面加上一个空格

    4.2 多环境配置

    • 在application.yml中添加一个配置项
    spring:
      profiles:
        active: 环境名
    
    • 在resources目录下, 创建多个application-环境名 .yml 文件即可
    • 在部署工程时 通过java -jar jar文件 --spring.profiles.active=环境

    4.3 引入外部配置文件信息

    • 和传统的SSM方式一样, 通过@Value的注解去获取properties/yml文件中的内容
    • 如果在yml文件中需要编写大量的自定义配置, 并且具有统一的前缀时, 采用如下方式
    @Component
    @ConfigurationProperties(prefix = "person")
    @Data
    public class Person {
    
        private String name;
        private Integer age;
        private Boolean happy;
        private Date birth;
        private Map<String, Object> map;
        private List<Object> list;
        private Dog dog;
            
    }        
    
    person:
      name: 张三
      age: ${random.int}
      happy: true
      birth: 2000/01/01
      map: {k1: v1,k2: v2}
      list: [code,music,girl]
      dog:
        name: 小黑
        age: 2
    
    • 使用@ConfigurationProperties注解时会出现爆红提示, 但不影响使用, 如想要消除爆红, 导入以下依赖
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    

    4.4 热加载

    • 导入以下依赖
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-devtools</artifactId>
    	<optional>true</optional>
    </dependency>
    
    • 修改IDEA设置 Settings > Build,Execution > Compiler > 勾选Build project automatically
    • 之后项目内容修改后,只需Build一下即可,无需重新部署项目

    五. SpringBoot整合MyBatis

    5.1 xml方式整合MyBatis

    5.1.1 导入依赖
    <!--mysql驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!--druid连接池-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.10</version>
    </dependency>
    <!--mybatis-->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.2</version>
    </dependency>
    
    5.1.2 准备实体类
    • 数据库表准备完成后, 可以手动创建实体类, 也可以使用IDEA自动创建实体类, 这里我们使用第二种
      • IDEA连接MySQL, 出现时区问题加上Asia/Shanghai
      • 选中要建实体类的表 ==> 右键选择Scripted Extensions ==> Generate Pojos.groovy, 然后选择实体类创建的位置
    //部门表
    package com.dz.pojo;
    
    import lombok.Data;
    
    import java.io.Serializable;
    
    @Data
    public class TDepartment implements Serializable {
    
      private Integer id;
      private String name;
      private String location;
    
    }
    
    //员工表
    package com.dz.pojo;
    
    import lombok.Data;
    
    import java.io.Serializable;
    
    @Data
    public class TEmployee implements Serializable {
    
      private Integer id;
      private String name;
      private double salary;
      private TDepartment department;
    
    }
    
    5.1.3 准备Mapper接口
    package com.dz.mapper;
    
    import com.dz.pojo.TEmployee;
    import org.springframework.stereotype.Repository;
    
    import java.util.List;
    
    @Repository("empMapper")
    public interface EmpMapper {
        List<TEmployee> findAll();
    }
    
    
    5.1.4 扫描Mapper接口所在的包
    • 在启动类上添加注解, 扫描Mapper接口所在的包
    @MapperScan(basePackages = "com.dz.mapper")
    
    5.1.5 准备Mapper映射文件
    • resources目录下创建mapper目录, 用来存放Mapper映射文件

    EmpMapper.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    
    <mapper namespace="com.dz.mapper.EmpMapper">
        <resultMap id="emp_resultMap" type="TEmployee">
            <id column="id" property="id"/>
            <result column="name" property="name"/>
            <result column="salary" property="salary"/>
            <association property="department" javaType="TDepartment">
                <id column="dpt_id" property="id"/>
                <result column="dpt_name" property="name"/>
                <result column="location" property="location"/>
            </association>
        </resultMap>
        <!--List<TEmployee> findAll();-->
        <select id="findAll" resultMap="emp_resultMap">
            select emp.id,emp.name,salary,dpt.id dpt_id,dpt.name dpt_name,dpt.location
            from t_employee emp
            join t_department dpt
            on emp.dept_id=dpt.id
        </select>
    </mapper>
    
    
    5.1.6 添加yml文件配置信息
    • MyBatis设置
      • 扫描映射文件
      • 配置实体类别名
    #MyBatis设置
    mybatis:
      #扫描映射文件
      mapper-locations: classpath:mapper/*.xml
      #配置别名扫描的包, 别名=实体类类名
      type-aliases-package: com.dz.pojo
      #开启驼峰映射配置
      configuration:
        map-underscore-to-camel-case: true
    
    5.1.7 指定连接数据库的信息
    #连接数据库的信息
    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql:///mybatis_db
        username: root
        password: 8031
        type: com.alibaba.druid.pool.DruidDataSource
    
    5.1.8 测试
    • 直接在EmpMapper接口双击接口名选中右键 ==> Go to ==> Test
    • 选中我们要测试的方法findAll, 就会自动创建当前接口的测试类EmpMapperTest.java
    • 给SpringBoot的主测试类加一个public, 然后让我们的EmpMapperTest测试类继承SpringBoot的主测试类, 就可以进行测试了
    package com.dz.mapper;
    
    import com.dz.Springboot02ConfigApplicationTests;
    import com.dz.pojo.TEmployee;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import java.util.List;
    
    
    class EmpMapperTest extends Springboot02ConfigApplicationTests {
    
        @Autowired
        private EmpMapper empMapper;
    
        @Test
        void findAll() {
            List<TEmployee> tEmployees = empMapper.findAll();
            for (TEmployee tEmployee : tEmployees) {
                System.out.println(tEmployee);
            }
        }
    }
    
    • 如果出现timezone之类的错误,就在.yml中的数据库连接配置中的url后面加上?serverTimezone=Asia/Shanghai, 因为SpringBoot默认导入的mysql是8.X的

    5.2 注解方式整合MyBatis

    5.2.1 创建Department的Mapper接口
    package com.dz.mapper;
    
    import com.dz.pojo.TDepartment;
    import org.apache.ibatis.annotations.Param;
    
    import java.util.List;
    
    @Repository("dptMapper")
    public interface DptMapper {
        //查询所有部门
        List<TDepartment> findAll();
    	//根据id查一个部门
        TDepartment findOneById(@Param("id") Integer id);
    }
    
    5.2.2 添加MyBatis注解
    • 针对增删改查: @Insert, @Delete, @Update, @Select
    • 但还是需要在启动类中添加@MapperScan(basePackages = "com.dz.mapper")注解的, 只是不用在.yml配置文件中配置.xml文件的扫描和实体类别名了
    package com.dz.mapper;
    
    import com.dz.pojo.TDepartment;
    import org.apache.ibatis.annotations.Param;
    import org.apache.ibatis.annotations.Select;
    
    import java.util.List;
    
    @Repository("dptMapper")
    public interface DptMapper {
        @Select("select * from t_department")
        List<TDepartment> findAll();
    
        @Select("select * from t_department where id=#{id}")
        TDepartment findOneById(@Param("id") Integer id);
    }
    
    5.2.3 测试, 看到执行的sql语句
    #查看sql语句
    logging:
      level:
        com.dz.mapper: debug
    
    package com.dz.mapper;
    
    import com.dz.Springboot02ConfigApplicationTests;
    import com.dz.pojo.TDepartment;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import java.util.List;
    
    class DptMapperTest extends Springboot02ConfigApplicationTests {
        @Autowired
        private DptMapper dptMapper;
    
        @Test
        void findAll() {
            List<TDepartment> departments = dptMapper.findAll();
            for (TDepartment department : departments) {
                System.out.println(department);
            }
        }
    
        @Test
        void findOneById() {
            TDepartment department = dptMapper.findOneById(1);
            System.out.println(department);
        }
    }
    

    5.3 SpringBoot整合分页助手

    5.3.1 导入依赖
    <!--分页助手PageHelper-->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper-spring-boot-starter</artifactId>
        <version>1.3.0</version>
    </dependency>
    
    5.3.2 测试使用
    package com.dz.mapper;
    
    import com.dz.Springboot02ConfigApplicationTests;
    import com.dz.pojo.TEmployee;
    import com.github.pagehelper.PageHelper;
    import com.github.pagehelper.PageInfo;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    
    import java.util.List;
    
    
    class EmpMapperTest extends Springboot02ConfigApplicationTests {
    
        @Autowired
        private EmpMapper empMapper;
    
        @Test
        void findAll() {
            List<TEmployee> tEmployees = empMapper.findAll();
            for (TEmployee tEmployee : tEmployees) {
                System.out.println(tEmployee);
            }
        }
    
        @Test
        void findAllByPage() {
            //1. 执行分页
            PageHelper.startPage(1,2);
            //2. 执行查询
            List<TEmployee> employees = empMapper.findAll();
            //3. 封装PageInfo对象
            PageInfo<TEmployee> pageInfo = new PageInfo<>(employees);
            //4. 输出
            for (TEmployee employee : pageInfo.getList()) {
                System.out.println(employee);
            }
        }
    }
    
  • 相关阅读:
    【Luogu】P3809后缀排序(后缀数组模板)
    【Luogu】P2709小B的询问(莫队算法)
    【Luogu】P2766最长不下降子序列问题(暴力网络流)
    【Luogu】P2486染色(树链剖分)
    【bzoj】P4407于神之怒加强版(莫比乌斯反演)
    【Luogu】P3343地震后的幻想乡(对积分概率进行DP)
    【Luogu】P2146软件包管理器(树链剖分)
    【Luogu】P3159交换棋子(超出我能力范围的费用流)
    【Luogu】P2569股票交易(单调队列优化DP)
    【Luogu】P2219修筑绿化带(单调队列)
  • 原文地址:https://www.cnblogs.com/MRASdoubleZ/p/14786030.html
Copyright © 2011-2022 走看看