使用Spring Data JPA访问数据库
JPA(全称为 Java Persistenec API)是Sun官提出的Java持久化规范。它为Java开发者提供了一种对象/关联映射工具,用于管理Java应用中的关系数据。它的出现是为了整合现有的ORM技术并简化现有的持久层开发工作。
Spring Data JPA是Spring基于ORM框架、JPA规范之上封装的一套JPA应用框架,开发者可以通过极简的代码来实现对数据的访问和操作,基本上有所的CRUG(增加create、读取查询retrieve、更新update、删除delete的首字母缩写)都可以依赖它来实现。
创建数据库
在本地运行MySQL数据库,创建一个名为stu的数据库,然后创建名为user的数据表。
CREATE DATABASE stu
CREATE TABLE users(
id SMALLINT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
NAME VARCHAR(20) NOT NULL,
age TINYINT UNSIGNED NOT NULL,
sex VARCHAR(10)
);
INSERT users VALUES
(NULL,"白起",37,'男'),
(NULL,"王翦",32,'男'),
(NULL,"李牧",30,'男')
新建【Spring Starter Project】
打开Spring官方的STS集成开发工具,创建工程名为JPA,包名为com.demo.jpa的Spring Boot项目,
点击【Next】进入下一界面,在当前界面勾选项目需要的Spring模块,包括Spring Web,Spring Data JPA以及MySQL Driver
添加内容
新建完成的Spring Boot项目在src/main/resources 目录下会有一个名为 application.properties 的配置文件,本项目需要配置数据库的账号、密码、要连接的数据库名以及数据库驱动:
spring.datasource.url=jdbc:mysql://localhost:3306/stu
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
编写这里的代码时,是会有提示出现。如果敲完等号左侧代码,报错或者没有提示那可能是真出错了。就比如我用的是STS第4版开发工具,里面的驱动就是spring.datasource.driver-class-name,而之前有的版本是spring.datasource.driverClassName,而且数据库的驱动类也要看情况而定。我的是MySQL8而MySQL5的驱动类应该是com.mysql.jdbc.Driver。而且对于Spring Boot项目,我试过不配置驱动也能正常使用,项目的驱动程序是通过SPI自动注册的,手动加载驱动程序类通常可以不要。但还是写上比较好。虽然都能运行成功,但是运行后的控制台输出的内容是不一致的。
编写Users实体类,该实体类对应MySQL数据库中的users表。
- @Entity 注解表明这是一个实体bean
- @Id 注解指定表的主键
- @Column 注解定义了成员属性映射到关系表中的哪一列
package com.demo.jpa.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Users {
@Id
@GeneratedValue
private Long id;
@Column(nullable=false)
private String name;
@Column(nullable=false)
private Integer age;
@Column(nullable=false)
private String sex;
public Users() {}
public Users(Long id,String name,Integer age,String sex) {
this.id=id;
this.name=name;
this.age=age;
this.sex=sex;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
Repository(资源库)是一个访问领域对象的类似集合的接口,在领域与数据映射层之间进行协调。Spring Data JPA提供了几个Repository,其中JpaRepository实现一组JPA规范相关的方法。
package com.demo.jpa.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.demo.jpa.entity.Users;
public interface UserRepository extends JpaRepository<Users,Long>{
Users findByName(String name);
}
编写控制层IndexController类,在allPerson()中调用UserRepository的findAll()方法来查询users表中的所有记录,在findPerson()方法中调用UserRepository类的findByName()来查询users表中的指定名字的一条记录:
package com.demo.jpa.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.demo.jpa.entity.Users;
import com.demo.jpa.repository.UserRepository;
@RestController
@RequestMapping(value="/person")
public class IndexController {
@Autowired
private UserRepository userRep;
@GetMapping("/all")
public List<Users> allPerson(){
return userRep.findAll();
}
@GetMapping("/find")
public Users findPerson(@RequestParam(value="name") String name){
return userRep.findByName(name);
}
}
演示效果
项目结构:
完成之后,起动这个项目。
打开浏览器访问 http://localhost:8080/person/all,请求会传给IndexController处理器的allPerson()方法,返回users表中的所有记录,返回结果如下:
在浏览器中访问 http://localhost:8080/person/find?name=李牧,请求传给IndexController处理器的findPerson()方法,返回users表中name字段为李牧的记录,返回结果如下: