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

简介: 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最好用!


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
2月前
|
NoSQL Java 数据库连接
《深入理解Spring》Spring Data——数据访问的统一抽象与极致简化
Spring Data通过Repository抽象和方法名派生查询,简化数据访问层开发,告别冗余CRUD代码。支持JPA、MongoDB、Redis等多种存储,统一编程模型,提升开发效率与架构灵活性,是Java开发者必备利器。(238字)
|
2月前
|
存储 Java 关系型数据库
Spring Boot中Spring Data JPA的常用注解
Spring Data JPA通过注解简化数据库操作,实现实体与表的映射。常用注解包括:`@Entity`、`@Table`定义表结构;`@Id`、`@GeneratedValue`配置主键策略;`@Column`、`@Transient`控制字段映射;`@OneToOne`、`@OneToMany`等处理关联关系;`@Enumerated`、`@NamedQuery`支持枚举与命名查询。合理使用可提升开发效率与代码可维护性。(238字)
327 1
|
2月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
422 2
|
3月前
|
人工智能 Java 机器人
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
Spring AI Alibaba集成Ollama,基于Java构建本地大模型应用,支持流式对话、knife4j接口可视化,实现高隐私、免API密钥的离线AI服务。
2575 1
基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API
存储 JSON Java
527 0
|
3月前
|
SQL Java 数据库连接
Spring Data JPA 技术深度解析与应用指南
本文档全面介绍 Spring Data JPA 的核心概念、技术原理和实际应用。作为 Spring 生态系统中数据访问层的关键组件,Spring Data JPA 极大简化了 Java 持久层开发。本文将深入探讨其架构设计、核心接口、查询派生机制、事务管理以及与 Spring 框架的集成方式,并通过实际示例展示如何高效地使用这一技术。本文档约1500字,适合有一定 Spring 和 JPA 基础的开发者阅读。
372 0
|
2月前
|
Java 测试技术 数据库连接
【SpringBoot(四)】还不懂文件上传?JUnit使用?本文带你了解SpringBoot的文件上传、异常处理、组件注入等知识!并且带你领悟JUnit单元测试的使用!
Spring专栏第四章,本文带你上手 SpringBoot 的文件上传、异常处理、组件注入等功能 并且为你演示Junit5的基础上手体验
873 2
|
2月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
322 3
|
5月前
|
缓存 JSON 前端开发
第07课:Spring Boot集成Thymeleaf模板引擎
第07课:Spring Boot集成Thymeleaf模板引擎
558 0
第07课:Spring Boot集成Thymeleaf模板引擎
|
5月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
947 0

热门文章

最新文章