文章目录

1. SpringBoot简介

1.1 原有Spring的优缺点分析

1.1.1 Spring的优点

spring是Java企业版(Java Enterprise Edition,简称J2EE)的轻量级替代品,无需开发重量级的(Enterprise JavaBean 简称EJB),Spring为企业级开发提供的相对简单的方法,通过依赖注入和面向切面编程,用简单的JavaBean对象实现EJB功能。

1.1.2 Spring的缺点

虽然Spring的组件代码是轻量级的,但事实配置却是重量级的,从一开始Spring使用XML配置。而且是很多的XML配置。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身的显示XML配置。Spring 3.0引入基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML。
Spring虽然实用,但是这些配置文件的都代表了开发时的消耗,除此之外,项目的依赖管理也是一件耗时耗力的事情。在环境搭建是,需要引入库的坐标,而且还需要分析导入已之有以来的其它库的坐标,一旦选错版本,随之而来的不兼容问题将会影响到项目的开发进度。

1.2 SpringBoot的核心功能

  • 起步依赖:
    起步依赖本质上是一个Maven的项目对象模型POM,定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。
    简单的说:起步依赖就是将具备某种功能的坐标打包在一起,并提供一些特定的功能。
  • 自动配置:
    SpringBoot的自动配置是一个运行时(更准确的说,是程序启动时)的过程,考虑众多因素,才决定Spring配置应该用那个,不应该用哪个,该过程是Spring自动完成的,例如SqlSessionFactory的dataSource注入。

1.3 SpringBoot的概述

1.3.1 SpringBoot解决上述Spring的缺点

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

1.3.2 SpringBoot的特点

  1. 为Spring开发者提供更快的入门体验。
  2. 开箱即用,无需XML的配置,同时可以修改默认值来满足特定的需求。
  3. 提供了一些大型项目的非功能性特性,如嵌入式服务器(Tomcat),安全,指标,健康检测,外部配置等。
  4. SpringBoot不是对Spring功能上的增强,而是提供一种快速使用Spring的方式。

2. SpringBoot快速入门

2.1 代码实现(四步搞定)

2.1.1 创建Maven工程,不用选择骨架创建



2.1.2 添加SpringBoot起步依赖

项目要求继承SpringBoot的起步依赖spring-boot-starter-parent

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>

SpringBoot集成SpringMVC进行Controller的开发,所以还必须web的启动依赖

<!--web过程的起步依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.1.3 编写SpringBoot引导类

//声明该类是一个SpringBoot引导类
@SpringBootApplication
@ComponentScan(basePackages = "com.liuzeyu.controller")
public class MySpringApplication {
   
    public static void main(String[] args) {
   
    //run方法表示运行SpringBoot,参数则是SpringBoot引导类得字节码对象
        SpringApplication.run(MySpringApplication.class);
    }
}

2.1.4 编写Controller类

@Controller
public class QuickController {
   

    @RequestMapping("/quick")
    @ResponseBody
    public String quick(){
   
        return "hello springboot";
    }
}

项目启动:


  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.0.1.RELEASE)

2020-05-06 23:30:04.026  INFO 25680 --- [           main] MySpringApplication                      : Starting MySpringApplication on DESKTOP-28EHRNP with PID 25680 (D:\JavaProject\springboot\spring01_quick\target\classes started by liuzeyu in D:\JavaProject\springboot)
2020-05-06 23:30:04.029  INFO 25680 --- [           main] MySpringApplication                      : No active profile set, falling back to default profiles: default
2020-05-06 23:30:04.133  INFO 25680 --- [           main] ConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@4ae3c1cd: startup date [Wed May 06 23:30:04 CST 2020]; root of context hierarchy
2020-05-06 23:30:06.326  INFO 25680 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2020-05-06 23:30:06.369  INFO 25680 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2020-05-06 23:30:06.369  INFO 25680 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.29
2020-05-06 23:30:06.381  INFO 25680 --- [ost-startStop-1] o.a.catalina.core.AprLifecycleListener   : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [C:\Program Files\Java\jdk1.8.0_144\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\ProgramData\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Java\jdk1.8.0_144\bin;C:\ProgramData\Microsoft\Windows\Start Menu\Programs\MySQL\MySQL Server 5.7;D:\DevelopTools\git\Git\Git\cmd;C:\Users\liuze\AppData\Local\Microsoft\WindowsApps;;.]
2020-05-06 23:30:06.573  INFO 25680 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2020-05-06 23:30:06.573  INFO 25680 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 2450 ms
2020-05-06 23:30:06.775  INFO 25680 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Servlet dispatcherServlet mapped to [/]
2020-05-06 23:30:06.783  INFO 25680 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*] 2020-05-06 23:30:06.783 INFO 25680 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*] 2020-05-06 23:30:06.783 INFO 25680 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*] 2020-05-06 23:30:06.783 INFO 25680 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*] 2020-05-06 23:30:06.972 INFO 25680 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2020-05-06 23:30:07.245  INFO 25680 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@4ae3c1cd: startup date [Wed May 06 23:30:04 CST 2020]; root of context hierarchy
2020-05-06 23:30:07.332  INFO 25680 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/quick]}" onto public java.lang.String com.liuzeyu.controller.QuickController.quick()
2020-05-06 23:30:07.337  INFO 25680 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2020-05-06 23:30:07.338  INFO 25680 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2020-05-06 23:30:07.365  INFO 25680 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2020-05-06 23:30:07.365 INFO 25680 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler] 2020-05-06 23:30:07.555 INFO 25680 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup 2020-05-06 23:30:07.603 INFO 25680 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2020-05-06 23:30:07.607 INFO 25680 --- [ main] MySpringApplication : Started MySpringApplication in 4.054 seconds (JVM running for 4.757) 2020-05-06 23:31:19.373 INFO 25680 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring FrameworkServlet 'dispatcherServlet' 2020-05-06 23:31:19.373 INFO 25680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization started 2020-05-06 23:31:19.394 INFO 25680 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 21 ms 

访问页面:

OK,入门案例到此为止。

2.2 SpringBoot工程热部署

我们在开发中反复修改类、页面等资源,每次修改后都是需要重新启动才生效,这样每次启动都很麻烦,浪费了大量的时间,我们可以在修改代码后不重启就能生效,配置步骤如下

  1. 在pom.xml中添加依赖
 <!--热部署配置-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-devtools</artifactId>
 </dependency>
  1. 打开idea得setting设置compiler
  2. 设置Registry,使用快捷键,shift+alt+ctrl+/

2.3 使用IDEA快速创建SpringBoot项目

  1. 新建Module,选择Spring Initializr

  2. 注意要选择springboot启动时需要的依赖
  3. finish即可

    建立好的项目目录:

启动类:

@SpringBootApplication
public class Spring02Quick02Application {
   

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

}

通过idea快速创建的SpringBoot项目的pom.xml中已经导入了我们选择的web的起步依赖的坐标

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.2.6.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.liuzeyu</groupId>
	<artifactId>spring02_quick02</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>spring02_quick02</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

同样可以实现上述的入门案例。

3. SpringBoot原理分析(深入源码)

3.1 起步依赖原理分析

3.1.1 spring-boot-starter-parent分析

进入pom.xml,按住Ctrl进入spring-boot-starter-parent
可以看到springboot启动时回去加载

这些文件是干嘛的呢?
其实是我们修改覆盖springboot为我们提供一些约定配置。
按住Ctrl进入

可以看到springboot为我们事先准备的插件及版本好依赖等信息,所以我们的SpringBoot工程继承spring-boot-starter-parent后已经具备版本锁定等配置了,所以起步依赖的作用就是进行依赖的传递

3.1.2 spring-boot-starter-web分析

按住Ctrl进入spring-boot-starter-web

可以看到里面定义了一系列web应用用到的jar包坐标,如mvc坐标,tomcat等…这样我们的工程只要引入spring-boot-starter-web起步依赖的坐标就可以进行web开发了,同样体现了依赖传递的作用。

3.2 自动配置原理分析

自动化配置需要从启动类的@SpringBootApplication进入查看

看到一大推元注解

进入@SpringBootConfiguration看到这是一个Spring的配置注解,作用在启动类上,说明启动类是一个配置类

@ComponentScan则是SpringBoot的默认包扫描机制,默认扫描启动类所在的包的同级目录和子包所在的目录。
比较重要的是注解@EnabledAutoConfiguration,作用则是开始自动配置,进入看看

关注上面这个导入的配置类,它有大作为,进入里面观察这个方法

这个方法在于从配置文件中获取到配置类配置的默认信息,这个配置文件在spring.factories,放在

进入发现了这个是一个存放配置类的全限定包名。
假设我们要去查看Tomcat的默认配置
进入spring-configuration-metadata.json查看到默认端口号

最后如果我们需要默认修改项目启动的tomcat端口号,在resource下新建application.properties

日志信息:

访问 http://127.0.0.1:8089/demo/quick

4. SpringBoot配置文件

4.1 SpringBoot配置文件类型

4.1.1 SpringBoot配置文件类型和作用

SpringBoot是基于约定的,所以很多的配置都具有默认值,如果想要用自己的配置替换掉默认的配置,就可以使用application.properties或者application.yml(yaml)进行配置。
SpringBoot启动时,会默认从resources下加载 application.properties或者application.yml(yaml),其中application.properties是键值对类型文件,如下:

除了键值对的配置方式,SpringBoot还提供了yml的配置。

4.1.2 application.yml配置文件

4.1.2.1 yml配置文件简介

YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简洁。

YML文件的扩展名可以使用.yml或者.yaml。

4.1.2.2 yml配置文件的语法
4.1.2.2.1 普通字符串数据
server:
  port: 8085

student:
  name: liuzeyu
  age: 20


另外之前配置的application.properties端口号是

server.port=8089

项目启动后会使用哪一个?
使用8089,为什么呢?,因为配置文件加载顺序下面的覆盖上面的

如果注释掉application.properties

#server.port=8089

则使用application.yml

4.1.2.2.2 对象数据

语法:

​	key: 

​		key1: value1

​		key2: value2

​	或者:

​	key: {
   key1: value1,key2: value2}

示例代码:

   person:                       # person对象
      pid: 350322
      pname: liu
      addr: fujian
4.1.2.2.3 Map数据

与对象数据写法一样

   person:                       # map对象对象
      pid: 350322					# key : value
      pname: liu
      addr: fujian
4.1.2.2.1 数组(List,Set)数据
语法: 

​	key:- value1

​		- value2

或者:

​	key: [value1,value2]
citys:
  -beijing
  -tianjing
  -xiameng
# citys: [beijing,tianjing,xiameng]

集合对象数据

# 集合对象数据
  - name: zhangsan
    age: 18
    score: 100
  - name: lisi
    age: 28
    score: 88
  - name: wangwu
    age: 38
    score: 90

注意 : - 与value1存在一个空格。

4.1.3 SpringBoot配置信息的查询

SpringBoot的配置文件,主要的目的就是对配置信息进行修改的,但在配置时的key从哪里去查询呢?我们可以查阅SpringBoot的官方文档
查看配置信息官方文档

查用的配置信息摘抄:

# QUARTZ SCHEDULER (QuartzProperties)
spring.quartz.jdbc.initialize-schema=embedded # Database schema initialization mode.
spring.quartz.jdbc.schema=classpath:org/quartz/impl/jdbcjobstore/tables_@@platform@@.sql # Path to the SQL file to use to initialize the database schema.
spring.quartz.job-store-type=memory # Quartz job store type.
spring.quartz.properties.*= # Additional Quartz Scheduler properties.

# ----------------------------------------
# WEB PROPERTIES
# ----------------------------------------

# EMBEDDED SERVER CONFIGURATION (ServerProperties)
server.port=8080 # Server HTTP port.
server.servlet.context-path= # Context path of the application.
server.servlet.path=/ # Path of the main dispatcher servlet.

# HTTP encoding (HttpEncodingProperties)
spring.http.encoding.charset=UTF-8 # Charset of HTTP requests and responses. Added to the "Content-Type" header if not set explicitly.

# JACKSON (JacksonProperties)
spring.jackson.date-format= # Date format string or a fully-qualified date format class name. For instance, `yyyy-MM-dd HH:mm:ss`.

# SPRING MVC (WebMvcProperties)
spring.mvc.servlet.load-on-startup=-1 # Load on startup priority of the dispatcher servlet.
spring.mvc.static-path-pattern=/** # Path pattern used for static resources. spring.mvc.view.prefix= # Spring MVC view prefix. spring.mvc.view.suffix= # Spring MVC view suffix. # DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties) spring.datasource.driver-class-name= # Fully qualified name of the JDBC driver. Auto-detected based on the URL by default. spring.datasource.password= # Login password of the database. spring.datasource.url= # JDBC URL of the database. spring.datasource.username= # Login username of the database. # JEST (Elasticsearch HTTP client) (JestProperties) spring.elasticsearch.jest.password= # Login password. spring.elasticsearch.jest.proxy.host= # Proxy host the HTTP client should use. spring.elasticsearch.jest.proxy.port= # Proxy port the HTTP client should use. spring.elasticsearch.jest.read-timeout=3s # Read timeout. spring.elasticsearch.jest.username= # Login username. 

我们可以通过配置application.poperties 或者 application.yml 来修改SpringBoot的默认配置
例如:application.poperties

server.port=8089
server.servlet.context-path=/demo

或者 application.yml

server:
  port: 8085
  servlet:
    context-path: /demo

4.2 配置文件与配置类的属性映射方式

  1. 注解@Value获取配置文件的
person:
  name: liuzeyu
  age: 20

controller:

@Controller
public class Quick2Controller {
   
    @Value("${person.name}")
    private String name;
    @Value("${person.age}")
    private Integer age;

    @RequestMapping("/quick2")
    @ResponseBody
    public String quick2(){
   
        return "name:"+name+"age:"+age;
    }
}

访问:http://127.0.0.1:8888/demo/quick2

  1. ConfigurationProperties注解映射

获取配置文件

person:
  name: liuzeyu
  age: 20
  money: 0

controller类:

@ConfigurationProperties("person")
@Controller
public class Quick3Controller {
   

    private String name;
    private Integer age;
    private Double money;

    @RequestMapping("/quick3")
    @ResponseBody
    public String quick3(){
   
        return "name:"+name+" age:"+age+" money :"+money;
    }

    public void setName(String name) {
   
        this.name = name;
    }
    
    public void setAge(Integer age) {
   
        this.age = age;
    }
    
    public void setMoney(Double money) {
   
        this.money = money;
    }
}

访问:http://127.0.0.1:8888/demo/quick3

补充:
添加依赖

<!--spring-boot配置处理器:用于提示代码-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

可以为controller类中提供setter方法后,在yml中的配置可以有提示信息,提高开发效率。

注意
@Value适用于字段较少的情况下,而@ConfigurationProperties适用于多字段,但是需要提供setter方法和getter方法才能映射成功。
<mark>最后一定要注意yml的书写格式,严格按照第一个key值顶格书写</mark>

4. SpringBoot整合MyBatis

新建工程,采用IDEA快速搭建springboot项目,详细步骤见2.3

4.1 添加MyBatis的起步依赖

      <!--添加MyBatis起步依赖-->
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>1.1.1</version>
</dependency>

4.2 添加数据库驱动坐标

<!--添加数据库驱动坐标-->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
</dependency>

4.3 application.properties添加数据库连接信息

#添加数据库连接信息替换原有的约定配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=809080


这些key哪里找到的呢?
打开springboot自动配置的spring-configuration-metadata.json文件

4.4 创建user数据库表

-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL,
  `password` varchar(50) DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('10', 'liuzeyu12a', '809080', 'liuzeyu');
INSERT INTO `user` VALUES ('11', 'zhangsan', '123', 'zhang');

4.5 创建实体类User

public class User {
   
    // 主键
    private Long id;
    // 用户名
    private String username;
    // 密码
    private String password;
    // 姓名
    private String name;
  
    //此处省略getter和setter方法 .. .. 
}

4.6 创建Mapper接口

@Mapper
public interface UserMappper {
   
    public List<User> queryForList();
}

@Mapper:

  1. 将UserMappper 接***给spring管理了
  2. 为这个接口创建一个实现类,让别的类来引用

4.7 配置Mapper映射文件

<?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.liuzeyu.mapper.UserMappper">
    <select id="queryForList" resultType="user">
        SELECT * from user
    </select>
</mapper>

4.8 在application.properties中添加mybatis的信息

#spring集成mybatis环境
#pojo扫描包,取别名
mybatis.type-aliases-package=com.liuzeyu.domain
#加载mybatis映射文件
mybatis.mapper-locations=classpath:mapper/*Mapper.xml 

4.9 controller类的编写

@Controller
public class UserController {
   

    @Autowired
    private UserMappper userMappper;

    @RequestMapping("queryList")
    @ResponseBody
    public List<User> queryForUsers(){
   
        return userMappper.queryForList();
    }
}

4.10 测试

5. SpringBoot整合Junit

5.1 添加Junit的起步依赖

<!--测试的起步依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

5.2 编写测试类

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Spring03MybatisApplication.class)
public class MapperTest {
   

    @Autowired
    private UserMappper userMappper;
    @Test
    public void test(){
   
        List<User> users = userMappper.queryForList();
        System.out.println(users);
    }
}

我们之前spring整合junit在测试类上加的注解是

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = SpringConfig.class)

SpringRunner类继承于SpringJUnit4ClassRunner,使用哪一个spring提供的测试引擎都可以

public final class SpringRunner extends SpringJUnit4ClassRunner {
   
    public SpringRunner(Class<?> clazz) throws InitializationError {
   
        super(clazz);
    }
}

@SpringBootTest属性传的是引导类的字节码对象,

5.3 控制台打印结果

5.4 优化代码

  1. 将配置文件接口映射注释掉
#加载mybatis映射文件
# mybatis.mapper-locations=classpath:mapper/*Mapper.xml 
  1. 将SQL语句写在注解里
@Mapper
public interface UserMappper {
   
    @Select("SELECT * from user")
    public List<User> queryForList();
}

这时@Mapper还有一个作用也就体现了出来:可以不用写XML配置文件

参考:黑马视频和笔记