当前位置: 首页 > 图灵资讯 > 技术篇> SpringBoot之Spring Data JPA入门学习

SpringBoot之Spring Data JPA入门学习

来源:图灵教育
时间:2023-06-08 09:24:10

JPA(Java Persistence API)Java持久API是 Java 持久标准规范,Hibernate是实现持久标准的技术,而Spring Data JPA是在 Hibernate 一个基于包装的框架。

第一,增加依赖性

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-web</artifactId></dependency><!--lombok--><dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId></dependency><!--mysql--><dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>8.0.31</version></dependency><!--jpa--><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-jpa</artifactId></dependency>

Mysql和JPA的依赖主要添加到pom文件中。

二、属性配置(application.properties)

# 连接spring的数据库.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.username=rootspring.datasource.password=123456spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mydb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false&rewriteBatchedStatements=true # jpa相关配置# sql语句spring显示.jpa.show-sql=true # Spring指定数据库的初始化模式.jpa.hibernate.ddl-auto=update

spring.jpa.hibernate.ddl-auto属性介绍:

none: 不指定数据库的初始模式

create: Spring 当Boot应用程序运行时,将删除并重新创建数据库。因此,每次启动时,所有数据都将被清空

create-drop: 当sessionFactory关闭时,表会自动删除

validate: Spring 当Boot应用程序运行时,将检查数据库中的表是否与java实体类相匹配。如果不匹配,则运行失败

update: 当在java实体类中添加一个字段时,在应用程序重新运行时,将字段添加到数据库表中的新列,但不会删除以前的列或约束

update通常用于开发阶段,但需要注意的是,update即使不再需要,也不会移除以前存在的列和约束。

当产品发布时,建议使用none或不直接指定该属性。

三、创造实体

@Entity:定义对象将成为JPA管理的实体,并将映射到指定的数据库表。

@Table:用于指定数据库表的表名

@Id:将属性定义为数据库的主键,一个实体必须有一个

@GeneratedValue: 主键生成策略。有四种生成策略。

TABLE(通过表产生主键,框架由表模拟序列产生主键,使用该策略使应用程序更容易移植数据库),

SEQUENCE(MySQL不支持通过序列生成主键,通过@Sequencegenenerator注释指定序列名称)

IDENTITY(MYSQL数据库一般采用数据库ID自增长)

AUTO(JPA自动选择合适的策略是默认选项)

@Column:用于识别实体类中属性与数据表中字段之间的对应关系 name:数据库中表的列名

import lombok.Data; import javax.persistence.*;import java.math.BigDecimal; /** * @author qinxun * @date 2023-06-07 * @Descripion: 用户实体 */@Entity@Table(name = "t_user")@Datapublic class User {     @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;     /**     * 姓名     */    @Column(name = "name")    private String name;     /**     * 年龄     */    @Column(name = "age")    private Integer age;     /**     * 余额     */    @Column(name = "money")    private BigDecimal money;  }

四、创建数据层

import com.example.quartzdemo.entity.User;import org.springframework.data.jpa.repository.JpaRepository; /** * @author qinxun * @date 2023-06-07 * @Descripion: 用户数据层 */public interface UserRepository extends JpaRepository<User, Long> {}

  • 我们直接书写自定义界面继承JpaRepository 获得增删改差的能力
  • 两个泛型参数,第一个表示POJO绑定的repository操作,第二个表示自增id类型
五、测试

1.新增数据

import com.example.quartzdemo.entity.User;import com.example.quartzdemo.repository.UserRepository;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest; import java.math.BigDecimal; /** * @author qinxun * @date 2023-06-07 * @Descripion: 使用JPA */@SpringBootTestpublic class JpaTest {     @Autowired    private UserRepository userRepository;     /**     * 新增数据     */    @Test    void test1() {        User user = new User();        user.setName(张三);        user.setMoney(BigDecimal.TEN);        user.setAge(20);        userRepository.save(user);    } }

控制台显示SQL新执行语句

Hibernate: insert into t_user (age, money, name) values (?, ?, ?)

我们查看数据库,看到数据已经添加到数据库中

SpringBoot之Spring Data JPA入门学习_spring

2.查询数据

    /**     * 查询所有数据数据     */    @Test    void test2() {        List<User> userList = userRepository.findAll();        //Hibernate: select user0_.id as id1_1_, user0_.age as age2_1_, user0_.money as money3_1_, user0_.name as name4_1__ from t_user user0_        //[User(id=1, name=张三, age=20, money=10.00)]        System.out.println(userList);    }     /**     * 查询ID对应的数据     */    @Test    void test3() {        User user = userRepository.findById(1L).get();        //Hibernate: select user0_.id as ID1_1_0_, user0_.age as age2_1_0_, user0_.money as money3_1_0_, user0_.name as name4_1_0_0_ from t_user user0_ where user0_.id=?        //User(id=1, name=张三, age=20, money=10.00)        System.out.println(user);    }

3.修改数据

 /**     * 修改数据     */    @Test    void test4() {        // 修改ID为1的数据        User user = new User();        user.setName(张三);        user.setMoney(BigDecimal.TEN);        user.setAge(21);        // 指定要修改的ID        user.setId(1L);        userRepository.save(user);    }

控制台显示SQL修改的句子

Hibernate: select user0_.id as ID1_1_0_, user0_.age as age2_1_0_, user0_.money as money3_1_0_, user0_.name as name4_1_0_0_ from t_user user0_ where user0_.id=?Hibernate: update t_user set age=?Hibernate: update t_user set age=?, money=?, name=? where id=?

我们查看了数据库,这个ID为1的数据已经修改了 age变成了21

SpringBoot之Spring Data JPA入门学习_User_02

4.删除数据

  /**     * 删除数据     */    @Test    void test5() {        // 删除ID为1的数据        userRepository.deleteById(1L);    }

控制台显示sql语句

Hibernate: select user0_.id as ID1_1_0_, user0_.age as age2_1_0_, user0_.money as money3_1_0_, user0_.name as name4_1_0_0_ from t_user user0_ where user0_.id=?Hibernate: delete from t_user where id=?

我们查看了数据库,发现ID1的数据已经被删除了

SpringBoot之Spring Data JPA入门学习_数据_03

六、小结

从以上步骤来看,我们会发现jpa项目的建设是一个相对简单的过程,增加了必要的依赖性。我们稍微注意两个

  • 创建POJO 与我们的实际表格有关
  • 创建一个RepositoryApi继承自org.springframework.data.jpa.repository.JpaRepository
  • 通过IOC/DI注入RepositoryApi对象,然后可以快乐地进行db操作