SpringBoot-15-Spring-Data-Jpa的使用

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: SpringBoot-15-Spring-Data-Jpa的使用

SpringBoot-15-Spring-Data-Jpa的使用

Spring Data Jpa 介绍

什么是JPA?


JPA(Java Persistence API)是Java持久化API的意思,他是在JDK5.0后提出的Java持久化规范,具体可参考官网https://github.com/javaee/jpa-spec


JPA的出现是为了简化持久层和整合ORM技术,Hibernate、TopLink、JDO等ORM框架各自为营的局面。JPA主要包含一下三个方面的技术:


ORM(object/relational metadata)元数据的映射:JPA支持xml和注解两种方式,元数据描述对象和表之间的映射关系,框架根据此将对象持久化到数据库表中。


对象查询语言(*Java Persistence Query Language JPQL):这个是持久化操作中重要的一环,通过面向对象数据库的查询语言,避免程序SQL语句的高耦合。


API: 操作实体对象来执行CRUD操作。


代码实现

创建springboot项目

  • 在pom.xml中添加jpa依赖
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>


  • 在application.yml中的配置:包含数据库链接信息和自动创建表结构的设置
server:
  port: 8899
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    hibernate:
      ddl-auto: validate
    show-sql: true
    database: mysql


注:


spring.jpa.show-sql:为true时表示在日志中展示Sql语句


spring.jpa.hibernate.ddl-auto:hibernate的配置属性,会根据实体类去更新、创建、验证表结果使用的时候需要注意

create:hibernate的每次加载都会将上次生成的表进行删除,然后重新生成表,生成表的依据是我们的实体类。


create-drop:hibernate的每次加载都会根据根据实体类进行生成表,每一次sessionFactory关闭表就会被删除。


update: hibernate被第一次加载的时候会根据实体类进行创建表结构,以后hibernate加载时会根据实体类结构去自动更新表结构。‘


validate:hibernate每次加载,都会去验证表结构,但是不会去创建表(生成环境一般使用这个)


代码的实现

创建表

REATE TABLE `student`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '学生姓名',
 `sex` enum ('男', '女') DEFAULT '男' COMMENT '性别默认男',
 `age` tinyint unsigned default 1 comment '年龄',
  `mobile` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '注册手机号',
  `email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '注册邮箱',
  `create_date` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
  `update_date` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0),
 `is_enabled` int(2) NULL DEFAULT 1 COMMENT '帐户是否可用(1 可用,0 删除用户)',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE INDEX `name`(`name`) USING BTREE,
  UNIQUE INDEX `mobile`(`mobile`) USING BTREE,
  UNIQUE INDEX `email`(`email`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '学生表' ROW_FORMAT = Dynamic;


创建实体类

@Table(name="student")
@Entity
@Data
public class Student {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String sex;
    private int age;
    private String email;
    private String mobile;
    private int isEnabled;
    private Date createDate;
    private Date updateDate;
}



注:


@Entity必须有,表示这个类是一个实体类


@Table:可选,用于指定数据库表名,类名和数据库表名符合驼峰及下划线规则,可以省略这个注解。


@Id:表示表的主键


@Generated:表示主键的生成方式


想要了解更多可以去官方文档进行查看:hibernate官方文档。


创建数据接口

public interface StudentService  extends JpaRepository<Student, Long> {
    /**
     * 获取所有学生信息
     * @return
     */
    @Query("from Student s where s.isEnabled=1")
    List<Student> getAllSutdents();
}


JpaRepository为我们提供了各种针对单表的数据操作方法:增删改查。

创建Controller层

@Slf4j
@RestController
@RequestMapping("/student")
public class StudentController {
    @Autowired
    private StudentService studentService;
    @GetMapping("getallstudents")
    public List<Student> getAllSutdents(){
        List<Student> allSutdents = studentService.getAllSutdents();
        return allSutdents;
    }
    /**
     * 保存数据
     * @param student
     * @return
     */
    @PostMapping("create")
    public Student saveStudent(@RequestBody Student student) {
        //保存一个对象到数据库,insert
        studentService.saveAndFlush(student);
        return  student;
    }
    @GetMapping("/{id}")
    public Student getSutdentInfo(@PathVariable("id") Long id) {
        Optional<Student> optional = studentService.findById(id);
        return optional.orElseGet(Student::new);
    }
    @GetMapping("/delete/{id}")
    public void deleteSutdent(@PathVariable("id") Long id) {
        //根据id删除1条数据库记录
        studentService.deleteById(id);
    }
    @PostMapping("update")
    public @ResponseBody Student updatSutdent(@RequestBody Student student) {
        Optional<Student> optional = studentService.findById(student.getId());
        Student stu = optional.orElseGet(Student::new);
        stu.setEmail(student.getEmail());
        stu.setMobile(student.getEmail());
        stu.setAge(student.getAge());
        stu.setSex(student.getSex());
        stu.setName(student.getName());
        stu.setUpdateDate(new Date());
        //保存一个对象到数据库,insert
        Student save = studentService.save(student);
        return  save;
    }
    @GetMapping("getall")
    public List<Student> getAll() {
        List<Student> studentList = studentService.findAll();
        //查询article表的所有数据
        return studentList;
    }
}


测试

启动项目打开postman,测试http://localhost:8899/student/getallstudents:结果为:

[
    {
        "id": 11,
        "name": "小芳",
        "sex": "女",
        "age": 23,
        "email": "825505212@qq.com",
        "mobile": "13333835900",
        "isEnabled": 1,
        "createDate": "2022-02-26T14:40:30.000+00:00",
        "updateDate": "2022-02-26T14:40:30.000+00:00"
    },
    {
        "id": 24,
        "name": "李四",
        "sex": "男",
        "age": 23,
        "email": "825505242@qq.com",
        "mobile": "133338359345",
        "isEnabled": 1,
        "createDate": "2022-02-28T11:42:04.000+00:00",
        "updateDate": "2022-02-28T11:42:04.000+00:00"
    }
]


其他

JPA的功能不止有有这些,这只是作为spring boot系列教程,并不能将spring data jpa的全面讲到,相应全面了解还要到官方文档进行深度了解。


如果您觉得本文不错,欢迎关注支持,您的关注是我坚持的动力!


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
9月前
|
Java 关系型数据库 MySQL
SpringBoot-17-Spring-Data-JPA的多数据源配置
SpringBoot-17-Spring-Data-JPA的多数据源配置
183 0
|
Java 数据库 Spring
Spring与SpringBoot整合Spring Data JPA及使用(三)
Spring与SpringBoot整合Spring Data JPA及使用
118 0
Spring与SpringBoot整合Spring Data JPA及使用(三)
|
Java Spring
Spring与SpringBoot整合Spring Data JPA及使用(二)
Spring与SpringBoot整合Spring Data JPA及使用
155 0
Spring与SpringBoot整合Spring Data JPA及使用(二)
|
SQL Java 数据库连接
Spring与SpringBoot整合Spring Data JPA及使用(一)
Spring与SpringBoot整合Spring Data JPA及使用
176 0
Spring与SpringBoot整合Spring Data JPA及使用(一)
|
Java API Spring
Spring Boot 整合 Spring Data JPA
Java 持久化 API (JPA)是一个 Java 应用程序接口 规范,描述了使用 Java标准版平台(Java SE) 和 Java企业版平台(Java EE)的应用中的 关系数据 的管理
146 0
|
存储 SQL Java
Spring Boot 之Spring data JPA简介
Spring Boot 之Spring data JPA简介
|
存储 分布式计算 NoSQL
什么是Spring Data?
Spring Data 的委托是为数据访问提供熟悉且符合 Spring 的编程模型,同时仍保留着相关数据存储的特​​殊特征。
什么是Spring Data?
|
Java 数据库连接 Spring
Spring Boot(17)——使用Spring Data JPA
使用Spring Data JPA 使用Spring Data JPA需要在pom.xml中添加spring-boot-starter-data-jpa依赖。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> 之后就可以在应用中定义Entity了,并使用javax.persistence相关注解了。
2023 0
|
Java 数据格式 JSON
SpringBoot-Spring Data Jpa调优
N+1查询 使用JpaSpecificationExecutor来查询 在Specification.toPredicate 方法中使用fetch方法,写法如下,使用之后查询会关联查询,但是对于集合实体这种属性会产生错误数据,不建议集合属性使用这种方式查询。
2468 0