Spring Boot中使用Spring Data JPA访问MySQL-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

Spring Data JPA是Spring框架提供的用于简化JPAJava Persistence API开发的数据访问层框架。它通过提供一组便捷的API和工具简化了对JPA数据访问的操作同时也提供了一些额外的功能比如动态查询、分页、排序等。

当我们在经历过真正的开发之后我们会发现在实际开发过程中我们对数据库的操作主要为“增删改查”。最为普通的单表操作而言除了表和字段不同外语句基本上都是类似的作为开发者的我们经常需要写大量类似并未枯燥无聊的语句类完成我需要的业务逻辑。

为了避免这些重复且无趣的操作部分开发者为我们提供许多优秀的开发框架其中包括HibernateMyBatis等。而我们今天围绕的Spring Data JPA就是在Hibernate的基础上进行的。Hibernate架构如下

在这里插入图片描述
不要小看这张图2023年11月份软考架构师就是考了张图的。

因为Spring Data JPA依赖于Hibernate。接下来我们围绕一个demo来使用Spring Data JPA。

JPA依赖

要使用Spring Data JPA首先需要在项目中引入相应的依赖。在Maven项目中可以在pom.xml文件中添加以下依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

demo依赖

<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
        <dependency>
            <groupId>com.oracle.ojdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>19.3.0.0</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

配置连接MYSQL配置类

在Spring Boot中配置文件中配置数据库连接信息自动创建表和删除表的配置。如下最后一行

spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

server.port=1001
#spring.datasource.url=jdbc:oracle:thin:@localhost:1521/orcl
#spring.datasource.username=root
#spring.datasource.password=root
#spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver

#hibernate配置
spring.jpa.properties.hibernate.hbm2ddl.auto=create-drop

spring.jpa.properties.hibernate.hbm2ddl.auto是hibernate的配置属性其主要作用是自动创建、更新、验证数据库表结构。该参数的几种配置如下

  • create每次加载hibernate时都会删除上一次的生成的表然后根据你的model类再重新来生成新表哪怕两次没有任何改变也要这样执行这就是导致数据库表数据丢失的一个重要原因。
  • create-drop每次加载hibernate时根据model类生成表但是sessionFactory一关闭,表就自动删除。
  • update最常用的属性第一次加载hibernate时根据model类会自动建立起表的结构前提是先建立好数据库以后加载hibernate时根据model类自动更新表结构即使表结构改变了但表中的行仍然存在不会删除以前的行。要注意的是当部署到服务器后表结构是不会被马上建立起来的是要等应用第一次运行起来后才会。
  • validate每次加载hibernate时验证创建数据库表结构只会和数据库中的表进行比较不会创建新表但是会插入新值。

User实体类

@Entity
//@Data
//@NoArgsConstructor
public class User {

    @Id
    @GeneratedValue
    private Long id;

    private String name;
    private Integer age;

    public User(String name, Integer age) {
        this.name = name;
        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 Integer getAge() {
        return age;
    }

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

    public User(Long id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public User() {
    }

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

@Entity注解标识了User类是一个持久化的实体
@Data@NoArgsConstructor是Lombok中的注解。用来自动生成各参数的Set、Get函数以及不带参数的构造函数。博主并不喜欢直接使用这里边的注解故而全是手动构建的
@Id@GeneratedValue用来标识User对应对应数据库表中的主键

创建一个接口

User实体创建对应的Repository接口实现对该实体的数据访问

public interface UserRepository extends JpaRepository<User, Long> {

    User findByName(String name);

    User findByNameAndAge(String name, Integer age);

    @Query("from User u where u.name=:name")
    User findUser(@Param("name") String name);
}

在Spring Data JPA中只需要编写类似上面这样的接口就可实现数据访问。不再像我们以往编写了接口时候还需要自己编写接口实现类直接减少了我们的文件清单。

下面对上面的UserRepository做一些解释该接口继承自JpaRepository通过查看JpaRepository接口的API文档open in new window可以看到该接口本身已经实现了创建save、更新save、删除delete、查询findAll、findOne等基本操作的函数因此对于这些基础操作的数据访问就不需要开发者再自己定义。

在我们实际开发中JpaRepository接口定义的接口往往还不够或者性能不够优化我们需要进一步实现更复杂一些的查询或操作。
User findByName(String name)
User findByNameAndAge(String name, Integer age)

它们分别实现了按name查询User实体和按name和age查询User实体可以看到我们这里没有任何类SQL语句就完成了两个条件查询方法。这就是Spring-data-jpa的一大特性通过解析方法名创建查询。

除了通过解析方法名来创建查询外它也提供通过使用@Query 注解来创建查询您只需要编写JPQL语句并通过类似“:name”来映射@Param指定的参数就像例子中的第三个findUser函数一样。

创建一个测试类

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void test() throws Exception {

        // 创建10条记录
        userRepository.save(new User(1l,"AAA", 10));
        userRepository.save(new User(2l,"BBB", 20));
        userRepository.save(new User(3l,"CCC", 30));
        userRepository.save(new User(4l,"DDD", 40));
        userRepository.save(new User(5l,"EEE", 50));
        userRepository.save(new User(6l,"FFF", 60));
        userRepository.save(new User(7l,"GGG", 70));
        userRepository.save(new User(8l,"HHH", 80));
        userRepository.save(new User(9l,"III", 90));
        userRepository.save(new User(10l,"JJJ", 100));

        // 测试findAll, 查询所有记录
        Assert.assertEquals(10, userRepository.findAll().size());

        // 测试findByName, 查询姓名为FFF的User
        Assert.assertEquals(60, userRepository.findByName("FFF").getAge().longValue());

        // 测试findUser, 查询姓名为FFF的User
        Assert.assertEquals(60, userRepository.findUser("FFF").getAge().longValue());

        // 测试findByNameAndAge, 查询姓名为FFF并且年龄为60的User
        Assert.assertEquals("FFF", userRepository.findByNameAndAge("FFF", 60).getName());

        // 测试删除姓名为AAA的User
        userRepository.delete(userRepository.findByName("AAA"));

        // 测试findAll, 查询所有记录, 验证上面的删除是否成功
        Assert.assertEquals(9, userRepository.findAll().size());

    }
}

至此Spring Data JPA案例就结束了在Spring Data JPA中主要覆盖了对关系型数据库的抽象以外还有对其他数据存储中间件的实现诸如我们常用的RedisMongoDB,ElasticSearch等。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: mysqlSpring

“Spring Boot中使用Spring Data JPA访问MySQL-CSDN博客” 的相关文章