JPA使用

JPA是 : java persistence api

springboot中使用jpa

导包:

  <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-data-jpaartifactId>
        dependency>
jpa常用注解
  • @Entity
  • @Id
  • @Column : 可以设置生成数据库表中字段的长度等
  • @OneToOne
  • @OneToMany
  • @ManyToMany
  • @Table : 设置表的名字
  • @JoinColumn : 单向一对多的时候,在一方设置连接字段
  • @JoinTable : 多对多的时候,设置连接表的名字,关联的字段,等
  • @org.hibernate.annotations.ForeignKey(name = “null”) : 可以取消物理外键的生成
  • @Transient : 模型中的字段 在表中不存在
  • @GeneratedValue(strategy=GenerationType.IDENTITY) : 设置主键自动增长
导航属性
  • 单项 : 单项一对多 @OneToMany @JoinColumn
  • 双向 : 两个Model中都有导航属性,通过导航属性找到其他的model

Jpa中模型关系,分为关系的维护端,,和 关系的被维护端,,, 在一对多中,多端是关系的维护端,,一端是关系的被维护端

@JoinColumn 打在关系的维护端

ORM

Object relation mapping : 实体去操作数据库对象,用实体去表达数据库的数据,,
使用jpa创建表只是它的附属操作,不去创建表,不代表这个实体没有用

物理外键和逻辑外键

物理外键的好处: 保证数据库数据的一致性,,
坏处: 增删改查都会去核实这个外键,影响性能

数据库优化
  • 数据库中一个表中的数据记录不要太多,,上限5千万条,除了建立索引,可以水平分表,拆分成多个表
  • 一个表中字段越多查询越慢,,当字段很多的时候,考虑垂直拆分,拆分成多个表
    解决查询问题,不是体现在数据库的设计上,而主要是查询方式上,比如:like语句

利用各种各样的缓存去尽少查询数据库–redis

JPA中的复杂查询

HQL语言, JPQL:查出来的是对象,不是sql字段数组,,,原生sql,,处理查出来的结果集是非常麻烦的,JPQL直接操作对象

使用

继承JpaRepository 接口:

public interface BannerRepository extends JpaRepository<Banner,Long> {

    Banner findOneById(Long id);


    Banner findOneByName(String name);
}

Theme 和 Spu 是多对多关系:

// 关系维护端   @JoinTable 设置关联表的信息
  @ManyToMany
    @JoinTable(name = "theme_spu",joinColumns =@JoinColumn(name = "theme_id"),inverseJoinColumns = @JoinColumn(name = "spu_id"))
    private List<Spu> spuList;

// 设置不要物理外键,需要在关系的被维护端,,使用@ForeignKey

 @ManyToMany(mappedBy = "spuList")
    @org.hibernate.annotations.ForeignKey(name = "null")
    private List<Theme> themeList;

Banner 和 BannerItem 是 1对多:

 /**
     * mappedBy :  关系维护端 中 导航属性的名字
     */
    @OneToMany(fetch = FetchType.EAGER,mappedBy = "banner")
    @org.hibernate.annotations.ForeignKey(name = "null") // 不设置物理外键
//    @JoinColumn(name = "bannerId")
    private List<BannerItem> items;


   /**
     * 双向 1对多: @JoinColumn 打在多端,也就是关系维护端
     */
    @ManyToOne
//    @JoinColumn(name = "bannerId",insertable = false,updatable = false,foreignKey = @ForeignKey(value = ConstraintMode.NO_CONSTRAINT))
    @JoinColumn(name = "bannerId",insertable = false,updatable = false)
    private Banner banner;

jpa关联模型查找是惰性的,当你使用这个数据的时候,才会去给你查询关联模型的数据,,默认是懒加载 ,,可以设置@OneToMany(fetch=FetchType.EAGER)

你可能感兴趣的:(springboot,oracle,mybatis,数据库)