这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战
面向小白系列无人看,但是我写的很开心,因为我觉得我在做有价值的事情。 我们今天来聊聊SpringData的jpa。
JPA
我们今天来聊聊SpringData的jpa。中文名就是java的持久层API,对应数学里面的映射,映射对象是谁呢?就是数据。
为啥映射呢?就是数据库和jAVA这两大哥定规矩的时候,不是一个人定的,这就导致我们需要搞个协议给这两大哥搞明白了。
我们知道java有如下特性:
- 面向对象:接口、类啊,抽象层次高
- 还有继承特性:这不少让你写代码吗?
- 算数:a==b?等于就放行,不等于就堵着
- 引用:你牛逼,啥都行,那我就把你买过来就好了。
- 访问层级: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。
例如这样:
可以看到这里我们通过这个PersistentMoneyMinorAmount把我们数据库的价格映射成bigint,当然映射成decimal也是可以的。一般我们是折合成人民币用分来存储。结果如下:
这里可以看到有一个序列,其实我们也是可以定义我们的主键的,比如自增。
strategy = GenerationType.IDENTITY
当然还有其它三种可以选择,比如序列化,但底层数据库必须支持序列化。
接下来我们来看下枚举的映射,这里我们可以先定义个枚举,比如 我们的枚举类
public enum OrderStateDemo {
Doing, Done, Todo, Todone
}
然后映射对象。
@Column(nullable = false)
@Enumerated
private OrderStateDemo demo;
这里可以看出,它把我们的demo,都映射成integer类型存储。