关于持久层的框架,Mybatis和Hibernate无疑是最重要的两个角色,Mybatis的灵活性和SQL与代码的可编写性无疑极大下降了使用者的门槛,而Hibernate封装的很是厉害。两者就像吃牛排Mybatis给你一块生肉让你本身作,你不只能够感觉到做的过程的快感还能享受高质量的牛排,而Hibernate则给你作好了,好很差吃就只有本身知道了。git
上述两者都是ORM框架,而Spring-Data-Jpa不是,它是一种规范,由于它并无对ORM进行实现,而是调用了其余ORM框架的实现,固然咱们接触到的基本就是Hibernate,这样也就避免了,为了使用Spring-data-jpa须要再学一门框架。spring为了实现天下归一也是蛮拼的。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提供了丰富的接口实现,简单的分页、查询不须要咱们去关心如何实现,咱们要作的只是创建一个接口而后去继承它,就能够了。code
public interface HouseDao extends CrudRepository<House, String> {}
这样咱们的增删改查就写好了。如今我想查询rent_house表中全部的数据只须要在使用的地方注入HouseDao,而后点出来相关的方法就好了,关于方法的使用就再也不啰嗦了,看名称就能看懂。server
@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对象中。接口
如今咱们有一个很是牛逼的House类,他不只和User有关系还和Badge有关系,当咱们查询的时候全部的关系都成如今咱们面前。如今问题就来了在我查询House的时候不想携带咱们业主信息这个怎么办呢?固然不用着急,spring-data-jpa已经为咱们考虑好了......好了上班了,下次更。get