關於持久層的框架,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