1

背景

关于持久层的框架,Mybatis和Hibernate无疑是最重要的两个角色,Mybatis的灵活性和SQL与代码的可编写性无疑极大降低了使用者的门槛,而Hibernate封装的非常厉害。二者就像吃牛排Mybatis给你一块生肉让你自己做,你不仅可以感受到作的过程的快感还能享受高质量的牛排,而Hibernate则给你做好了,好不好吃就只有自己知道了。

关于Spring-Data-Jpa

上述二者都是ORM框架,而Spring-Data-Jpa不是,它是一种规范,因为它并没有对ORM进行实现,而是调用了其他ORM框架的实现,当然我们接触到的基本就是Hibernate,这样也就避免了,为了使用Spring-data-jpa需要再学一门框架。spring为了实现天下归一也是蛮拼的。

使用过程

关于spring-data-jpa的使用,笔者也是简单的从它的映射规则和CRUD来看的,没有深究,所以仅适合初次接触spring-data-jpa的新手,大神看到这请点右上角。基本的配置不再赘述,有兴趣的同学可以移gitee

一、对象实体的建立、一对多的建立、多对多的建立

现实世界无非三种关系1-1,,1-n,n-n,一对一关系很简单,在传统关系型数据库中就是一张表,比如说叫house表其中包括了房子的各种属性,现在不考虑外键等乱七八糟的,我只想把表查询成对象该怎么做呢?
首先建立实体;

@Entity//标注为一个实体
@Table(name = "rent_house")//设置表名,让spring-data-jpa知道我该去找那个表
public class House{//一些属性...}

然后创建可以对实体操作的接口,spring-data-jpa提供了丰富的接口实现,简单的分页、查询不需要我们去关心如何实现,我们要做的只是建立一个接口然后去继承它,就可以了。

public interface HouseDao extends CrudRepository<House, String> {}

这样我们的增删改查就写好了。现在我想查询rent_house表中所有的数据只需要在使用的地方注入HouseDao,然后点出来相关的方法就行了,关于方法的使用就不再啰嗦了,看名称就能看懂。

@Autowired
    private HouseDao houseDao;

接下来需求变了,我的房屋类里面多了一个业主,他是一个对象,首先我需要和建立房屋类一样建立一个User类,再然后呢?这里就是典型的一对多关系了,在我们希望查询的语句中不仅包含House的属性字段而且还包含User的属性字段,我们希望让他鱼找鱼、虾找虾。那么我们找出来House类给他添加个属性

    @ManyToOne//这里意思就是把很多的属性怼到一个对象里
    @JoinColumn(name = "contact", referencedColumnName = "id")
    private User contact;//业主

然后再次查询就会发现每个house对象下的user对象也填充了属性。
接下来,需求又变了,我想记录下来我的房子里的所有家具,这样查询一个房子我就能知道这个房子里面有啥了;我们先来考虑一个这样的问题,一个房子可以有很多个家具比如电冰箱、电视机,而对于电冰箱来说可能很多房子都有电冰箱,这就引申出了现实世界中的多对多的关系,在传统关系型数据库中我们通常用中间表来维护多对多关系,这样对两者都好,我们的代码中需要体现的是联系了哪两张表,用什么联系的。

    @ManyToMany//多对多的关系
    @JoinTable(name = "house_badge", joinColumns = @JoinColumn(name = "house_id", table = "rent_house", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "badge_id", referencedColumnName = "id", table = "sys_badge"))
    private List<Badge> badges;// 标签

解释下这段代码,代码是在house类中的因为我现在要查询的就是house,house_badge是中间表,rent_house是house表,sys_badge是标签表关联全部用id(前提要有个sys_badge对应的实体)。运行代码我们就会发现所有的需要的属性已经全部塞到了house对象中。

spring-data-jpa的懒加载

现在我们有一个非常牛逼的House类,他不仅和User有关系还和Badge有关系,当我们查询的时候所有的关系都成现在我们面前。现在问题就来了在我查询House的时候不想携带我们业主信息这个怎么办呢?当然不用着急,spring-data-jpa已经为我们考虑好了......好了上班了,下次更。


贺作伟
17 声望0 粉丝

引用和评论

0 条评论