一、介绍
(1)SpringBoot是SpringMVC的升级版,两者没有必然的联系。
(2)特点:化繁为简,简化配置;备受关注,是下一代的框架;微服务的入门级微框架(微服务->springcloud->springboot)。
二、第一个Springboot应用
(1)环境:idea开发工具、jdk1.8、maven的3.3.9版本以上。(环境变量)
(2)步骤:
点击finish,idea就会开始创建springboot项目。
注意:第一次的时候创建项目有点慢,可以在maven的配置文件settings.xml中添加阿里云maven镜像配置。
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<!--<mirrorOf>*</mirrorOf>-->
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
创建完成后,项目的目录结构:
在pom.xml中修改为jar包形式:
<packaging>jar</packaging>
maven的结构如下:
(3)编写helloworld类
启动程序,在浏览器输入http://localhost:8080/hello,出现如下表示第一个Springboot程序成功了。
(4)运行SpringBoot程序
1.运行main()所在的类
若console出现如下信息:
启动失败,原因是没有找到tomcat,需要把删除pom.xml的
<scope>provided</scope>
2.打开cmd窗口,进入项目根目录下,执行mvn spring-boot:run。
3.打开cmd窗口,执行mvn install命令编译项目,然后进入项目的target目录下的,可以看见以jar或war结尾的jar包/war包,使用java命令执行jar包/war包,java -jar ****.jar/****.war。
三、项目属性配置
(1) 主要配置文件是application.properties或application.yml(推荐,书写和阅读更加方便,简单)。
注意:当两个文件都存在,内容也相同,application.properties会覆盖application.yml文件,使application.yml失效。(可测试:两个文件都填写server.port = 8081、server.servlet.context-path=/wangbin)
(2) 主要配置属性:
server.port = 8081==>设置tomcat的启动端口号
server.servlet.context-path=/wangbin==》访问路径后添加wangbin,localhost:8080-->localhost:8080/wangbin
数据库配置:
spring.datasource.url : jdbc:mysql://127.0.0.1:3306
spring.datasource.username: root
spring.datasource.password: root
spring.datasource.driver-class-name: com.mysql.jdbc
除了springboot自带的一些配置选项,也可自定义属性配置:
比如在application.yml中定义属性(key-value):
如何使用自定义的属性呢?
方法一
使用注解@Value("${***}")形式
注意:在application.yml文件中自己使用自定义属性,也是使用${***}来获取属性的值。
方法二
若是一组属性,可以定义一个实体类,类上添加@ConfigurationProperties(prefix="**")
如何实现多环境配置呢?(生产/开发环境)
方法:定义三个yml文件,分别为appplication-dev.yml(开发环境)、application-prod.yml(生产环境)、application.yml文件,并在appliation.yml主配置文件添加spring.profiles.active=dev/prod(决定启动哪个配置文件)
注意:多环境如使用cmd窗口,java -jar启动的话,可以在后面添加配置--spring.profiles.active=dev/prod(注意不要有空格)
四、Controller的使用
@RequestMapping注解可以添加到类或方法上面,来映射url的,同时在属性value中添加多个值,在大括号里面,它表示对多个url映射到这个方法中。比如localhost:8080/hello 与localhost:8080/hi都可以访问同一个方法。
@PostMapping或@GetMapping等等是组合注解,等同于@RequestMapping(method=RequestMethod.GET)........
@PathVariable用法:
浏览器输入:localhost:8080/hello/200
浏览器输入localhost:8080/200/hello
结果--》
@RequestParam的用法:
浏览器输入 localhost:8080/hello?id=120
五、数据库连接操作
(1)使用spring-data-jpa组件连接mysql数据库。JPA(java persistence api)定义了一系列对象持久化的标准,目前实现这一个规范的产品有Hiberate、TopLink等。
(2)步骤
1.添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency>
2. 配置数据库
在application.yml文件中添加:
spring: #mysql数据库配置 datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/wb_user username: root password: root #spring-data-jpa配置 jpa: hibernate: ddl-auto: create show-sql: true
其中:ddl-auto:create是根据注解的实体类自动创建与之对应的表。
3. 创建实体类
运行时就会生成对应的animal和hibernate_sequence这两张表。
表结构:
CREATE TABLE `hibernate_sequence` (
`next_val` bigint(20) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `animal` (
`id` int(11) NOT NULL,
`kind` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
注意:如果你使用的jpa版本是最新的,我使用的是2.0.2.RELEASE版本,会创建上面的两张表。版本低些,只会创建animal这一张表。当你使用出现两种表,说明你的jpa版本是高的。
由于jpa版本中升级后的策略变化,新版如果在实体类上增加@GeneratedValue的自增注解,是没有什么作用的,还需要在application.yml的配置文件中,添加:
spring:
jpa:
hibernate:
use-new-id-generator-mappings: false
这样重新启动会只产生一张表,并且id是自增的。
4. 如何使用spring-data-jpa对数据库中表进行增删改查呢?
(1) 创建一个继承JpaRepository的接口
public interface AnimalRepository extends JpaRepository<Animal,Integer>{ }
(2)直接在需要操作数据库的地方,注入即可
@Autowired private AnimalRepository animalRepository;
(3)增删改查
可以调用jpaReposity中的增删改查方法,实现操作数据库。
代码:
@RestController
public class HelloController {
@Autowired
private AnimalRepository animalRepository;
// 查询所有
@PostMapping("/getAll")
public List<Animal> getAllAnimal() {
return animalRepository.findAll();
}
// 增加
@PostMapping("/addAnimal")
public Animal addAnimal(@RequestParam("name") String name, @RequestParam("kind") String kind) {
Animal animal = new Animal();
animal.setName(name);
animal.setKind(kind);
return animalRepository.save(animal);
}
// 删除
@DeleteMapping("/deleteAnimal/{id}")
public void deleteAnimal(@PathVariable("id") Integer id) {
animalRepository.deleteById(id);
}
// 更新
@PutMapping("/updateAnimal/{id}")
public Animal updateAnimal(@PathVariable("id") Integer id, @RequestParam("name") String name, @RequestParam("kind") String kind) {
Animal animal = new Animal();
animal.setId(id);
animal.setName(name);
animal.setKind(kind);
return animalRepository.save(animal);
}
// 根据id查找
@GetMapping("/findById")
public Animal findOne(@RequestParam("id") Integer id) {
Optional<Animal> animal = animalRepository.findById(id);
return animal.get();
}
// 根据kind查找
@GetMapping("/findByKind/{kind}")
public List<Animal> findByKind(@PathVariable(value = "kind") String kind) {
return animalRepository.findByKind(kind);
}
}
public interface AnimalRepository extends JpaRepository<Animal,Integer>{
// 通过kind来查找(扩展方法)
List<Animal> findByKind(String kind);
}
注意:若不是通过id来查询,通过其他的字段来查询,需要扩展自己的方法,其中方法名的命名是有规则的。
六、如何调试模拟http的请求,来查看自己定义的接口呢?
我使用的是google浏览器的Advanced Rest Client插件的,关于这个工具的安装和使用请查看我的相关博客哈。
七、事务管理
这里只简单地处理,在需要进行事务管理的方法上面添加注解@Transactional。