面向小白的SpringBoot的JPA讲解

284 阅读2分钟

这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战

面向小白系列无人看,但是我写的很开心,因为我觉得我在做有价值的事情。 我们今天来聊聊SpringData的jpa。

JPA

我们今天来聊聊SpringData的jpa。中文名就是java的持久层API,对应数学里面的映射,映射对象是谁呢?就是数据。

为啥映射呢?就是数据库和jAVA这两大哥定规矩的时候,不是一个人定的,这就导致我们需要搞个协议给这两大哥搞明白了。

我们知道java有如下特性:

  1. 面向对象:接口、类啊,抽象层次高
  2. 还有继承特性:这不少让你写代码吗?
  3. 算数:a==b?等于就放行,不等于就堵着
  4. 引用:你牛逼,啥都行,那我就把你买过来就好了。
  5. 访问层级:A包含B,B包含C,你想和C牵手?先问问A和B。

数据库没有那么复杂: 库:最外层就是库。 表:字段是小弟弟,库是我大哥,库里都是好兄弟,但彼此不认识。 字段:每个数据我都给它命名,除非不是俺这个列的。 访问:直接拿Sql,你想要谁就要谁。

JPA示例

这里我使用hibernate给大家做个演示: 首先呢,我们搞一个实体,一个简单的Coffee,咖啡有名字和价格,🆗我们来定义下,就像这样:

@Id
@GeneratedValue
private Long id;
private String name;
@Type(type = "org.jadira.usertype.moneyandcurrency.joda.PersistentMoneyMinorAmount",
        parameters = {@org.hibernate.annotations.Parameter(name = "currencyCode", value = "CNY")})
private Money price;

这里映射了一个jodaMoney,处理金额的时候我们要格外的小心,一般是入库我们乘100,出库除100。

例如这样: image.png

可以看到这里我们通过这个PersistentMoneyMinorAmount把我们数据库的价格映射成bigint,当然映射成decimal也是可以的。一般我们是折合成人民币用分来存储。结果如下: image.png

这里可以看到有一个序列,其实我们也是可以定义我们的主键的,比如自增。

strategy = GenerationType.IDENTITY

image.png

当然还有其它三种可以选择,比如序列化,但底层数据库必须支持序列化。

接下来我们来看下枚举的映射,这里我们可以先定义个枚举,比如 我们的枚举类

public enum OrderStateDemo {
    Doing, Done, Todo, Todone
}

然后映射对象。

@Column(nullable = false)
@Enumerated
private OrderStateDemo demo;

image.png

这里可以看出,它把我们的demo,都映射成integer类型存储。