一、介绍
(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。