第六篇:SpringBoot整合JPA

Posted 王大军

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第六篇:SpringBoot整合JPA相关的知识,希望对你有一定的参考价值。

什么是Jpa?

  Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范。它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术,结束现在 Hibernate,TopLink,JDO 等 ORM 框架各自为营的局面。

  值得注意的是,Jpa是在充分吸收了现有 Hibernate,TopLink,JDO 等 ORM 框架的基础上发展而来的,具有易于使用,伸缩性强等优点。从目前的开发社区的反应上看,Jpa 受到了极大的支持和赞扬,其中就包括了 Spring 与 EJB3. 0的开发团队。

注意:Jpa 是一套规范,不是一套产品,那么像 Hibernate,TopLink,JDO 他们是一套产品,如果说这些产品实现了这个 Jpa 规范,那么我们就可以叫他们为 Jpa 的实现产品。

Spring Boot Jpa

  Spring Boot Jpa 是 Spring 基于 ORM 框架、Jpa 规范的基础上封装的一套 Jpa 应用框架,可使开发者用极简的代码即可实现对数据的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用 Spring Data Jpa 可以极大提高开发效率!

Spring Boot Jpa 让我们解脱了 DAO 层的操作,基本上所有 CRUD 都可以依赖于它来实现

在Spring Data中,只要按照既定的规范命名方法,Spring Data Jpa就知道你想干嘛,这样就不用写SQL了,那么规范是什么呢?

 

  当然,这种方法命名主要是针对查询,但是一些特殊需求,可能并不能通过这种方式解决,例如想要查询id最大的用户,这时就需要开发者自定义查询SQL了,如上代码所示,自定义查询SQL,使用@Query注解,在注解中写自己的SQL,默认使用的查询语言不是SQL,而是JPQL,这是一种数据库平台无关的面向对象的查询语言,有点定位类似于Hibernate中的HQL,在@Query注解中设置nativeQuery属性为true则表示使用原生查询,即大伙所熟悉的SQL。

工程建设

1. 添加pom依赖

<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>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test</artifactId>
            <version>2.2.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.3.RELEASE</version>
        </dependency>
    </dependencies>

2. 配置文件application.yml 

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
    username: root
    password: 123456
  jpa:
    properties:
      hibernate:
        hbm2ddl:
          auto: update
        dialect: org.hibernate.dialect.MySQL5InnoDBDialect
    show-sql: true

3. 实体类

package com.demo.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class User {
    @Id
    @GeneratedValue
    private Long id;
    @Column(nullable = false, unique = true)
    private String username;
    @Column(nullable = false, unique = true)
    private String address;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username=\'" + username + \'\\\'\' +
                ", address=\'" + address + \'\\\'\' +
                \'}\';
    }
}

4. UserRepository和UserService

//要继承JpaResponsitory
public
interface UserRepository extends JpaRepository<User, Long> { @Query(value = "select id,username,address from user where username like %?1%", nativeQuery = true) List<User> findAllByUsernameLike(String username); } // UserService @Service public class UserService { @Autowired private UserRepository userRepository; public User addUser(User user){ return userRepository.save(user); } public void delUserById(Long id){ userRepository.deleteById(id); } @Transactional(timeout = 10) public void updateUser(User user){ User resultUser = userRepository.getOne(user.getId()); resultUser.setUsername(user.getUsername()); resultUser.setAddress(user.getAddress()); userRepository.flush(); } @Transactional(timeout = 10) public Optional<User> getUserById(Long id){ return userRepository.findById(id); } public List<User> getAll(){ return userRepository.findAll(); } public List<User> getAllByUsernameLike(String name){ return userRepository.findAllByUsernameLike(name); } }

测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class JpaTest {

    @Autowired
    private UserService userService;

    @Test
    public void add(){
        User user = new User();
        user.setUsername("八戒");
        user.setAddress("众界");
        User result = userService.addUser(user);
        System.out.println(result.toString());
    }
    @Test
    public void del(){
        userService.delUserById(7L);
    }
    @Test
    public void update(){
        User user = new User();
        user.setId(3L);
        user.setUsername("齐天大圣");
        user.setAddress("众界");
        userService.updateUser(user);
    }
    @Test
    public void select(){
        List<User> userList1 = userService.getAll();
        for (User user : userList1){
            System.out.println(user.toString());
        }
        List<User> userList2 = userService.getAllByUsernameLike("霞");
        for (User user : userList2){
            System.out.println(user.toString());
        }
    }

    @Test
    public void selectOne(){
        User user = userService.getUserById(5L).get();
        System.out.println(user.toString());
    }

}

都测试通过即可,自行深入研究

 

以上是关于第六篇:SpringBoot整合JPA的主要内容,如果未能解决你的问题,请参考以下文章

微服务 第六章 springboot 通过Spring-data-jpa 配置Oracle数据源(Spring-data-jpa详细介绍)

第六篇:Python函数进阶篇

软件工程迭代开发第六篇

SpringBoot数据访问 SpringBoot整合JPA

#yyds干货盘点# springboot整合JPA访问Mysql

跟我学SpringCloud | 第六篇:Spring Cloud Config Github配置中心