SpringBoot的HelloWorld
一、HelloWorl工程的搭建
本项目用到的开发工具时IDEA,java版本时1.8
1、新建项目
2、删除下面三个文件
查看pom文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| <?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<groupId>com.njupt</groupId> <artifactId>girl</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging>
<name>girl</name> <description>Demo project for Spring Boot</description>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <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> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
</project>
|
GirlApplication文件:
1 2 3 4 5 6 7 8 9 10 11 12
| package com.njupt.girl;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication public class GirlApplication {
public static void main(String[] args) { SpringApplication.run(GirlApplication.class, args); } }
|
GirlApplicationTest文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| package com.njupt.girl;
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class) @SpringBootTest public class GirlApplicationTests {
@Test public void contextLoads() { }
}
|
3、启动项目:
(1)、方法一
(2)、方法二:命令行启动方式:
进入项目目录girl
输入命令mvn spring-boot:run启动项目
(3)、方法三:命令行启动方式
进入项目目录girl下的target目录:
D:\girl\target>
查看目录几种的文件:
输入命令:java -jar girl-0.0.1-SNAPSHOT.jar启动项目
4、新建一个Controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| package com.njupt.girl;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController;
/** * @Author: XJL * @Description: * @Date: Create in 16:05 2018/6/26 * @Modified By: **/ @RestController public class HelloController {
@RequestMapping(value = "/say",method = RequestMethod.GET) public String say(){ return "Hello SpringBoot!"; }
}
|
5、启动项目
6、浏览器输入:
http://localhost:8080/say
二、配置文件相关
1、在项目的resource目录下有一个application.properties文件:
2、修改改配置文件为如下内容:
1 2
| server.port=8081 server.servlet.context-path=/girl
|
该配置文件作用:修改项目根目录和启动端口,此时应该用如下方式调用方法:
http://localhost:8081/girl/say
3、还可以使用yml文件代替.properties文件,新建application.yml文件,并删除application.properties:
1 2 3 4
| server: port: 8082 servlet: context-path: /girl
|
启动项目,http://localhost:8082/girl/say
4、现在有如下需求,加入修改获得罩杯时B,年纪为22的女生,该如何配置呢:
(1)、首先配置文件application.yml:
1 2 3 4
| server: port: 8080 cupSize: B age: 22
|
(2)、然后在controller中注入属性:
1 2 3 4 5 6 7 8 9 10 11 12 13
| @RestController public class HelloController { @Value("${cupSize}") private String cupSize; @Value("${age}") private Integer age;
@RequestMapping(value = "/say",method = RequestMethod.GET) public String say(){ return cupSize+age; }
}
|
(3)、启动运行即可。
5、如何在不同的环境下使用不同的配置文件呢?
(1)需要两个在不同版本下使用的配置文件:
application-dev.yml
application-prod.yml
然后在默认配置文件application.yml中如下配置:
1 2 3
| spring: profiles: active: dev
|
表示使用application-dev.yml配置文件。
6、如何在配置文件中使用配置呢:
(1)、修改配置文件:
1 2 3 4 5
| server: port: 8080 cupSize: B age: 22 content: "cupSize: ${cupSize}, age: ${age}"
|
(2)、属性注入与调用:
1 2 3 4 5 6 7 8 9 10 11 12
| @RestController public class HelloController { @Value("${content}") private String content;
@RequestMapping(value = "/say",method = RequestMethod.GET) public String say(){ return content; }
}
|
7、但是有个问题,这样平凡的使用 @Value注解是很麻烦的一件事,如果配置文件中的女神属性多了怎么办?于是可以基于类的配置方式:
(1)、application.yml文件修改:
1 2 3 4 5
| server: port: 8080 girl: cupSize: B age: 22
|
(2)、新建一个GirlProperties的类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| package com.njupt.girl;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component;
/** * @Author: XJL * @Description: * @Date: Create in 17:15 2018/6/26 * @Modified By: **/ @Component @ConfigurationProperties(prefix = "girl") public class GirlProprities {
private String cupSize;
private Integer age;
public String getCupSize() { return cupSize; }
public void setCupSize(String cupSize) { this.cupSize = cupSize; }
public Integer getAge() { return age; }
public void setAge(Integer age) { this.age = age; } }
|
注意添加注解:
@Component
@ConfigurationProperties(prefix = "girl")
(3)、然后在方法中利用@AutoWire注解注入:
1 2 3 4 5 6 7 8 9
| @RestController public class HelloController { @Autowired private GirlProprities girlProprities; @RequestMapping(value = "/say", method = RequestMethod.GET) public String say() { return girlProprities.getCupSize(); } }
|
三、Controller的使用
1、
@Controller:处理Http请求
@RestController:Spring4之后新增加的注解,原来返回json数据需要@ResponseBody配合@Controller使用
@RequestMapping:配置url映射。
2、
可以用@GetMapping(value = "say")代替@RequestMapping(value = "/say", method = RequestMethod.GET),其他如POST同理
3、其他如@PathVariable,@RequestParam等注解的使用与springMVC相同。
四、数据库操作
要求完成一下的api:
1、在pom文件中添加依赖:
1 2 3 4 5 6 7 8 9 10 11
| <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、新建类Girl,对应数据库中的表,其中@Entity表示该类对应数据库中的表,@ID表示该字段为主键,@GeneratedValue表示主键自增:
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Entity public class Girl { @Id @GeneratedValue private Integer id;
private String name;
private String cupSize;
public Girl() { } }
|
3、配置文件:
由于数据库的配置应该是全局的,所以配置在appliaction.yml文件中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| spring: profiles: active: dev #数据库的配置 datasource: driver-class-name: com.mysql.jdbc.Driver username: root password: root url: jdbc:mysql://127.0.0.1:3306/dbgirl jpa: show-sql: true#表示在后台显示sql语句 hibernate: ddl-auto: update #表示启动项目时当数据库代dbgirl中没有表时新建一张girl表,如果表中有数据则更新表,还有create:表示每次启动都会新建表
|
4、新建一个接口并继承JpaRepository,各个接口如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| package com.njupt.girl;
import org.springframework.data.jpa.repository.JpaRepository;
/** * @Author: XJL * @Description: * @Date: Create in 20:33 2018/6/26 * @Modified By: **/ public interface GirlRepository extends JpaRepository<Girl,Integer> { List<Girl> findByName(String name); }
|
4、新建一个GirlController:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| @RestController public class GirlController {
@Autowired private GirlRepository girlRepository;
/** * 获取女生列表 * @return */ @GetMapping(value = "/girls") public List<Girl> getGirlList() { List<Girl> girls = girlRepository.findAll();
return girls; }
/** * 新增一个女生 * @param name * @param cupSize * @return */ @PostMapping(value = "/girls") public Girl addGirl(@RequestParam("name") String name,@RequestParam("cupSize") String cupSize){ Girl girl = new Girl(); girl.setCupSize(cupSize); girl.setName(name); return girlRepository.save(girl); } // // /** // * 根据Id获取一个女生 // * @param id // * @return // */ // @GetMapping(value = "/girls/{id}") // public Girl getOneGirl(@PathVariable("id") Integer id){ // return girlRepository.getOne(id); // }
/** * 更新一个女生 * @param id * @param name * @param cupSize * @return */ @PutMapping(value = "/girls/{id}") public Girl updateGirlById(@PathVariable("id") Integer id, @RequestParam("name") String name, @RequestParam("cupSize") String cupSize) { Girl girl = new Girl(); girl.setName(name); girl.setId(id); girl.setCupSize(cupSize); return girlRepository.save(girl); }
/** * 删除一个女生 * @param id */ @DeleteMapping(value = "/girls/{id}") public void deleteGirl(@PathVariable("id") Integer id){ girlRepository.deleteById(id); } /** * 根据命中获取女生 */ @GetMapping(value = "/girls/{name}") public List<Girl> getGirlsBYName(@PathVariable("name") String name){ return girlRepository.findByName(name); }
}
|
五、事务管理
要求:插入两条女生数据,要么都成功,要么都失败
1、新建一个GirlService,在方法上加注解: @Transactional
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| @Service public class GirlService {
@Autowired private GirlRepository girlRepository;
@Transactional public void insertGirls(){ Girl girla = new Girl(); girla.setCupSize("E"); girla.setName("G"); girlRepository.save(girla);
Girl girlb = new Girl(); girlb.setName("AAAAAA"); girlb.setCupSize("c");
girlRepository.save(girlb); } }
|
2、controller中新增方法:
1 2 3 4
| @PostMapping(value = "/girls/add") public void insertGirls(){ girlService.insertGirls(); }
|
此时该方法就用事务了。