SpringBoot基础知识入门总结(持续更新中......)
SpringBoot基础知识总结
一、Spring Boot框架核心配置文件——application.properties
application.properties可用于设置内嵌tomcat端口、设置上下文根(访问路径)、自定义参数、配置数据库连接信息、声明mapper文件路径等。
# 一、用于设置内嵌tomcat端口
server.port=8081
# 二、用于设置上下文根(访问路径)
server.servlet.context-path=/springboot
# 三、自定义参数
name=lisi
school.name=zzuli
school.website=www.zzuli.edu.cn
student.name=zhangsan
student.age=20
# 四、配置数据库连接信息
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/user_test
spring.datasource.name=root
spring.datasource.password=123456
# 五、声明mapper文件路径(mapper文件与接口分开时)
mybatis.mapper-locations=classpath:mapper/*.xml
二、yml与yaml文件
yml与yaml文件,其功能与.properties文件功能相同,但是书写格式有所相同。
当.properties文件与.yml或.yaml文件同时出现时,Spring Boot会以.properties文件的优先级最高进行引用。
# 设置tomcat端口及上下文根路径
server:
port: 8081
servlet:
context-path: /yml
# 四、配置数据库连接信息
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhsot:3306/user_test
name: root
password: 123456
# 五、声明mapper文件路径(mapper文件与接口分开时)
mybatis:
mapper-locations: classpath:mapper/*.xml
三、自定义配置映射
在application.properties文件中声明的参数,对于单个参数来说可以通过@Value注解的方式赋给指定变量,对于包含前缀的参数而言,需要使用Java对象,通过@Autowired注解进行变量的赋值。
package cn.krain.springboot.web;
import cn.krain.springboot.config.School;
import cn.krain.springboot.config.Student;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class IndexController {
@Value("${name}")
private String name;
@Autowired
private School school;
@Autowired
private Student student;
@RequestMapping("/say")
@ResponseBody
public String say(){
return "school.name="+school.getName()+" school.website="+school.getWebsite()+"-----student.name="+student.getName()+" student.age="+student.getAge();
}
}
四、多环境下核心配置文件application.properties的使用
在企业进行项目开发时,在开发阶段、测试阶段、正式发布阶段都会有对应的.properties文件,每个阶段的核心配置文件需要有严格的命名规则:application-dev.properties、application-test.properties、application-product.properties;然后在主配置文件中指定即可。
# 等号后面的值为application-后的字符串product/dev/test;使用测试版时如下:
spring.profiles.active=test
五、Spring Boot集成JSP
- 在pom文件中引入JSP依赖:
<!--引入Springboot内嵌tomcat对jsp的解析依赖-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
- 在main目录下创建webapp文件夹,并在Project Structure下指定该文件夹为web资源目录。
3. 点击OK,当webapp出现如下图标即成功。
4. 在application.properties文件中声明视图解析器
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.jsp
六、Spring Boot集成Mybatis(Mybatis逆向工程)
- pom文件中加入mysql和mybatis-springboot依赖。
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
- 配置反向工程配置文件GeneratorMapper.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 指定连接数据库的 JDBC 驱动包所在位置,指定到你本机的完整路径 -->
<classPathEntry location="D:\Program Files (x86)\maven_work\maven_repository\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar"/>
<!-- 配置 table 表信息内容体,targetRuntime 指定采用 MyBatis3 的版本 -->
<context id="tables" targetRuntime="MyBatis3">
<!-- 抑制生成注释,由于生成的注释都是英文的,可以不让它生成 -->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- 配置数据库连接信息 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/user_test" userId="root" password="123456"></jdbcConnection>
<!-- 生成 model 类,targetPackage 指定 model 类的包名,需要修改为自己的包目录, targetProject 指定 生成的 model 放在 eclipse 的哪个工程下面-->
<javaModelGenerator targetPackage="cn.krain.springboot.model" targetProject="src/main/java">
<property name="enableSubPackages" value="false"/>
<property name="trimStrings" value="false"/>
</javaModelGenerator>
<!-- 生成 MyBatis 的 Mapper.xml 文件,targetPackage 指定 mapper.xml 文件的 包名,需要修改为自己的包目录, targetProject 指定生成的 mapper.xml 放在 eclipse 的哪个工程下面 -->
<sqlMapGenerator targetPackage="cn.krain.springboot.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- 生成 MyBatis 的 Mapper 接口类文件,targetPackage 指定 Mapper 接口类的包 名,需要修改为自己的包目录, targetProject 指定生成的 Mapper 接口放在 eclipse 的哪个工程下面 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="cn.krain.springboot.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!-- 数据库表名及对应的 Java 模型类名 -->
<table tableName="t_student" domainObjectName="Student" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"/>
</context>
</generatorConfiguration>
- 在application.properties中配置数据库连接信息
#配置数据库连接信息
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/user_test
spring.datasource.name=root
spring.datasource.password=123456
- 在pom文件中加入Mybatis逆向工程插件
<build>
<!--指定编译时包含.xml文件-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--Mybatis逆向工程-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<!--配置文件的位置-->
<configurationFile>GeneratorMapper.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
- 如果mapper文件位于resources目录下时,需要在application.properties文件下加入路径
#声明mapper文件路径
mybatis.mapper-locations=classpath:mapper/*.xml
七、注解式事务
在springboot中,无需使用xml文件进行事务的配置,直接的指定方法上方加入@Transactional注解即可。
@Transactional //事务注解
@Override
public int editStudentById(Student student) {
int i = studentMapper.updateByPrimaryKeySelective(student);
return i;
}
八、SpringBoot下SpringMVC的相关注解
-
Controller
-
RestController
-
RequestMapping
-
GetMapping
-
PostMapping
-
DeleteMapping
-
PutMapping
-
…
各自用法如下:
package cn.krain.springboot.web;
import cn.krain.springboot.model.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
//@Controller
@RestController //相当于:控制层类上加@Controller + 方法上加@ResponseBody
//意味着当前控制层类中所有方法返还的都是json对象
public class StudentController {
@RequestMapping(value = "/student")
//@ResponseBody
public Object getStudent(){
Student student = new Student();
student.setId(1001);
student.setName("zhangsan");
student.setAge(20);
return student;
}
//该方法支持post和get请求方式
@RequestMapping(value = "/studentDetail", method = {
RequestMethod.GET,RequestMethod.POST})
public Object getStudentDetail(){
Student student = new Student();
student.setId(1002);
student.setName("lisi");
student.setAge(26);
return student;
}
//@RequestMapping(value = "/queryStudent", method = RequestMethod.GET)
@GetMapping(value = "queryStudent") //该注解功能相当于上一行代码,如果请求方式不对会报405错误
//该注解在查询数据的时候使用 ——> 查询
public Object queryStudent(){
return "查询成功";
}
//@RequestMapping(value = "/addStudent", method = RequestMethod.POST)
@PostMapping(value = "addStudent") //该注解功能相当于上一行代码,如果请求方式不对会报405错误
//该注解在新增数据的时候使用 ——> 新增
public Object addStudent(){
return "添加成功";
}
//@RequestMapping(value = "/delStudent", method = RequestMethod.DELETE)
@DeleteMapping(value = "delStudent") //该注解功能相当于上一行代码,如果请求方式不对会报405错误
//该注解在删除数据的时候使用 ——> 删除
public Object delStudent(){
return "删除成功";
}
//@RequestMapping(value = "/updateStudent", method = RequestMethod.PUT)
@PutMapping(value = "updateStudent") //该注解功能相当于上一行代码,如果请求方式不对会报405错误
//该注解在更新数据的时候使用 ——> 更新
public Object updateStudent(){
return "更新成功";
}
}
九、SpringBoot下实现Restful
- restful
REST(英文:Representational State Transfer,简称 REST)
一种互联网软件架构设计的风格,但它并不是标准,它只是提出了一组客户端和服务器交互时的架构理念和设计原则,基于这种理念和原则设计的接口可以更简洁,更有层次,REST这个词,是 Roy Thomas Fielding 在他 2000 年的博士论文中提出的。
任何的技术都可以实现这种理念,如果一个架构符合 REST 原则,就称它为 RESTFul 架构。
比如我们要访问一个 http 接口:http://localhost:8080/boot/order?id=1021&status=1
采用 RESTFul 风格则 http 地址为:http://localhost:8080/boot/order/1021/1
- 代码实现
在student1与student2两个方法中,都是从请求路径中获取id与name两个参数,但请求路不同。
package cn.krian.springboot.web;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
@RestController
public class Controller {
@RequestMapping(value = "/student/detail")
public Object student1(Integer id, String name){
Map<Object, Object> map = new HashMap<>();
map.put("title","student");
map.put("id",id);
map.put("name",name);
return map;
}
@RequestMapping(value = "/student/detail/{id}/{name}")
public Object student2(@PathVariable("id") Integer id,
@PathVariable("name") String name){
HashMap<Object, Object> map = new HashMap<>();
map.put("title","student1");
map.put("id",id);
map.put("name",name);
return map;
}
}
- 解决路径冲入问题
使用restful时,如果有某两个请求的参数个数相同,就会导致请求路径相同,此时需要加以区分。
- 方法一:
比如下面两个请求,虽然参数不同,但是个数相同,如果都将参数放到最后面,SpringMVC会无法区分,可通过调换参数位置加以区分。
@RequestMapping(value = "/student/detail/{id}/{name}")
public Object student1(@PathVariable("id") Integer id,
@PathVariable("name") String name){
HashMap<Object, Object> map = new HashMap<>();
map.put("title","student1");
map.put("id",id);
map.put("name",name);
return map;
}
//@RequestMapping(value = "/student/detail/{id}/{state}")
@RequestMapping(value = "/student/{id}/detail/{state}")
public Object student2(@PathVariable("id") Integer id,
@PathVariable("state") String state){
HashMap<Object, Object> map = new HashMap<>();
map.put("title","student2");
map.put("id",id);
map.put("state",state);
return map;
}
- 方法二:
通过restful与增删改查注解相结合,来解决路径冲突的问题,如下代码所示。
@GetMapping(value = "/student/detail/{id}/{age}")
public Object student3(@PathVariable("id") Integer id,
@PathVariable("age") String age){
HashMap<Object, Object> map = new HashMap<>();
map.put("title","student3");
map.put("id",id);
map.put("age",age);
return map;
}
@DeleteMapping(value = "/student/detail/{id}/{status}")
public Object student4(@PathVariable("id") Integer id,
@PathVariable("status") String status){
HashMap<Object, Object> map = new HashMap<>();
map.put("title","student4");
map.put("id",id);
map.put("status",status);
return map;
}