zoukankan      html  css  js  c++  java
  • SpringDataJPA 入门

    前言

    1. 三者的区别与联系

    JPA:本身是一种ORM规范,不是ORM框架.由各大ORM框架提供实现.

    Hibernate是一个完整的ORM框架,常规CRUD我们不需要写一句SQL;框架比较重,学习成本比较高。

    MyBatis 并不是一个完整的ORM框架,因为我们还需要自己去写全部SQL;轻量级框架,学习成本低,性能好控制。不能自动建表。

    市场上的主流的JPA框架(实现者)有:
    Hibernate (JBoos)、EclipseTop(Eclipse社区)、OpenJPA (Apache基金会)。

    jpa 是规范
    hibernate实现了这个规范
    spring data jpa对hibernate进行了封装,底层使用的hibernate

    2. JPA 的使用介绍:

    JPA 自动建表更新字段 + MyBatis 对于SQL编写 。JPA 自动建表只是在Entity中。

    maven引入

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

    2.1 常用注解:

    2.1.1类上的注释:

    @Entity

    @Entity说明这个class是实体类,并且使用默认的orm规则,即class名即数据库表中表名,class字段名即表中的字段名,如果想改变这种默认的orm规则,就要使用@Table来改变class名与数据库中表名的映射规则

    @Entity(name = "表名")

    @Table

    @Table改变class名与数据库中表名的映射规则。

    @Table(indexes={@Index(columnList="parentCode")})

    @Table(uniqueConstraints={@UniqueConstraint(columnNames={"name"})})

    uniqueConstraints 设置唯一键约束

    如果是联合约束就用下面这种
    
    @Table(name="tbl_sky",
      uniqueConstraints = {@UniqueConstraint(columnNames={"month", "day"})})
    
    如果是单一字段约束可以用
    
    @Table(name="tbl_sky",
      uniqueConstraints = {@UniqueConstraint(columnNames="month")})
    

    总结:如果只是想定义表使用@Entity就可以,如果想加约束@Entity 和@Table 配合使用

    @Embeddable 用于将实体嵌入到另一个实体。

    在使用实体类生成对应的数据库表时,很多的时候都会遇到这种情况:在一个实体类中引用另外的实体类,一般遇上这种情况,我们使用@OneToOne、@OneToMany、@ManyToOne、@ManyToMany这4个注解比较多,但是好奇害死猫,除了这四个有没有别的使用情况,尤其是一个实体类要在多个不同的实体类中进行使用,而本身又不需要独立生成一个数据库表,这就是需要@Embedded、@Embeddable的时候了。

    @MappedSuperclass
    标识在父类上面,可以将变量隐藏到子类中并映射到数据库。(子类继承父类定义的字段)

    2.1.2字段上的注释:

    @Id

    @Id注释用于将Java字段标记为数据库表主键列

    @GeneratedValue 设置主键的生成策略 默认SpringBoot的@GeneratedValue 是不需要加参数的

    strategy属性:提供四种值:
    
    -AUTO主键由程序控制, 是默认选项 ,不设置就是这个
     
    -IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持这种方式
     
    -SEQUENCE 通过数据库的序列产生主键, MYSQL 不支持
     
    -Table 提供特定的数据库产生主键, 该方式更有利于数据库的移植
    
    

    @Column

    @Column注释表示物理数据库列的特定特征。

    默认情况下,JPA使用字段名作为数据库表列名。我们可以使用Column注释来更改默认值。如实例将test作为列名称

    @Column(name="test")
    

    也可以使用@Column(length=10) 设置长度

    @Column(columnDefinition = "VARCHAR(10) default 0")
    

    当将Java float或double值映射到数据库表列时,我们可以设置数字类型列的精度尺度。以下代码将浮点值映射到具有精度8和尺度2的数据库表列。

    @Column(precision=8, scale=2) 
    private float hourlyRate;
    

    我们可以设置映射列是否可以具有空值或者列是否应该具有唯一值。

    @Column(unique=true, nullable=false) 
    private String name;
    

    @Temporal日期的定义格式,我们可以使用以下代码将Java Date类型值映射到TIMESTAMP类型数据库表列。

    @Temporal(TemporalType.TIMESTAMP)
    private Date dob;
    

    @Transient如果我们不想将属性保存到数据库,我们可以使用@Transient注释标记该字段。

    介绍了使用JPA来建表,那么 DAO 层的接口也是可以使用JPA的,暂时不拓展了。

    2.2 SpringBoot 配置文件中的配置:

    spring.jpa.hibernate.ddl-auto: update // 加载hibernate自动更新数据库结构

    spring.jpa.show-sql=true 打印sql语句

    // 命名策略 Hibernate5之前
    命名策略采用naming-strategy配置项
    //配置值org.hibernate.cfg.ImprovedNamingStrategy表名,字段为小写,当有大写字母的时候会添加下划线分隔符号,如:user_id。
    spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy

    Hibernate5之后
    采用implicit-strategy和physical-strategy两个配置项分别控制命名策略
    spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl
    spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    

    设置数据库方言:告诉Hibernate应用程序的底层即将使用哪种数据库——这就是数据库方言。

  • 相关阅读:
    CentOS 7 安装 MariaDB
    yum工具使用 -- 配置自定义yum源
    CentOS 7 安装 redis
    CentOS 7 安装Python3 + 虚拟环境 + django
    Linux 安装 Python3.6.5
    CentOS 7 安装Python3 虚拟环境
    oracle数据库分页原理
    POI工具类
    IoDH单例模式
    为什么使用单例模式【转】
  • 原文地址:https://www.cnblogs.com/wei57960/p/13073093.html
Copyright © 2011-2022 走看看