zoukankan      html  css  js  c++  java
  • spring 实战 (3)—— JPA

    第一步:

    在pom文件中导入JPA的相关依赖 
    
    • 1
    	<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-data-jpa</artifactId>
    	</dependency>
    
    • 1
    • 2
    • 3
    • 4
    并配置数据库连接
    
    • 1
    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/crm?characterEncoding=utf-8&serverTimezone=UTC
        username: root
        password: root
        type: com.alibaba.druid.pool.DruidDataSource
    
      jpa:
        hibernate:
          ddl-auto: update
        show-sql: true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    第二步

    创建实体对象(实体对象对应数据库表)
    
    • 1
    package com.spring.entity;
    
    import javax.persistence.*;
    
    @Entity //说明这个是一个实体类
    @Table(name = "t_order") //设置该实体在数据库中的表名称
    public class Order {
    
        @Id //必须设置主键id说明该字段是id 如果不存在则创建报错
        @GeneratedValue(strategy = GenerationType.AUTO) //设置主键属性
        @Column(name = "oid")
        private Integer oid;
    
        @Column(name = "orderName")
        private String orderName;
    
        @Column(name = "number")
        private Integer number;
    
        @Column(name = "address")
        private String address;
    
        public Integer getOid() {
            return oid;
        }
    
        public void setOid(Integer oid) {
            this.oid = oid;
        }
    
        public String getOrderName() {
            return orderName;
        }
    
        public void setOrderName(String orderName) {
            this.orderName = orderName;
        }
    
        public Integer getNumber() {
            return number;
        }
    
        public void setNumber(Integer number) {
            this.number = number;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    @Entity 说明这个是一个实体类

    @Table(name = “t_order”) 设置该实体在数据库中的表名称

    @Id 必须设置主键id说明该字段是id 如果不存在则创建报错

    @GeneratedValue注解,在JPA中,@GeneratedValue注解存在的意义主要就是为一个实体生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键),@GeneratedValue提供了主键的生成策略。@GeneratedValue注解有两个属性,分别是strategy和generator,其中generator属性的值是一个字符串,默认为"",其声明了主键生成器的名称(对应于同名的主键生成器@SequenceGenerator和@TableGenerator)。
    具体的注解介绍@GeneratedValue注解详解

    @Column(name = “oid”) 设置数据库中表对应的字段名

    列举 创建 一对多 多对多 多对一 一对一的注解使用

    • ManyToOne(多对一) ManyToOne(多对一)单向:不产生中间表,但可以用@Joincolumn(name=" ")来指定生成外键的名字,外键在多的一方表中产生!
    • OneToMany(一对多) OneToMany(一对多)单向:会产生中间表,此时可以用@onetoMany @Joincolumn(name=" ")避免产生中间表,并且指定了外键的名字(别看 @joincolumn在一中写着,但它存在在多的那个表中)
    • OneToMany ,ManyToOne OneToMany ,ManyToOne 双向(两个注解一起用的):如果不在@OneToMany中加mappedy属性就会产生中间表,此时通常在@ManyToOne的注 解下再添上注解@Joincolumn(name=" ")来指定外键的名字(说明:多的一方为关系维护端,关系维护端负责外键记录的更新,关系被维护端没有权利更新 外键记录)!(@OneToMany(mappedBy=“一对多中,多中一的属性”)出现mapby为被维护端|||默认为延迟加载)
      用例:
    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="child_id")
    private OrderChild orderChild;
      @OneToMany(mappedBy="orderChild",fetch=FetchType.LAZY,cascade={CascadeType.MERGE})
      @NotFound(action=NotFoundAction.IGNORE) //代表可以为空,允许为null
      private List<OrderChildGoods> goodsList;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    @ManyToOne默认是立即加载,@OneToMany默认是懒加载
    但是如果加上了@NotFound之后设置的fetch=FetchType.LAZY是不起作用的,也就是设置@NotFound后变为了立即加载eager

    cascade:级联操作权限

    CascadeType.PERSIST:级联持久化,也就是级联保存。比如一个学生有很多门成绩,保存学生了,那么也就会级联保存各门成绩信息

    CascadeType.REMOVE:级联删除,删除学生了,那么学生的成绩也从数据库中删除

    CascadeType.MERGE:级联合并,修改学生成绩信息了,那么修改的成绩信息会保存到数据库中,和上面persist的区别类似于put和post的区别

    CascadeType.DETACH:级联游离,要想删除某一条学生信息,但学生的id在成绩表中作为外键,无法直接删除

    CascadeType.REFRESH:级联刷新

    CascadeType.ALL:上面所有的结合,慎用

    fetch:设置关联对象的加载方式

    FetchType.EAGER:立即加载,比如在加载学生对象信息时,立刻加载学生的成绩信息

    FetchType.LAZy:延迟加载,需要用到的时候再加载

    第三步

    在springboot的启动类上添加@EnableJpaRepositories注解 这是必须要添加的

    参考文本
    学习视频资料:http://www.makeru.com.cn/live/1392_1164.html?s=143793

  • 相关阅读:
    关于 NSTimer 和 NSRunLoop 的一些理解
    通过 CocoaPods 集成 WeexSDK 到iOS项目中
    iOS 从相册取出的图片默认 取中间部分 裁剪成方形的
    Trilynn分享了炼数成金邀请码
    highcharts分段显示不同颜色
    H5手机开发锁定表头和首列(惯性滚动)解决方案
    为移动端开发提供纯前端的路由方案
    ionic系列
    2014总结
    margin 相关 bug 系列
  • 原文地址:https://www.cnblogs.com/jinwenyi/p/13954458.html
Copyright © 2011-2022 走看看