springboot第一天

springboot入门

一 SpringBoot 介绍

原有Spring优缺点分析

优点:

Spring是于2003 年兴起的一个轻量级的Java 开源框架。

Spring为企业级Java开发提供了一种相对简单的方法,通过IOC和AOP,用简单的Java对象(POJO)实现之前只有EJB才能完成的事情。

缺点:

虽然Spring的组件代码是轻量级的,但它在开发时整合的配置却是重量级的,比如:

  • 在管理整个项目依赖时,总是会发生jar包的版本冲突问题。
  • 项目添加一个框架或者技术时,需要导入的maven依赖太多。
  • 项目添加一个框架或者技术时,需要一个对应的xml配置文件。

SpringBoot 概述

SpringBoot对上述Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。

版本锁定

  • 解决是maven依赖版本容易冲突的问题,集合了常用的并且测试过的所有版本

起步依赖

  • 解决了完成某一个功能要整合的jar包过多的问题,集合了常用的jar包

自动配置

  • 解决了整合框架或者技术的配置文件过多,集合了所有的约定的默认配置

内置Tomcat

  • 通过内置的tomcat,无需再用其他外置的Tomcat就直接可以运行javaEE程序

总之:人们把Spring Boot 称为搭建程序的脚手架。其最主要作用就是帮我们快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。

之前实现ssm整合:2个小时时间

现在学习了springboot,完成ssm整合:10分钟

二 快速入门

需求:浏览器访问localhost:8080/hello, 返回hello, springboot!这句话

1 搭建环境

创建springboot-qucik模块,导入依赖

<!--继承springboot的父工程-->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
</parent>

<!--依赖管理-->
<dependencies>
    <!--web环境起步依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

2 UserController

@RestController
public class UserController {

    @RequestMapping("/hello")
    public String hello() {
        return "Hello SpringBoot~~~";
    }
}

3 启动类

放在父包下.例如:com.itheima

@SpringBootApplication// 表示当前是一个springboot环境的启动类
public class QuickApplication {

    public static void main(String[] args) {
        SpringApplication.run(QuickApplication.class,args);
    }
}

4 启动并测试

三 入门解析

1 版本锁定

我们项目继承了spring-boot-starter-parent父工程,它内部有一堆已经指定好的版本号,组合了一套最优搭配的技术版本。

2 起步依赖

在各种starter中,定义了完成该功能需要的坐标合集,其中大部分版本信息来自于父工程。

spring官网中,提供了大量功能的起步依赖,大家可以直接使用

https://docs.spring.io/spring-boot/docs/2.2.2.RELEASE/reference/html/using-spring-boot.html#using-boot-starter

例如:

很多第三方技术也提供了与springboot整合的起步依赖,比如:mybatis

  • 下次课咱们讲如何自定义起步依赖

3 自动配置

springboot是基于约定的,大家约定好的,都这么用,所以很多配置都有默认值。

**比如说:**tomcat默认端口 8080、redis 默认端口6379 、session 的过期默认时间为30m等等

搜索:spring-configuration-metadata.json

四 配置文件

1 自定义配置文件

SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,可以通过在resources下创建文件:

  • application.yml
  • application.yaml
  • application.properties

注意:如果多个配置文件同时配置了相同的内容,SpringBoot以properties文件为准。

2 YAML简介

YAML 是专门用来写配置文件的语言,非常简洁和强大,远比 xml 、properties格式方便。

YAML语法

# 严格区分大小写,层级之间使用缩进表示,属性值和冒号之间必须有空格
server:
  port: 8082

YAML数据格式:

# 简单类型,特殊:username  和 name 不要指定
nickname: jack

# 对象类型
user:
  username: lucy #也可以使用${nickname}获取上面定义的jack
  age: 18

# 集合类型
addresList:
  - '北京'
  - '上海'
  - '广州'

3 读取配置文件

@Value

此注解是Spring框架提供的,用来读取配置文件中的属性值并逐个注入到Bean对象的对应属性中。

Environment

此对象是Spring框架提供的,用来表示整个应用运行时的环境,可以读取配置文件中的属性值并逐个注入到Bean对象的对应属性中。

@ConfigurationProperties

此注解是Spring Boot框架提供的,用来快速、方便地将配置文件中的自定义属性值批量注入到某个Bean对象的多个对应属性中。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

五 了解启动流程

六 整合其它框架

1 整合Junit

spring官方提供了junit起步依赖,在pom.xml当中导入即可

<!--引入junit起步依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>
@SpringBootTest//声明这是springboot测试类 注意放到扫描的包及其子包下
//@SpringBootTest(classes = QuickApp.class)//声明这是springboot测试类,且指定启动类
@RunWith(SpringRunner.class)
//@RunWith(SpringJUnit4ClassRunner.class)//也可以
public class TestJunit {

    @Autowired
    PersonProperties personProperties;

    @Test
    public void test0() {
        System.out.println(personProperties);
    }

}

2 整合SpringMVC

访问静态资源

现在,我们的项目是一个jar工程,那么就没有webapp,我们的静态资源该放哪里呢?

springboot启动时,加载org.springframework.boot.autoconfigure.web.ResourceProperties资源属性类

拦截器配置

拦截器也是我们经常需要使用的,在SpringBoot中该如何配置呢?

自定义一个springMVC拦截器类,实现 HandlerInterceptor 接口

@Component
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("拦截了请求。。。。");
        return true;
    }
}

自定义一个springMVC的配置类,实现WebMvcConfigurer接口

@Configuration // web环境的配置类,添加自定义拦截器
public class MyWebConfig implements WebMvcConfigurer {

    @Autowired
    private MyInterceptor myInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor)
                .addPathPatterns("/**")// 指定拦截路径
                .excludePathPatterns("/a1.png");// 排除某个资源
    }
}

3 整合Mybatis -理解

环境搭建

① 导入起步依赖
<!--mysql驱动:不使用默认高版本锁定-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>
<!--mybatis起步依赖:spring官方没有进行版本锁定-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.1</version>
</dependency>


② 导入数据库
CREATE DATABASE `springboot_db`;
USE `springboot_db`;

CREATE TABLE `tb_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `username` varchar(20) NOT NULL COMMENT '用户名',
  `password` varchar(20) NOT NULL COMMENT '密码',
  `nick_name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `age` int(11) DEFAULT NULL COMMENT '年龄',
  `email` varchar(50) DEFAULT NULL COMMENT '邮箱',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

insert  into `tb_user`(`id`,`username`,`password`,`nick_name`,`age`,`email`) values (1,'zhangsan','123456','张三',18,'test1@itcast.cn'),(2,'lisi','123456','李四',20,'test2@itcast.cn'),(3,'wangwu','123456','王五',28,'test3@itcast.cn'),(4,'zhaoliu','123456','赵六',21,'test4@itcast.cn'),(5,'tianqi','123456','田七',24,'test5@itcast.cn');

代码实现

① User实体
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    private Integer id;
    private String username;
    private String password;
    private String nickName;
    private Integer age;
    private String email;
}

② UserMapper接口和映射
image-20210612225913872
// @Mapper // 告诉springboot创建此接口的mapper代理对象,每个mapper接口上都需要加(麻烦)
public interface UserMapper {
    
    List<User> findAll();
}

映射文件不需要和接口同名同包了

<?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.itheima.mapper.UserMapper">

    <select id="findAll" resultType="User">
        select * from tb_user
    </select>

</mapper>

③ application.yml配置

数据源(连接池)、mybatis

# 数据源配置(2.0版本之后内置hikariCP连接池)
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/springboot_db
    username: root
    password: 1234 # 注意 springboot连接数据库时 密码为纯数字有可能报错

# mybatis配置
mybatis:
  mapper-locations: classpath:mapper/** # 扫描并加载mapper映射文件
  type-aliases-package: com.itheima.pojo # 实体别名
  configuration:
    map-underscore-to-camel-case: true # 开启驼峰映射
    
# 开启日志
logging:
  level: 
    com.itheima: debug  # 日志级别:warn、info、debug

④ 启动类
⑤ 单元测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class MybatisTest {

    @Autowired
    private UserMapper userMapper; // 这里面注入报错不用管

    @Test
    public void test01()throws Exception{
        List<User> list = userMapper.findAll();
        for (User user : list) {
            System.out.println(user);
        }
    }
}

Druid连接池

我们在整合mybatis时发现,springboot 2.2.0版本之后,内置了HiKariCP连接池,那如何替换成阿里的druid连接池

① 导入druid依赖
<!--druid依赖-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.9</version>
</dependency>

② 修改application.yml

4 整合Mybatis Plus

简介

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行。

官网:https://mybatis.plus/

快速入门

需求

完成用户列表查询

大体步骤

  1. 导依赖,
  2. 写启动类
  3. 写实体–指定和那张表映射 @TableName
  4. 写mapper–继承BaseMapper
  5. 配置数据源
① 创建java模块,导入依赖
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
</parent>


<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <!--mysql驱动-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <!--mybatisPlus 起步依赖-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.4.0</version>
    </dependency>
</dependencies>

② 启动类
@SpringBootApplication // 启动类
@MapperScan("com.itheima.mapper") // 扫描包创建mapper代理对象
public class MPApplication {

    public static void main(String[] args) {
        SpringApplication.run(MPApplication.class, args);
    }
}

③User实体
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("tb_user") // 指定表名
public class User {


    // 下面的成员属性需要与表中字段一一对应,默认开启了驼峰映射
    private Long id;
    private String username;
    private String password;
    private String nickName;
    private Integer age;
    private String email;
}

④ UserMapper接口
public interface UserMapper extends BaseMapper<User> { // 继承父接口,自动生成CRUD方法
}

⑤ application.yml配置

数据源配置、开启日志

# 数据源配置(2.0版本之后内置hikariCP连接池)
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/springboot_db
    username: root
    password: root 
    
    
# 开启日志
logging:
  level:
    com.itheima: debug  # 日志级别:warn、info、debug

⑥ 单元测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class MPTest {

    @Autowired
    private UserMapper userMapper;


    @Test
    public void test01()throws Exception{
        List<User> list = userMapper.selectList(null);
        for (User user : list) {
            System.out.println(user);
        }
    }
}

CRUD

就是来学习BseMapper提供的API方法

@SpringBootTest
@RunWith(SpringRunner.class)
public class TestMP {

    @Autowired
    UserMapper userMapper;

    @Test
    public void testFindAll() {
        List<User> list = userMapper.selectList(null);
        for (User user : list) {
            System.err.println(user);
        }
    }


    @Test
    public void testInsert() {
        //创建一个user对象,底层默认就是动态sql
        User user = new User();
        user.setUsername("xionger2");
        user.setPassword("123");
        user.setNickName("熊二");

        userMapper.insert(user);

        System.err.println(user.getId());
    }

    @Test
    public void testUpdate() {
        //创建一个user对象,底层默认就是动态sql
        User user = new User();
        user.setId(1403921804690546690L);
        user.setUsername("xiaoer");
        user.setNickName("小二");
        user.setAge(22);

        userMapper.updateById(user);

    }

    @Test
    public void testDelete() {
        userMapper.deleteById(1403921804690546690L);
    }

    @Test
    public void testFindById() {
        User user = userMapper.selectById(1);
        System.out.println(user);
    }
}

条件查询

官网QueryWrapper用于生成 sql 的 where 条件

查询方法说明
eq等于=
ne不等与<>
gt大于>
ge大于等于>=
lt小于<
le小于等于<=
like模糊查询 LIKE
notLike模糊查询 NOT LIKE
inIN 查询
notInNOT IN 查询
isNullNULL 值查询
isNotNullIS NOT NULL
@Test
public void testFindByCondition() {
    //创建条件对象
    QueryWrapper<User> qw = new QueryWrapper<>();

    qw.gt("age",18).likeRight("username","li").orderByDesc("age");
    //qw.likeRight("username","li");// li%
    //qw.likeLeft("username","li");// %li
    //qw.like("username","li");//%li%



    List<User> users = userMapper.selectList(qw);
    for (User user : users) {
        System.out.println(user);
    }
}

自定义sql

在实际开发中,有些特殊需求,可能mp没有实现此功能,没关系我们可以自定义扩展

内置分页插件

@Configuration //加入spring容器
public class MPConfig {

    @Bean
    public MybatisPlusInterceptor createPageInterceptor(){
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();

        //添加mysql的分页插件
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

        return mybatisPlusInterceptor;
    }
}

测试代码

@Test
public void testFindByPage() {
    //设置分页参数(第几页,每页显示的条数)
    Page<User> page = new Page<>(2, 5);


    page = userMapper.selectPage(page, null);

    //输出总记录数
    System.out.println(page.getTotal());

    //输出当前页的list
    List<User> list = page.getRecords();
    for (User user : list) {
        System.err.println(user);
    }
}

七 扩展-热部署

在开发过程中,通常会对一段业务代码不断地修改测试,在修改之后往往需要重启服务,有些服务需要加载很久才能启动成功,这种不必要的重复操作极大的降低了程序开发效率。为此,Spring Boot框架专门提供了进行热部署的依赖启动器,用于进行项目热部署,而无需手动重启项目

  1. pom.xml
<!-- 引入热部署依赖 -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-devtools</artifactId>
</dependency>

  1. 选择IDEA工具界面的【File】->【Settings】选项,打开Compiler面板设置页面
  1. 在项目任意页面中使用组合快捷键“Ctrl+Shift+Alt+/”打开Maintenance选项框,选中并打开Registry
  1. 找到“compiler.automake.allow.when.app.running”,将该选项后的Value值勾选
  1. 想让修改后的代码立即生效,ctrl+F9
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值