Spring Boot整合Spring Data JPA进行CRUD和模糊查询

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Spring Boot整合Spring Data JPA进行CRUD和模糊查询

1 简单介绍下JPA

JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。

Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。

JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分。但它又不限于EJB 3.0,你可以在Web应用、甚至桌面应用中使用。JPA的宗旨是为POJO提供持久化标准规范,由此可见,经过这几年的实践探索,能够脱离容器独立运行,方便开发和测试的理念已经深入人心了。Hibernate3.2+、TopLink 10.1.3以及OpenJPA都提供了JPA的实现。

JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架大体一致。总的来说,JPA包括以下3方面的技术:

  • ORM映射元数据

JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;

  • API

用来操作实体对象,执行CRUD操作,框架在后台替代我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。

  • 查询语言

这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

2 新建Spring Boot工程和POM依赖以及配置文件

pom.xml

<dependencies>
    <!--  JPA   -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <!--   MySql driver -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>
    <!--  lombok -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <!--    单元测试   -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

application.properties

#classname
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#url
spring.datasource.url=jdbc:mysql://localhost:3306/sp_jpa
#username
spring.datasource.username=root
#password
spring.datasource.password=12345
#数据库类型
spring.jpa.database=MySQL
#是否自动生成
spring.jpa.generate-ddl=true
#每次运行程序,没有表格会新建表格,表内有数据不会清空,只会更新
spring.jpa.hibernate.ddl-auto=update

工程结构:

3 实体类和DAO层

Student.java

/**
 * @author 17122
 */
@Entity
@Data
@Setter
@Getter
@Accessors(chain = true)
public class Student {
    @Id
    @GeneratedValue//ID自动递增
    private Long sId;
    private String sName;
    private Integer sAge;
}

StudentDao.java

/**
 * @author 17122
 */
@Repository
//JpaRepository < 实体类,主键类型 >  
public interface StudentDAO extends JpaRepository<Student,Long> {
    //模糊查询
    //nativeQuery = true 表示为原生SQL
    @Query(value = "select s_id,s_name,s_age from student s where s.s_name like ?1 ", nativeQuery = true)
    List<Student> findByFirstName(@Param("firstName") String firstName);
}

4 Service层接口和实现类

StudentService.java

/**
 * @author 17122
 */
public interface StudentService {
    //添加一个
    int saveStudent(Student student);
    //根据Sid查找
    Student findStudentBySid(Long sId);
    //查看全部
    List<Student> findAllStudent();
    //根据id修改
    int updateStudentById(Student student);
    //根据id删除
    void deleteStudentById(Long sId);
    //根据姓模糊查询
    List<Student> findStudentByFirstName(String firstName);
}

StudentServiceImpl.java

/**
 * @author 17122
 */
@Service
public class StudentServiceImpl implements StudentService {
    @Autowired
    private StudentDAO studentDAO;
    @Override
    public int saveStudent(Student student) {
        Student save = studentDAO.save(student);
        return ObjectUtils.isEmpty(save) ? 0 : 1;
    }
    @Override
    public Student findStudentBySid(Long sId) {
        return studentDAO.findById(sId).get();
    }
    @Override
    public List<Student> findAllStudent() {
        return studentDAO.findAll();
    }
    @Override
    public int updateStudentById(Student student) {
        Student student1 = studentDAO.saveAndFlush(student);
        return ObjectUtils.isEmpty(student1) ? 0 : 1;
    }
    @Override
    public void deleteStudentById(Long sId) {
        studentDAO.deleteById(sId);
    }
    @Override
    public List<Student> findStudentByFirstName(String firstName) {
        return studentDAO.findByFirstName(firstName+"%");
    }
}

5 测试

@SpringBootTest
class SpJpaApplicationTests {
    @Autowired
    private StudentService studentService;
    @Test
    void saveStudent() {
        Student student = new Student();
        student.setSName("张三")
                .setSAge(100);
        studentService.saveStudent(student);
    }
    @Test
    void findStudentById() {
        Student student = studentService.findStudentBySid(1L);
        System.out.println(student);
    }
    @Test
    void findAllStudent() {
        List<Student> students = studentService.findAllStudent();
        System.out.println(students);
    }
    @Test
    void updateStudent() {
        Student student = new Student();
        student.setSId(3L)
                .setSName("张四")
                .setSAge(10);
        studentService.updateStudentById(student);
    }
    @Test
    void deleteStudent() {
        studentService.deleteStudentById(3L);
    }
    @Test
    void findBySome(){
        System.out.println(studentService.findStudentByFirstName("张"));
    }
}

可以发现,根据配置文件的spring.jpa.hibernate.ddl-auto=update我们不需要新建数据表,只需要新建数据库就可以了,我们测试下添加操作,然后刷新下数据库:

点开student看下

发现那段配置命令可以帮助我们新建数据表,规则是

  • 数据表名称与实体类名称相同
  • 数据表字段将Java中的驼峰命名转化为了下换线命名

可是为什么又多了一张hibernate_sequence表呢?

我们可以点开看下

显然,它是用来表示将要插入下一条数据的ID的

接下来我们可以把每个方法都测试一遍,发现都是可以通过的

6 总结

用了一遍JPA,想说的只有一句话,持久层框架中还是我们中国人开源的Mybatis Plus最好用!


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
druid Java 关系型数据库
Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源
Spring Boot2 系列教程(二十五)Spring Boot 整合 Jpa 多数据源
|
1月前
|
安全 Java API
Java一分钟之-Spring Data REST:创建RESTful服务
【6月更文挑战第15天】Spring Data REST让基于Spring Data的项目轻松创建REST API,免去大量控制器代码。通过自动HTTP映射和链接生成,简化CRUD操作。文章涵盖启用REST、配置仓库、自定义端点、解决过度暴露、缺失逻辑和安全性问题,提供代码示例,如自定义Repository、投影和安全配置,强调在利用其便利性时注意潜在挑战。
36 5
|
25天前
|
存储 Java 关系型数据库
Spring Data与多数据源配置
Spring Data与多数据源配置
|
1月前
|
NoSQL Java MongoDB
Java一分钟之-Spring Data MongoDB:MongoDB集成
【6月更文挑战第11天】Spring Data MongoDB简化Java应用与MongoDB集成,提供模板和Repository模型。本文介绍其基本用法、常见问题及解决策略。包括时间字段的UTC转换、异常处理和索引创建。通过添加相关依赖、配置MongoDB连接、定义Repository接口及使用示例,帮助开发者高效集成MongoDB到Spring Boot应用。注意避免时间差、异常处理不充分和忽视索引的问题。
56 0
|
1月前
|
缓存 NoSQL Java
Java一分钟之-Spring Data Redis:使用Redis做缓存
【6月更文挑战第10天】Spring Data Redis是Spring框架的一部分,简化了Java应用与Redis的集成,支持多种数据结构操作。本文介绍了其基本使用,包括添加依赖、配置Redis连接及使用RedisTemplate。还讨论了常见问题,如序列化、缓存穿透和雪崩,并提供解决方案。通过实战示例展示了缓存与数据库读写分离的实现,强调了Spring Data Redis在提升系统性能中的作用。
61 0
|
1月前
|
SQL Java 数据库
Java一分钟之-Spring Data JPA:简化数据库访问
【6月更文挑战第10天】Spring Data JPA是Spring Data项目的一部分,简化了Java数据库访问。它基于JPA,提供Repository接口,使开发者能通过方法命名约定自动执行SQL,减少代码量。快速上手包括添加相关依赖,配置数据库连接,并定义实体与Repository接口。常见问题涉及主键生成策略、查询方法命名和事务管理。示例展示了分页查询的使用。掌握Spring Data JPA能提升开发效率和代码质量。
44 0
|
17天前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
55 0
|
25天前
|
Java 开发者 Spring
深入理解Spring Boot中的自动配置原理
深入理解Spring Boot中的自动配置原理
|
26天前
|
前端开发 Java 微服务
Spring Boot与微前端架构的集成开发
Spring Boot与微前端架构的集成开发
|
1月前
|
Java
springboot自定义拦截器,校验token
springboot自定义拦截器,校验token
45 6