轻松掌握 Spring Data JPA ~

本文介绍了如何使用SpringBoot结合SpringDataJPA进行数据库操作,包括创建数据库、设置项目依赖、配置数据库、定义实体类、实现DAO、Service和Controller,最后展示了运行测试和总结。主要展示了JPA的自动建表和CRUD方法的便捷性。
摘要由CSDN通过智能技术生成

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。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值