Spring Data JDBC & Spring Data JPA

synopsis

Spring Data JDBC, part of the larger Spring Data family, makes it easy to implement JDBC based repositories. This module deals with enhanced support for JDBC based data access layers. It makes it easier to build Spring powered applications that use data access technologies.
其实就是基于jdbc的Repository,jdbc作为底层的存储

Jpa其实也是同理,只是功能更加强大,增加了@Query等jpa注解的支持。

定义Repository

定义自己的repository

interface UserRepository extends CrudRepository<User, Long> {

  long countByLastname(String lastname);
}

CrudRepository, ListCrudRepository,PagingAndSortingRepository, JpaRepository

开启配置

import org.springframework.data..repository.config.EnableJpaRepositories;

@EnableJpaRepositories
class Config {}

使用

class SomeClient {

  private final PersonRepository repository;

  SomeClient(PersonRepository repository) {
    this.repository = repository;
  }

  void doSomething() {
    List<Person> persons = repository.findByLastname("Matthews");
  }
}


注解

(1)Entity
@javax.persistence.Entity(name=“xxx”)
name指定实体Bean的名称,默认值为 bean class 的非限定类名,select o from xxx o where o.id=?1

(2)Table
@javax.persistence.Table(catalog=“xx”,name=“xx”,schema=“xx”,uniqueConstraints={ @UniqueConstraint(columnNames={“xx”,“xx”})})
name:指定表的名称
catalog:指定数据库名称
schema:指定数据库的用户名
uniqueConstraints:指定唯一性字段约束,如为personid 和name 字段指定唯一性约束
uniqueConstraints={ @UniqueConstraint(columnNames={“personid”, “name”})}

(3)Id
@javax.persistence.Id()
映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键.

(4)GeneratedValue
@javax.persistence.GeneratedValue(generator=“xxx”,strategy=GenerationType.AUTO)
strategy:表示主键生成策略,有AUTO,INDENTITY,SEQUENCE 和 TABLE 4种
分别表示让ORM框架自动选择,根据数据库的Identity字段生成,根据数据库表的Sequence字段生成,以有根据一个额外的表生成主键,默认为AUTO
generator:表示主键生成器的名称,这个属性通常和ORM框架相关,例如,Hibernate可以指定uuid等主键生成方式.
Hibernate UUID
@Id @GeneratedValue(generator=“system-uuid”)
@GenericGenerator(name=“system-uuid”,strategy = “uuid”)

(5)Basic
@javax.persistence.Basic(fetch=FetchType.LAZY,optional=true)
fetch:抓取策略,延时加载与立即加载
optional:指定在生成数据库结构时字段是否允许为 null

(6)Column
@javax.persistence.Column(length=15,nullable=false,columnDefinition=“”,insertable=true,scale=10,table=“”,updatable=true)
@Column注解指定字段的详细定义
name:字段的名称,默认与属性名称一致
nullable:是否允许为null,默认为true
unique:是否唯一,默认为false
length:字段的长度,仅对String类型的字段有效
columnDefinition:表示该字段在数据库中的实际类型
通常ORM框架可以根据属性类型自动判断数据库中字段的类型,
但是对于Date类型仍无法确定数据库中字段类型究竟是DATE,TIME还是TIMESTAMP,
此外,String的默认映射类型为VARCHAR,如果要将String类型映射到特定数据库的BLOB或TEXT字段类型,该属性非常有用
如: @Column(name=“BIRTH”,nullable=“false”,columnDefinition=“DATE”)
insertable:默认情况下,JPA持续性提供程序假设所有列始终包含在 SQL INSERT 语句中。
如果该列不应包含在这些语句中,请将 insertable 设置为 false
updatable:列始终包含在 SQL UPDATE 语句中。如果该列不应包含在这些语句中,请将 updatable 设置为 false
table:实体的所有持久字段都存储到一个其名称为实体名称的数据库表中,如果该列与 @SecondaryTable表关联
需将 name 设置为相应辅助表名称的String名称

(7)Temporal
@javax.persistence.Temporal(TemporalType.DATE)
value:TemporalType.DATE,TemporalType.TIME,TemporalType.TIMESTAMP时间类型格式

(8)Enumerated
@javax.persistence.Enumerated(EnumType.STRING)
value:EnumType.STRING,EnumType.ORDINAL
枚举类型成员属性映射,EnumType.STRING指定属性映射为字符串,EnumType.ORDINAL指定属性映射为数据序

(9)Lob
@javax.persistence.Lob
用于标注字段类型为Clob和Blob类型
Clob(Character Large Ojects)类型是长字符串类型,实体的类型可为char[]、Character[]、或者String类型
Blob(Binary Large Objects)类型是字节类型,实体的类型可为byte[]、Byte[]、或者实现了Serializable接口的类。
通常使用惰性加载的方式, @Basic(fetch=FetchType.LAZY)

(10)Transient
@javax.persistence.Transient
@Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性

(11)SecondaryTable
@javax.persistence.SecondaryTable
将一个实体映射到多个数据库表中
如:
@Entity
@SecondaryTables({
@SecondaryTable(name = “Address”),
@SecondaryTable(name = “Comments”)
})
public class Forum implements Serializable {
@Column(table = “Address”, length = 100)
private String street;
@Column(table = “Address”, nullable = false)
private String city;
@Column(table = “Address”)
private String conutry;
@Column(table = “Comments”)
private String title;
@Column(table = “Comments”)
private String Comments;
@Column(table = “Comments”)
}
table属性的值指定字段存储的表名称
没有用 @Column 注解改变属性默认的字段将会存在于 Forum 表

(12)@Embeddable
@javax.persistence.Embeddable
嵌套映射,在被嵌套的类中使用Embeddable注解,说明这个就是一个可被嵌套的类,使用 @Embedded
当同一个类被不同的注解方式的类嵌套时,可能会出现一些错误,使用 @Access(AccessType. FIELD)设定被嵌套类的注解方式

你可能感兴趣的:(每天一篇技术博客,spring,hibernate,java)