在Spring Boot项目中使用JPA

1.集成Spring Data JPA

Spring Boot提供了启动器spring-boot-starter-data-jpa,只需要添加启动器(Starters)就能实现在项目中使用JPA。下面一步一步演示集成Spring Data JPA所需的配置。

步骤01 添加JPA依赖。

首先创建新的Spring Boot项目,在项目的pom.xml中增加JPA相关依赖,具体代码如下:

java 复制代码
 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

在上面的示例中,除了引用spring-boot-starter-data-jpa之外,还需要依赖MySQL驱动mysql-connector-java。

步骤02 添加配置文件。

在application.properties中配置数据源和JPA的基本相关属性,具体代码如下:

java 复制代码
spring.datasource.url=jdbc:mysql://Localhost:3306/ceshi?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#JPA配置
spring.jpa.properties.hibernate.hbm2ddl.auto=create
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
#SQL输出
spring.jpa.show-sql=true
#format 下SQL输出
spring.jpa.properties.hibernate.format_sql=true

在上面的参数中,主要是配置数据库的连接以及JPA的属性。下面重点分析一下JPA中的4个配置。

1)spring.jpa.properties.hibernate.hbm2ddl.auto:该配置比较常用,配置实体类维护数据库表结构的具体行为。当服务首次启动时会在数据库中生成相应的表,后续启动服务时,如果实体类有增加属性就会在数据中添加相应字段,原来的数据仍然存在。

  • update:常用的属性,表示当实体类的属性发生变化时,表结构跟着更新。
  • create:表示启动时删除上一次生成的表,并根据实体类重新生成表,之前表中的数据会被清空。
  • create-drop:表示启动时根据实体类生成表,但是当sessionFactory关闭时表会被删除。
  • validate:表示启动时验证实体类和数据表是否一致。
  • none:什么都不做。

2)spring.jpa.show-sql:表示hibernate在操作时在控制台打印真实的SQL语句,便于调试。

3)spring.jpa.properties.hibernate.format_sql:表示格式化输出的JSON字符串,便于查看。

4)spring.jpa.properties.hibernate.dialect:指定生成表名的存储引擎为InnoDB。

步骤03 添加实体类。

首先,创建User实体类,它是一个实体类,同时也是定义数据库中的表结构的类,示例代码如下:

java 复制代码
@Entity
@Table(name= "Users")
public class User {
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Id
    private Long id;
    @Column(length = 64)
    private String name;
    @Column(length = 64)
    private String password;
    private int age;

    public User() {

    }
    public User(String name,String password, int age) {
        this.name=name;
        this.password=password;
        this.age=age;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                '}';
    }
}

在上面的示例中,使用@Table注解映射数据库中的表,使用@Column注解映射数据库中的字段。具体说明如下:

1)@Entity:必选的注解,声明这个类对应了一个数据库表。

2)@Table:可选的注解,声明了数据库实体对应的表信息,包括表名称、索引信息等。这里声明这个实体类对应的表名是Users。如果没有指定,则表名和实体的名称保持一致,与@Entity注解配合使用。

3)@Id注解:声明了实体唯一标识对应的属性。

4)@Column注解:用来声明实体属性的表字段的定义。默认的实体每个属性都对应表的一个字段,字段名默认与属性名保持一致。字段的类型根据实体属性类型自动对应。这里主要声明了字符字段的长度,如果不这么声明,则系统会采用255作为该字段的长度。

5)@GeneratedValue注解:设置数据库主键自动生成规则。strategy属性提供4种值:

  • AUTO:主键由程序控制,是默认选项。
  • IDENTITY:主键由数据库自动生成,即采用数据库ID自增长的方式,Oracle不支持这种方式。
  • SEQUENCE:通过数据库的序列产生主键,通过@SequenceGenerator注解指定序列名,MySQL不支持这种方式。
  • TABLE:通过特定的数据库表产生主键,使用该策略可以使应用更易于数据库移植。

除了上面使用到的@Entity注解、@Table注解等之外,还有一些常用的实体注解,具体说明如表9-1所示。这些注解用于描述实体对象与数据库字段的对应关系,需要注意的是,JPA与MyBatis是有区别的,千万别混淆。


步骤04 测试验证。

以上几步就是集成JPA的全部配置,配置完之后启动项目,就可以看到日志中显示如图所示的内容。


由图可知,系统启动后自动连接数据库,创建数据表结构,并打印出执行的SQL语句。如果查看数据库,可以看到数据库中对应的Users表也创建成功了,说明项目已经成功集成JPA并创建实体表。

2.JpaRepository简介

JpaRepository是Spring Data JPA中非常重要的类。它继承自Spring Data的统一数据访问接口------Repository,实现了完整的增、删、改、查等数据操作方法。JpaRepository提供了30多个默认方法,基本能满足项目中的数据库操作功能。

JpaRepository是实现Spring Data JPA技术访问数据库的关键接口。JpaRepository继承自PagingAndSortingRepository接口,而PagingAndSortingRepository接口继承自CrudRepository接口。CrudRepository和Repository接口则是Spring Data底层通用的接口,定义了几乎所有的数据库接口方法,统一了数据访问的操作。

另外,JPA提供了非常完善的数据查询功能,包括自定义查询、自定义SQL、已命名查询等多种数据查询方式。

3.实战:实现人员信息管理模块

JpaRespository默认实现完整的增、删、改、查等数据操作。只需定义一个Repository数据访问接口并继承JpaRepository类即可。下面通过之前创建的User用户类和表实现用户的增、删、改、查功能来演示用户管理模块的实现。

1. 定义Repository

首先创建UserRepository接口并加上@Repository注解,然后继承JpaRepository类,不需要编写任何代码,即可实现人员信息管理模块的全部功能。具体示例代码如下:

java 复制代码
@Repository
public interface UserRepository extends JpaRepository<Users, Long> {

}

我们看到UserRepository虽然什么方法都没有定义,但是继承了JpaRepository之后,自然就拥有JpaRepository中的所有方法。

2. 实现新增、修改、删除、查询

(1)新增

接下来创建UserRepositoryTests单元测试类,并实现用户新增的测试方法。示例代码如下:

java 复制代码
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryTest {
    @Resource
    private UserRepository userRepository;

    @Test
    public void testSave() {
        User user = new User("ysxq","123456",40);
        userRepository.save(user);
    }
}

在上面的示例中,在UserRepositoryTests单元测试类中注入UserRepository对象,然后使用JpaRespository预生成的save()方法实现人员数据保存的功能。如下图所示:

(2)修改

修改与新增都使用save()方法,传入数据实体即可。JPA自动根据主键id修改user数据。示例代码如下:

java 复制代码
    @Test
    public void testUpdate() {
        User user = userRepository.findById(1L).get();
        user.setPassword("z123456");
        userRepository.save(user);
    }

(3)删除

删除也非常简单,使用的是JpaRespository预生成的delete()方法,可以直接将对象删除,同时也可以使用deleteByXXX方法。示例代码如下:

java 复制代码
    @Test
    public void testDetle() {
        User user = new User("ysxq","123456",40);
        userRepository.delete(user); 
    }

(4)查询

JPA对于数据查询的支持非常完善,有预生成的findById()、findAll()、findOne()等方法,也可以使用自定义的简单查询,还可以自定义SQL查询。示例代码如下:

java 复制代码
    @Test
    public void testSelect() {
        userRepository.findById(1L);
    }

3. 验证测试

单击Run Test或在方法上右击,选择Run 'UserRepositoryTest'命令,运行全部测试方法,结果如图所示。

结果表明人员信息的增、删、改、查单元测试全部运行成功,并输出了相应的查询结果,说明使用JPA实现了人员信息管理功能。

相关推荐
ZSYP-S5 分钟前
Day 15:Spring 框架基础
java·开发语言·数据结构·后端·spring
yuanbenshidiaos12 分钟前
C++----------函数的调用机制
java·c++·算法
是小崔啊30 分钟前
开源轮子 - EasyExcel01(核心api)
java·开发语言·开源·excel·阿里巴巴
黄公子学安全39 分钟前
Java的基础概念(一)
java·开发语言·python
liwulin050640 分钟前
【JAVA】Tesseract-OCR截图屏幕指定区域识别0.4.2
java·开发语言·ocr
jackiendsc44 分钟前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
Yuan_o_44 分钟前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Oneforlove_twoforjob1 小时前
【Java基础面试题027】Java的StringBuilder是怎么实现的?
java·开发语言
程序员一诺1 小时前
【Python使用】嘿马python高级进阶全体系教程第10篇:静态Web服务器-返回固定页面数据,1. 开发自己的静态Web服务器【附代码文档】
后端·python
数据小小爬虫1 小时前
利用Java爬虫获取苏宁易购商品详情
java·开发语言·爬虫