Spring Data JPA 简介
Spring Data 是 Spring 家族的一个子项目,它使得数据库访问变得更为容易。而 Spring Data JPA 可以有效地简化关系型数据库访问的代码,因为其能够帮我们自动实现一些简单的方法。
说白了,JPA 可以帮我们自动建表、自动实现基本的 CRUD (包括分页查询、模糊查询,只需遵循其命名规范即可)等方法,当然也可选择自定义 SQL。对于简单的项目来说,JPA 十分高效。
以下将展示一个 Spring Boot 整合 JPA 实现基本的 CRUD 的 demo,能够快速地入门 JPA 的基本使用。
1、创建数据库
创建数据库 springboot-data
,学生表 student
:
drop database if exists `springboot-data`;
create database `springboot-data`;
use `springboot-data`;
drop table if exists `student`;
create table `student`
(
`id` int(10) not null auto_increment,
`name` varchar(20) not null,
`pwd` varchar(20) not null,
primary key (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
insert into `student` (`name`,`pwd`)
values
('小明','123456'),
('小华','234567'),
('小红','345678');
2、创建项目
创建一个 Spring Boot 项目(默认添加 web 依赖),然后导入如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
3、数据库配置
创建配置文件 application.yaml
,在其中配置数据库连接参数以及 jpa 相关配置:
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/springboot-data?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
jpa:
show-sql: true
hibernate:
ddl-auto: update
properties:
hibernate:
format_sql: true
show-sql: true
:在控制台打印所执行的 SQL
ddl-auto: update
:启动时根据实体类自动更新数据库中的表
4、定义实体类
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private String pwd;
@Entity
表明该类为实体类,如果我们没有建表,则 JPA 会自动创建该实体类对应的表(默认表名为类名),也可以通过@Entity(name -= “xxx”)
重新指定表名@Id
表示该属性为主键@GeneratedValue(strategy = GenerationType.IDENTITY)
表示主键自动增长
下面定义的响应实体,用于返回响应信息:
public class RespBean {
private String status;
private String msg;
以上实体类均要添加 getter / setter 以及构造方法。
5、实现 Dao
定义一个 StudentDao
接口,继承自 JpaRepository
,泛型中分别传入实体类型以及主键类型
public interface StudentDao extends JpaRepository<Student,Integer> {
}
dao 层什么代码都不需要我们写,我们只需继承类 JpaRepository
即可。
点开源码观察可知,其最终继承了一个名为 CrudRepository
的接口,该接口中定义了基本的 CRUD 方法。根据 JavaSE 中的继承知识,我们的 dao 接口直接可以调用 CrudRepository
中的方法,即基本的增删改查都无需手动实现。
以下是 CrudRepository
的部分源码:
@NoRepositoryBean
public interface CrudRepository<T, ID> extends Repository<T, ID> {
<S extends T> S save(S entity);
<S extends T> Iterable<S> saveAll(Iterable<S> entities);
Optional<T> findById(ID id);
boolean existsById(ID id);
Iterable<T> findAll();
Iterable<T> findAllById(Iterable<ID> ids);
long count();
void deleteById(ID id);
void delete(T entity);
void deleteAll(Iterable<? extends T> entities);
void deleteAll();
}
6、实现 Service
StudentService
接口中定义 CRUD 方法:
public interface StudentService {
Student addStudent(Student student);
Student queryStudentById(int id);
List<Student> queryAllStudents();
Student updateStudent(Student student);
void deleteStudent(int id);
}
StudentServiceImpl
中注入 StudentDao
,通过调用 dao 实现 CRUD 方法:
@Service()
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentDao studentDao;
@Override
public Student addStudent(Student student) {
return studentDao.save(student);
}
@Override
public Student queryStudentById(int id) {
return studentDao.findById(id).get();
}
@Override
public List<Student> queryAllStudents() {
return studentDao.findAll();
}
@Override
public Student updateStudent(Student student) {
return studentDao.save(student);
}
@Override
public void deleteStudent(int id) {
studentDao.deleteById(id);
}
}
7、实现 Controller
在 controller 中调用 service,完成请求映射,这里通过 @RestController
注解默认返回 JSON 格式的数据,同时采用的是 RestFul 风格的 url,同一个请求可以有不同的类型,完整代码如下:
@RestController
@RequestMapping("/students")
public class StudentController {
@Autowired
private StudentService studentService;
@GetMapping("/list")
public List<Student> showStudents() {
return studentService.queryAllStudents();
}
@GetMapping("/{sno}")
public Student getStudentById(@PathVariable("sno") int id) {
return studentService.queryStudentById(id);
}
@PostMapping("/")
public RespBean addStudent(Student student) {
studentService.addStudent(student);
return new RespBean("success","增加成功!");
}
@PutMapping("/{id}")
public RespBean updateStudent(@PathVariable("id") int id, String name, String pwd) {
Student student = studentService.queryStudentById(id);
student.setName(name);
student.setPwd(pwd);
studentService.updateStudent(student);
return new RespBean("success","修改成功!");
}
@DeleteMapping("/{sno}")
public RespBean deleteStudent(@PathVariable("sno") int id) {
studentService.deleteStudent(id);
return new RespBean("success","删除成功!");
}
}
8、运行测试
数据库表的初始内容如下:
采用接口测试工具进行测试:
成功查询出所有记录
成功查询出 id 为 1 的记录
成功增加了第 4 条记录
成功修改了第 4 条记录的 pwd 字段
成功删除了第 4 条记录
9、总结
以上就是 Spring Boot 整合 JPA 的基本使用了。在 Spring Data JPA 中,其默认为我们制定了许多规范,即一系列的方法命名规则。开发者只需遵循对应的规范,即可自动生成对应的 SQL,而无需手动实现。可以看到,数据库访问层的代码量大大减少,对于简单的项目的开发来说十分快速,不过复杂的项目最好还是使用 MyBatis。