springboot入门 -- 后附springboot整合mybatis与jpa测试案例
一、SpringBoot简介
1.1 原有Spring的优缺点
1.优点
Spring是JavaEE的轻量级替代品,为JavaEE开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java对象实现了EJB的功能。 -- 说白了就是让我们快速的使用Spring。
2.缺点
配置过于繁琐;
在环境搭建时,导入坐标之间版本的不兼容问题阻碍项目的开发。
1.2 SpringBoot概述
1.解决Spring的缺点
基于约定优于配置的思想,让开发人员不必在配置与逻辑业务之间进行思维的切换,专注于逻辑业务的代码编写中,提高开发效率。
2.SpringBoot的特点
为基于Spring的开发提供更快的入门体验;
开箱即用,没有代码生成,也无需XML配置,同时也可以修改默认值来满足特定的满足;
提供一些大型项目中的非功能性特性,如嵌入式服务器、安全、健康监测、外部配置等;
SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式。-- Spring有的功能SpringBoot都有。
3.SpringBoot的核心功能
起步依赖:
起步依赖本质上是一个Maven项目的对象模型(POM),定义了对其他库的传递依赖;
简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能;
自动配置:
SpringBoot的自动配置是一个运行时(程序启动时)的过程,决定Spring配置需要用哪个,不需要用哪个,SpringBoot自动完成该过程。
二、SpringBoot快速入门
2.1 入门Demo
-- SpringBoot在第一次加载依赖时很慢,请保持足够的耐心:(
1.创建Maven工程 -- 普通maven工程即可
2.添加SpringBoot的起步依赖spring-boot-starter-parent
1 <parent> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-parent</artifactId> 4 <version>2.0.1.RELEASE</version> 5 </parent>
SpringBoot要集成SpringMVC进行Controller的开发,所以项目要导入web的启动依赖
1 <dependencies> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-web</artifactId> 5 </dependency> 6 </dependencies>
3.编写SpringBoot引导类
通过SpringBoot提供的引导类起步SpringBoot才可以进行访问
1 @SpringBootApplication 2 public class MySpringBootApplication { 3 public static void main(String[] args) { 4 // run方法,表示运行SpringBoot的引导类,run里面的参数就是引导类的字节码文件 5 SpringApplication.run(MySpringBootApplication.class); 6 } 7 }
4.编写Controller
在引导类的MySpringBootApplication同级包中创建QuickStartController
1 @Controller 2 public class QuickStartController { 3 @RequestMapping("/quick") 4 @ResponseBody 5 public String quick(){ 6 return "SpringBoot访问成功"; 7 } 8 }
5.测试
执行SpringBoot引导类的main方法
打开浏览器访问url地址:http://localhost:8080/quick
这样子就是访问成功啦!!!!
2.2 快速入门解析
1.代码解析
@SpringBootApplication:标注SpringBoot的启动类,该注解具备多种功能(后面详细剖析);
SpringApplication.run(MySpringBootApplication.class) 代表运行SpringBoot的启动类,参数为SpringBoot启动类的字节码对象
2.SpringBoot工程热部署
在pom.xml中添加配置
1 <!--热部署配置--> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-devtools</artifactId> 5 </dependency>
注:在IDEA中初次进行热部署会失败,原因是IDEA默认情况下不会自动编译,需要对idea进行自动编译的设置。
Settings——>Build——>Compiler——>build project automatically(勾选)
然后shift+Ctrl+/,选择Registry——>compiler.automake.allow.when.app.running(勾选)
操作完成后先重启项目,然后对Controller中的返回字符串稍作修改
1 @Controller 2 public class QuickStartController { 3 @RequestMapping("/quick") 4 @ResponseBody 5 public String quick(){ 6 return "SpringBoot热部署成功"; 7 } 8 }
刷新刚刚的页面,页面刷新成功:)
3.使用IDEA快速创建SpringBoot项目
-- 需要在有网络连接(依赖导入超慢):(
这时我们会发现idea给我们创建的SpringBoot项目中的pom.xml已经导入了我们选组的web的起步依赖坐标以及一些其他的配置。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 6 <groupId>com.buwei</groupId> 7 <artifactId>springboot02</artifactId> 8 <version>0.0.1-SNAPSHOT</version> 9 <packaging>jar</packaging> 10 11 <name>springboot02</name> 12 <description>Demo project for Spring Boot</description> 13 14 <parent> 15 <groupId>org.springframework.boot</groupId> 16 <artifactId>spring-boot-starter-parent</artifactId> 17 <version>2.1.0.RELEASE</version> 18 <relativePath/> <!-- lookup parent from repository --> 19 </parent> 20 21 <properties> 22 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 23 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 24 <java.version>1.8</java.version> 25 </properties> 26 27 <dependencies> 28 <dependency> 29 <groupId>org.springframework.boot</groupId> 30 <artifactId>spring-boot-starter-web</artifactId> 31 </dependency> 32 33 <dependency> 34 <groupId>org.springframework.boot</groupId> 35 <artifactId>spring-boot-starter-test</artifactId> 36 <scope>test</scope> 37 </dependency> 38 </dependencies> 39 40 <build> 41 <plugins> 42 <plugin> 43 <groupId>org.springframework.boot</groupId> 44 <artifactId>spring-boot-maven-plugin</artifactId> 45 </plugin> 46 </plugins> 47 </build> 48 </project>
这里的话直接拷贝入门案例中的Controller进行访问就可以啦!!!
三、SpringBoot原理分析
。。。。先掌握使用。。。。。原理后面补充。。。。可以自己点进源码了解。。。。
反正也就是maven的依赖传递、注解后的自动装配等等等等。。。。
四、SpringBoot的配置文件
4.1 SpringBoot配置文件的类型
1.SpringBoot配置文件类型和作用
SpringBoot是基于约定的,所以很多配置都有默认值,如果想使用自己的配置来替换默认配置的话,就可以使用application.properties或application.yml(yaml)进行配置。
SpringBoot默认会从Resource陌路下加载application.properties或application.yml(yaml)文件,其中.properties文件的优先级高于.yml文件,下面主要对yml文件进行讲解。
2.application.yml配置文件
简介:yml文件是YAML(YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的数据序列化格式,易阅读,可以与脚本语言交互,可以被支持YAML库的不同的编程语言程序导入,如:C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以文件是以数据为核心的,比传统的XML方式更加简洁。
yml文件的扩展名可以使用.yml或.yaml.
语法:
1.普通数据:key: value
1 name: buwei
注意:value之前有一个空格
2.对象数据:key:
key1: value1
key2: value2
或:key: {key1: value1,key2: value2}
1 person: 2 name: buwei 3 age: 25 4 #或者 5 person: {name: buwei,age: 25}
注:key1前面的空格个数不限定,在yml语法中,相同缩进代表同一个级别
3.Map数据:同对象写法
4.数组(List、Set)数据:key:
- value1
- value2
或:key:[value1,value2]
1 city: 2 - beijing 3 - shanghai 4 - guangzhou 5 - shenzhen 6 #或者 7 city: [beijing,shanghai,guangzhou,shenzhen]
注:value和 - 之间有一个空格
5.集合中元素为对象形式时
1 student: 2 - name: zhangsan 3 age: 18 4 - name: lisi 5 age: 2 6 #或者 7 student:[{name: zhangsan, age: 18},{name: lisi, age: 20}]
上面的关于SpringBoot的配置文件,主要目的是对是SpringBoot中默认的配置信息进行修改的,关于相关的配置格式可以查询spring的官网。
4.2 配置文件与配置类的属性映射方式
1.使用注解@Value映射
我们通常使用@Value注解将配置文件中的值映射到一个Spring管理的Bean的字段上。
application.properties配置如下:
1 person: 2 name: buwei 3 age: 18
在Java代码中:
1 @Value("${person.name}") 2 private String name; 3 @Value("${person.age}") 4 private Integer age;
2.使用注解@ConfigurationProperties映射
通过注解@ConfigurationProperties(prefix = "配置文件中的key的前缀")可以将配置文件中的配置自动与实体进行映射。
补充(非必须):在pom.xml中添加依赖 -- 如果是在先Java代码中配置好成员属性后然后再来补充配置文件的话可以在书写时获得相应的提示。
1 <!--@ConfiguaritionProperties的执行器的配置--> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-configuration-processor</artifactId> 5 <optional>true</optional> 6 </dependency>
application.yml配置如下:作用同application.properties
1 person: 2 name: zhangsan 3 age: 18
实体Bean中的代码如下:
1 @Controller 2 @ConfigurationProperties(prefix = "person") 3 public class QuickStartController02 { 4 private String name; 5 private Integer age; 6 7 @RequestMapping("/quick") 8 @ResponseBody 9 public String quick(){ 10 return "person中的name="+name+",age="+age; 11 } 12 13 public String getName() { 14 return name; 15 } 16 17 public void setName(String name) { 18 this.name = name; 19 } 20 21 public Integer getAge() { 22 return age; 23 } 24 25 public void setAge(Integer age) { 26 this.age = age; 27 } 28 }
使用@ConfigurationProperties注解,对应的实体字段必须提供set方法,使用@Value方法不必提供set方法。
五、SpringBoot整合其他技术
5.1 SpringBoot整合Mybatis
1.添加Maven坐标依赖 -- 注意这里的Mybatis中的依赖是由Mybatis提供的
1 <!--mybatis起步依赖--> 2 <dependency> 3 <groupId>org.mybatis.spring.boot</groupId> 4 <artifactId>mybatis-spring-boot-starter</artifactId> 5 <version>1.1.1</version> 6 </dependency> 7 8 <!-- MySQL连接驱动 --> 9 <dependency> 10 <groupId>mysql</groupId> 11 <artifactId>mysql-connector-java</artifactId> 12 </dependency>
2.添加数据库的连接信息
-- 下面红色部分的配置可能是受我SpringBoot的版本信息的影响,我这里引的SpringBoot的版本是2.1.0,降低版本可以用我们早先常用的配置。
1 #DB Configuration: 2 spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver 3 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot_mybatis?serverTimezone=UTC 4 useUnicode=true&characterEncoding=utf8 5 spring.datasource.username=root 6 spring.datasource.password=root
注:第一个红色位置是新版数据库连接驱动:使用旧的驱动控制台会打印 -- Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary。意思就是这个驱动已经过时,而且访问controller的时候会报错,不是很懂是什么原因,反正使用了就没错,同时还需要结合第二个标注位置一起才能完全解决问题。
第二个红色位置是为了解决连接mysql的jdbc驱动最新版引发的问题,没有配置的话在访问controller的时候会报一个异常:java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
3.在数据库中创建user表
1 DROP TABLE IF EXISTS `user`; 2 CREATE TABLE `user` ( 3 `id` int(11) NOT NULL AUTO_INCREMENT, 4 `username` varchar(50) DEFAULT NULL, 5 `password` varchar(50) DEFAULT NULL, 6 PRIMARY KEY (`id`) 7 ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; 8 -- ---------------------------- 9 INSERT INTO `user` VALUES ('1', 'zhangsan', '123'); 10 INSERT INTO `user` VALUES ('2', 'lisi', '123');
打开表查看信息:
4.创建实体User类
1 public class User { 2 private Long id; // 主键id 3 private String username;// 用户名 4 private String password;// 密码 5 //省略getter和setter方法 6 }
5.编写Mapper接口
1 @Mapper 2 public interface UserMapper { 3 public List<User> queryUserList(); 4 }
注:@Mapper标记该类是一个mybatis的Mapper接口,可以被SpringBoot自动扫描到Spring的上下文中。
6.配置mapper接口映射文件
在src\main\resource下与UserMapper同级目录下加入UserMapper.xml配置文件
1 <?xml version="1.0" encoding="utf-8" ?> 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 3 "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > 4 <mapper namespace="com.buwei.mapper.UserMapper"> 5 <select id="queryUserList" resultType="user"> 6 select * from user 7 </select> 8 </mapper>
7.编写引导类
1 @SpringBootApplication 2 public class SpringBootMybatisApplication { 3 public static void main(String[] args) { 4 SpringApplication.run(SpringBootMybatisApplication.class, args); 5 } 6 }
8.在application.properties中添加mybatis的信息
1 #spring集成Mybatis环境 2 #pojo别名扫描包 3 mybatis.type-aliases-package=com.buwei.entity 4 #加载Mybatis映射文件 5 mybatis.mapper-locations=classpath:com/buwei/mapper/*Mapper.xml
9.编写Controller
1 @Controller 2 public class MapperController { 3 @Autowired 4 private UserMapper userMapper; 5 6 @RequestMapping("/queryUser") 7 @ResponseBody 8 public List<User> queryUser(){ 9 List<User> users = userMapper.queryUserList(); 10 return users; 11 } 12 }
10.测试
执行引导类SpringBootMybatisApplication的main方法,然后访问URL:http://localhost:8080/queryUser,成功获取数据库中数据,可对比上面数据库表中信息。
5.2 SpringBoot整合Junit -- 在整合mybatis的工程中进行
1.添加Junit坐标依赖
1 <!--测试的起步依赖--> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-test</artifactId> 5 <scope>test</scope> 6 </dependency>
2.编写测试类
1 @RunWith(SpringRunner.class) 2 @SpringBootTest(classes = SpringBootMybatisApplication.class) 3 public class SpringBootMybatisApplicationTests { 4 @Autowired 5 private UserMapper userMapper; 6 @Test 7 public void test() { 8 List<User> users = userMapper.queryUserList(); 9 System.out.println(users); 10 } 11 12 }
运行测试方法,控制台打印输出,运行成功
其中:SpringRunner继承自SpringUnit4ClassRunner,使用哪一个Spring提供的测试测试引擎都可以
@SpringBootTest的属性指定的是引导类的字节码对象,貌似后面括号里面的内容不写也是可以的:)
5.3 SpringBoot整合Spring Data JPA
这里需要创建新的工程,同样是用SpringBoot快速生成的方式
1.添加Spring Data Jpa与数据库驱动的坐标依赖
1 <!-- springBoot JPA的依赖 --> 2 <dependency> 3 <groupId>org.springframework.boot</groupId> 4 <artifactId>spring-boot-starter-data-jpa</artifactId> 5 </dependency> 6 7 <!-- MySQL连接驱动 --> 8 <dependency> 9 <groupId>mysql</groupId> 10 <artifactId>mysql-connector-java</artifactId> 11 </dependency>
2.添加application.properties中配置数据库和JPA的相关属性
1 #DB Configuration: 2 spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver 3 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot_mybatis?serverTimezone=UTC 4 useUnicode=true&characterEncoding=utf8 5 spring.datasource.username=root 6 spring.datasource.password=root 7 8 #JPA Configuration: 9 spring.jpa.database=MySQL 10 spring.jpa.show-sql=true 11 spring.jpa.generate-ddl=true 12 spring.jpa.hibernate.ddl-auto=update 13 spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
3.编写实体类
1 @Entity 2 public class User { 3 // 主键 4 @Id 5 @GeneratedValue(strategy = GenerationType.IDENTITY) 6 private Long id; 7 // 用户 8 private String username; 9 // 密码 10 private String password; 11 12 //省略getter和setter方法 13 14 }
上面之所以没有写@Column和@Table注解就是数据库中表名、字段名与类的类名、属性名一样。
4.编写UserRepository
1 public interface UserRepository extends JpaRepository<User,Long>{ 2 }
5.编写测试类
1 @RunWith(SpringRunner.class) 2 @SpringBootTest(classes = SpringBootJpaApplication.class) 3 public class SpringBootJpaApplicationTest { 4 @Autowired 5 private UserRepository userRepository; 6 @Test 7 public void test(){ 8 List<User> users = userRepository.findAll(); // findAll方法为JpaRepository中定义好的方法 9 System.out.println(users); 10 } 11 }
6.执行测试方法
控制台打印信息如上,到此,SpringBoot入门基础到这里就结束啦,后面还有其他的内容的话会再来补上,例如整合redis等等,文中所有案例均已经过测试,如有失误地方可在下方留言交流:)