写在前面:以下所有操作均在MAC OS环境下进行。本次讲解主要是Spring Boot如何连接数据库(mysql),以及对数据库进行增删查改的操作。学习视频链接
目录
- 如何连接数据库
- 增删查改操作
一、如何连接数据库
Spring Boot是通过Spring-Date-Jpa这一组件来对数据库进行连接的,那么什么是JPA,请看这位大神,这里就不讲解了。首先在pom.xml文件里要填加Spring-Date-Jpa和mysql这两个组件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
然后就是在application.yml文件里进行配置,在spring下加上datesource和jpa属性,代码如下,详情见图1。(先看图下面的详解)
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/dbgirl
username: root
password: root
jpa:
hibernate:
ddl-auto: update
show-sql: true
记住,datesource和jpa一定是在spring的下一层。
在datasource里要填四个属性:driver-class-name、url、username、password。
- driver-class-name统一填:com.mysql.jdbc.Driver
- url, 里127.0.0.1:3306是默认本机地址,如果数据库不是配置在本地,就填它所在机器的网络ip地址,端口3306看你有没有改,mysql默认就是3306,然后dbgirl是数据库视图名,要先在数据库里新建一个schema,将其命名为dbgirl或者其他的名字。
- username和password就是你数据库的用户名和密码。
然后是jpa要填两个属性dll-auto和show-sql
- dll-auto里可以设置五种属性:update、create、create-drop、none、validate等。update意思是如果你数据库里存在这样的schema,它不会主动改变里面原有的值;create则是会每次新建一个空表,若存在一个相同的schema,那就删掉它,再新建;而create-drop是会新建一个空表,然后在应用结束后,自动将此表从数据库里删除;none就是什么都不做;最后的validate是用来验证schema里面的属性是否跟表结构一致,不一致会报错。
- show-sql很简单,就是在项目运行的时候,在控制台看到sql语句。
最后我们新建一个空表,在Spring Boot里就是新建一个类。我们新建一个Girl的类(下面get和set以及无参的类都是可以自动生成的)。
package com.imooc.girl;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity //使其对应数据库的一个表
public class Girl {
@Id
@GeneratedValue
private Integer id;
private String cupSize;
private Integer age;
public Girl() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
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;
}
}
二、对表的增删查改
其实增删查改对应了四种请求类型:POST、DELETE、GET、PUT(完整代码会在最后贴出)
为此,我们要新建一个GirlController类和一个GirlRepository接口类,如下图2、图3所示:
1、请求类型:POST,请求路径:/girls,功能:创建一个女生。
POST特点:1、将传输的数据放在http内部;2、对传输数据的大小没有限制;3、通过tcp传输协议进行两步操作:(1)先发送header;(2)再发送data,其中响应时间分别为100和200;4、参数不会被保留;5、浏览器回退影响存储
/**
* 添加一个女生
*/
@PostMapping(value = "/girls")
public Girl girlAdd(@RequestParam("cupSize") String cupSize,
@RequestParam("age") Integer age) {
Girl girl = new Girl();
girl.setCupSize(cupSize);
girl.setAge(age);
Girl save = girlRepository.save(girl);
return save;
}
因为用POST请求方式,所以不能直接在浏览器内测试,需要用到POSTMAN之类的调试软件,这里用postman来作为演示,
2、请求类型:DELETE,请求路径:/girls/id,功能:删除一个女生。
DELETE:功能就是对数据进行删除操作,很单一,下面代码不返回值。
@RestController
public class GirlController {
@Autowired
private GirlRepository girlRepository;
/**
* 删除一个女生
* */
@DeleteMapping(value = "/girls/{id}")
public void girlDelete(@PathVariable("id") Integer id){
girlRepository.deleteById(id);
}
3、请求类型:GET, 请求路径:/girls,功能:获取女生列表;请求路径:/girls/id,功能按id号查询一个女生
GET特点:1、将传输数据放在url中;2、因为对url长度有限制,所以对传输数据的大小有限制;3、通过tcp传输协议进行一步操作:直接将header和data一起发送,响应时间200;4、不能用来传递敏感信息,会被看到;5、参数会被保留;6、浏览器回退不影响存储。
@RestController
public class GirlController {
@Autowired
private GirlRepository girlRepository;
/**
* 查询所有女生
*/
@GetMapping(value = "/girls")
public List<Girl> girlList() {
return girlRepository.findAll();
}
/**
* 查询一个女生
*/
@GetMapping(value = "/girls/{id}")
public Optional<Girl> girlFindOne(@PathVariable("id") Integer id) {
return girlRepository.findById(id);
}
}
4、请求类型:PUT, 请求路径:/girls/id,功能按id号更新一个女生信息
PUT:主要用来更新表单内已有对象的信息,不增加或删除存储信息,功能单一。
@RestController
public class GirlController {
@Autowired
private GirlRepository girlRepository;
/**
* 更新一个女生
*/
@PutMapping(value = "/girls/{id}")
public Girl girlUpdate(@PathVariable("id") Integer id,
@RequestParam("cupSize") String cupSize,
@RequestParam("age") Integer age) {
Girl girl = new Girl();
girl.setId(id);
girl.setAge(age);
girl.setCupSize(cupSize);
return girlRepository.save(girl);
}
}
其中GET和PUT这两种请求方式可以代替PUT和DELETE
5、扩展一下,通过年龄来查询:请求方式:GET,请求路径:girls/age/{age},功能:通过年龄来查询对应的女生列表
(1)首先要在GirlRepository这个接口里,添加一个公共类
(2)然后按照上面例子一样
@RestController
public class GirlController {
@Autowired
private GirlRepository girlRepository;
/**
* 通过年龄查询
*/
@GetMapping(value = "/girls/age/{age}")
public List<Girl> girlListByage(@PathVariable("age") Integer age){
return girlRepository.findByAge(age);
}
}
下面是完整代码
package com.imooc.girl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;
@RestController
public class GirlController {
@Autowired
private GirlRepository girlRepository;
/**
* 查询所有女生
*/
@GetMapping(value = "/girls")
public List<Girl> girlList() {
return girlRepository.findAll();
}
/**
* 添加一个女生
*/
@PostMapping(value = "/girls")
public Girl girlAdd(@RequestParam("cupSize") String cupSize,
@RequestParam("age") Integer age){
Girl girl = new Girl();
girl.setCupSize(cupSize);
girl.setAge(age);
return girlRepository.save(girl);
}
/**
* 查询一个女生
*/
@GetMapping(value = "/girls/{id}")
public Optional<Girl> girlFindOne(@PathVariable("id") Integer id) {
return girlRepository.findById(id);
}
/**
* 更新一个女生
*/
@PutMapping(value = "/girls/{id}")
public Girl girlUpdate(@PathVariable("id") Integer id,
@RequestParam("cupSize") String cupSize,
@RequestParam("age") Integer age) {
Girl girl = new Girl();
girl.setId(id);
girl.setAge(age);
girl.setCupSize(cupSize);
return girlRepository.save(girl);
}
/**
* 删除
*/
@DeleteMapping(value = "/girls/{id}")
public void girlDelete(@PathVariable("id") Integer id){
girlRepository.deleteById(id);
}
/**
* 通过年龄查询
*/
@GetMapping(value = "/girls/age/{age}")
public List<Girl> girlListByage(@PathVariable("age") Integer age){
return girlRepository.findByAge(age);
}
}
简单总结一下
对比曾经用过的JSP servlet,spring boot连接数据库并进行操作是十分简单和方便的,不需要写sql语句,很好很强大。