SpringBoot项目使用JPA(Hibernate)

JPA与Hibernate的关系

JPA(Java Persistence API)是Java EE 5的标准ORM接口,也是ejb3规范的一部分。

Hibernate,当今很流行的ORM框架,是JPA的一个实现,但是其功能是JPA的超集。

超集:如果一个集合S2中的每一个元素都在集合S1中,且集合S1中可能包含S2中没有的元素,则集合S1就是S2的一个超集,反过来,S2是S1的子集。 

JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现。

SpringBoot使用JPA

引入相关依赖

<!-- JDBC -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<!-- MySQL 驱动包-->
<!--MySQL Server 版本为 8.x时,mysql-connector-java使用5.1.35时会报错-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>

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

application.yml配置

server:
  port: 9999

spring:
  datasource:
    #通用配置
    driver-class-name: com.mysql.jdbc.Driver
    password: root
    username: root
    url: jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&charcterEncoding=UTF-8&useSSL=false
    #数据源连接池配置
    hikari:
      minimum-idle: 10
      maximum-pool-size: 20
      idle-timeout: 500000
      max-lifetime: 540000
      connection-timeout: 60000
      connection-test-query: select 1
  #jpa配置
  jpa:
    database: mysql #指定数据库类型
    show-sql: true #显示或不记录每个sql查询
    hibernate:
      ddl-auto: update # Hibernate ddl自动(创建、创建-删除、更新)

启动类

@SpringBootApplication
@EnableJpaRepositories
public class DemoApp {

    public static void main(String[] args) {
        SpringApplication.run(DemoApp.class, args);
    }
}

在Springboot应用开发中使用JPA时,通常在主应用程序所在包或者其子包的某个位置定义我们的Entity和Repository,这样基于Springboot的自动配置,无需额外配置,我们定义的Entity和Repository即可被发现和使用。但有时候我们需要定义的Entity和Repository不在应用程序所在包及其子包,那么这时候就需要使用@EntityScan和@EnableJpaRepositories了。

实体类、 Repository接口

User.java

@Entity
@Table(name = "tb_user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "age")
    private int age;

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

UserRepository.java

@Repository
public interface UserRepository extends JpaRepository<User, Integer> {

}

测试验证

@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApp.class)
public class WebSpringTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void testJpa() {
        //保存
        User user = new User();
        user.setName("谢文");
        user.setAge(23);
        userRepository.save(user);
        System.out.println("user id = " + user.getId());

        //更新
        Optional<User> optionalUser = userRepository.findById(user.getId());
        User user1 = optionalUser.get();
        user1.setName("谢贤");
        user1.setAge(83);
        userRepository.save(user1);

        //查询列表
        List<User> userList = userRepository.findAll();
        for (User userInfo : userList) {
            System.out.println("id = " + userInfo.getId() + ", name = " + userInfo.getName() + ", age = " + userInfo.getAge());
        }
    }
}

JPA的常见注解

@Entity    声明类为实体或表。
@Table    声明表名。
@Basic    指定非约束明确的各个字段。
@Embedded    指定类或它的值是一个可嵌入的类的实例的实体的属性。
@Id    指定的类的属性,用于识别(一个表中的主键)。
@GeneratedValue    指定如何标识属性可以被初始化,例如自动、手动、或从序列表中获得的值。
@Transient    指定的属性,它是不持久的,即:该值永远不会存储在数据库中。
@Column    指定持久属性栏属性。
@SequenceGenerator    指定在@GeneratedValue注解中指定的属性的值。它创建了一个序列。
@TableGenerator    指定在@GeneratedValue批注指定属性的值发生器。它创造了的值生成的表。
@AccessType    这种类型的注释用于设置访问类型。如果设置@AccessType(FIELD),则可以直接访问变量并且不需要getter和setter,但必须为public。如果设置@AccessType(PROPERTY),通过getter和setter方法访问Entity的变量。
@JoinColumn    指定一个实体组织或实体的集合。这是用在多对一和一对多关联。
@UniqueConstraint    指定的字段和用于主要或辅助表的唯一约束。
@ColumnResult    参考使用select子句的SQL查询中的列名。
@ManyToMany    定义了连接表之间的多对多一对多的关系。
@ManyToOne    定义了连接表之间的多对一的关系。
@OneToMany    定义了连接表之间存在一个一对多的关系。
@OneToOne    定义了连接表之间有一个一对一的关系。
@NamedQueries    指定命名查询的列表。
@NamedQuery    指定使用静态名称的查询。

 

posted @ 2022-04-23 17:14  残城碎梦  阅读(509)  评论(0编辑  收藏  举报