五、数据库操作
5.1 概念说明
JPA(Java Persistence API)定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate、TopLink等。
Spring-Data-Jpa就是spring对Hibernate的整合。
5.2 POM添加组件
5.2.1 JPA组件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
5.2.2 mysql组件
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
5.3 配置数据库连接和JPA信息
5.3.1 配置信息
spring:
profiles:
active: dev
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/dbgirl
data-username: root
data-password: huangwei1
jpa:
hibernate:
ddl-auto: create
show-sql: true
5.3.2 配置说明
driver-class-name:配置数据驱动
url:配置数据连接地址和数据库名
data-username:用户名
data-password:密码
hibernate.ddl.auto:可以设置create、create-drop、none、update、validate,create表示按照类自动建表,后面详细讲述。
show-sql:设置true可在控制台输出sql语句
5.4 新建实体类
5.4.1 实体类代码
package com.imooc;
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;
}
}
5.4.2 IDEA get/set 快捷键
alt+insert
5.4.3 运行测试
数据库中自动创建了一个girl表,且字段名称和类型都与实体类Girl一致。
5.4.4 ddl说明
create:上面使用到的方式,每次运行时会删除原表,创建一个新表
update:若表不存在,则新建表,若表存在,不会删除表内数据。
create-drop:在应用停下来的时候会把创建的表删掉。
none:什么都不做,默认属性
validate:会验证类里面的属性是否和表一致,不一致会报错。
5.5 数据操作实现
5.5.1 JpaRepository使用
创建一个接口GirlRepository继承JpaRepository:
5.5.2 控制类主体代码
package com.imooc;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GirlController {
@Autowired
private GirlRepository girlRepository;
}
5.5.3 获取list实现
方法实现:
@GetMapping(value = "/girls")
public List<Girl> girlList(){
return girlRepository.findAll();
}
效果显示:
5.5.4 Add实现
@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);
}
5.5.4 查询实现
@GetMapping(value = "/girls/{id}")
public Optional<Girl> girlFindOne(@PathVariable("id") Integer id){
return girlRepository.findById(id);
}
这里与视频中有点不一样:
@GetMapping(value = "/girls/{id}")
public Girl girlFindOne(@PathVariable("id") Integer id){
return girlRepository.findOne(id);
}
5.5.5 更新实现
@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.setCupSize(cupSize);
girl.setAge(age);
return girlRepository.save(girl);
}
注意:使用PUT方式,客户端不能使用form-data模式,要使用x-www-form-urlencoded模式
5.5.6 删除实现
@DeleteMapping(value = "/girls/{id}")
public void girlDelete(@PathVariable("id") Integer id){
girlRepository.deleteById(id);
}
视频使用的方式:
girlRepository.delete(id);
5.5.6 非ID属性查询列表
以Age为例,首先要在GrilRepository中增加fingByAge方法:
public interface GirlRepository extends JpaRepository<Girl,Integer> {
public List<Girl> findByAge(Integer age);
}
Controller方法:
@GetMapping(value = "/girls/age/{age}")
public List<Girl> girlListByAge(@PathVariable("age") Integer age){
return girlRepository.findByAge(age);
}
5.6 事物管理,@Transactional
使用示例,新建GirlService类:
@Service
public class GirlService {
@Autowired
private GirlRepository girlRepository;
@Transactional
public void insertTwo(){
Girl girlA = new Girl();
girlA.setCupSize("A");
girlA.setAge(18);
girlRepository.save(girlA);
Girl girlB = new Girl();
girlB.setCupSize("BBB");
girlB.setAge(19);
girlRepository.save(girlB);
}
}
Controller新增方法:
@PostMapping(value = "/girls/two")
public void girlAddTwo(){
girlService.insertTwo();
}
注意:mysql需要将表的引擎设置为InnoDB才能支持事务管理,具体设置方法见
Mysql设置默认引擎为InnoDB
上一章:Spring Boot 学习(三)Controller的使用