本篇文章主要內容如下:
概述
數據庫建模
搭建spring boot開發環境
-
利用JPA實現網站數據層
概述學習spring boot也有大半年了,其中也用他做過幾個小項目,現在回過頭來整理一下使用spring boot開發網站后臺的整體過程。(僅表示個人觀點,如有不合理之處,可聯系作者)
首先,一個網站基本可以分為三層,controller層(路由層)、service層(業務邏輯層)、model層(模板層)。模板層主要是與數據庫有關,service層與具體的業務邏輯有關,controller層與前端通過url訪問后臺有關。而開發一個網站應用,我們要從這個網站的需求開始分析,要明確這個網站有哪些參與者,需要具備什么功能,比如說,你開發一個簡單學生成績管理系統的網站,粗略的分析一下,這個系統的角色就有三個:學生、老師、教務處管理員。而對于不同的角色,他們的權限不一樣吧?學生可以查詢成績,老師可以修改成績、查看成績,而教務處管理員則負責學生、教師的賬號信息管理,權限管理這些。
數據庫建模
等到將初步的需求分析做完之后,應該干什么呢?這就需要涉及到數據庫建模了。因為一個網站應用,特別是管理系統的網站,它的數據庫設計是很有必要的。那么我們首先就的根據之前的需求分析,設計出一個合適的數據庫概念模型出來,我使用的數據庫建模工具是PowerDesigner版本是16,它的破解文件大家可以到百度云[PowerDesigner破解文件]里面下載。點開PowerDesigner選擇File中的new model:
在彈出的對話框中選擇順序如下圖所示:
這樣一個數據庫概念模型的模板就創建好了,點擊右邊工具欄中的圖標,然后在左邊的畫板上點擊一下就可以創建一個實體了,也就是數據庫中的數據表。在創建后需要右鍵一下,變回鼠標箭頭,不然鼠標左鍵點擊會一直創建實體
雙擊數據表,就可以編輯實體的屬性了。Nmae是實體名,Code是在代碼中的實體名
這里編輯實體的名稱,以及代碼中的名稱:
Attributes菜單下面是編輯實體的屬性,也就是數據表中的字段屬性其中P含義為是否做主鍵,M含義為字段是否為空,D(display)含義為是否在模型中顯示:
創建實體的基本操作就是上面那樣,經過需求分析,我們的實體應該,以及實體所具有的屬性如下:
創建完成實體及其屬性之后,我們應該創建實體件的關系,實體間的關系總的來說有:一對多,一對一,多對多。在右邊的工具欄我們可以看見創建關系的圖標:點擊一下它,然后點擊選中實體,拖拽到另外一個實體上,一條關系就建立成功了。
然后右鍵鼠標回復點擊狀態,雙擊關系線,在彈出的對話框中即可編輯關系屬性
其中這里的菜單欄是用來設置實體關系是一對多,多對多,一對一的:
下圖的菜單欄是編輯實體關系的基數,Mandatory表示是否最小為1
因為一個學生肯定有多個成績(各個課程),所以學生和成績實體是一對多,并且,因為成績的存在,必須要有學生存在,所以成績對學生的基數是1,1。但是學生可以沒有成績(比如缺考),所以學生對成績的基數是0,n。
最后將關系建立好之后如下圖:
如果數據庫概念模型比較復雜,可以先將web系統分為幾個子系統,再對這幾個子系統分別建模,然后將概念模型導成邏輯模型。這里因為這個系統比較簡單,所以我這里只畫到概念模型。
搭建spring boot開發環境
好了接下來,在數據庫模型設計好(數據庫的設計只要合理即可,不必和我的一樣)之后,可以開始網站數據層的編寫了。在編寫之前,我們必須要有一個spring boot的項目框架,主要有mavn和gradle兩種,基本的框架可以到spring官網產生,點擊鏈接會出現一下頁面,點擊Switch to the full version,可以展開更加詳細的配置
首先修改這三項就好,這三項是關于maven里面的pom.xml文件有關,已經項目的名稱和目錄結構,這里我修改如下:

這里項目結構就設置好了,下一步需要設置我們項目所需要的jar包,這里需要三個包,如下:
開發網站所需要的基礎包:
連接數據庫和實現數據層所需要的包:
返回頂部,點擊圖中的Generate Project alt即可下載項目文件
將下載的壓縮文件解壓,導入進IDE,我這里使用的IDE是IDEA(推薦使用),這事一款很好用的集成開發環境。我使用IDEA導入項目后,如圖所示,一開始沒有出現文件目錄是因為需要通過pom.xml文件下載相應的jar包,等待一段時間即可
利用JPA實現網站數據層
這里我采用的是JPA來實現數據庫。有興趣的同學也可以使用其它的框架比如mybatis。對于JPA的使用教學視頻可以去看[2小時學會spring boot](http://www.imooc.com/video/13599)和[輕松玩轉spring data](http://www.imooc.com/video/14551)者兩個教程。首先,在JPA中,實體是映射到一個類的,我們俗稱**模板類**。實體名稱對應著類名,實體屬性,對應類的屬性。所以我們有四個實體,就需要四個類與之對于,分別為學生類、成績類、教務處管理員類、教師類。這里就以學生類為例,其它的和這個代碼差不多。
package com.SorceManagement.SM.model;
import javax.persistence.Entity;
import javax.persistence.Id;
//告訴JPA這事一個與數據庫中表映射的實體類
public class Student {
//使被注解的屬性成為主鍵
private String studentid;
//學生ID private String studentname;
//學生姓名 //默認構造函數必須的,不然會報錯 public Student() { }
/*每一個屬性的get和set方法都必須要有,以提供JPA將數據庫中相應的值注入到實體中或者將實體對象的值存入數據庫的表中*/ public String getStudentid() { return studentid; }
public void setStudentid(String studentid) { this.studentid = studentid; }
public String getStudentname() { return studentname; }
public void setStudentname(String studentname) { this.studentname = studentname; }
}
這里注意的有三點:
1.每一個模板類都必須要有顯示的默認構造函數,它的每個屬性都需要有相應的get、set方法。
2.每一個模板類都需要通過Entity來與數據庫中的表映射。
3.每一個模板類都必須要有主鍵,并且作為主鍵的屬性需要使用來注解。
在模板類寫好之后,接下來需要實現的是實體之間的關系,我不主張使用JPA來實現所有的實體關系,因為當實體之間關系復雜之后,使用OneToOne、OneToMany、ManyToOne、ManyToMany這幾個注解來實現實體間關系會使得模板類變得復雜,而且在使用JPA的一些操作接口時,也會有問題。對于實體間的關系實現,我認為將其放在數據庫里實現就好(外鍵)。
在實體和實體關系都寫好后,接下來需要做的就是要實現對模板類的操作,比如最基本的數據的增刪改查。JPA為我們提供了豐富的操作接口,其中JpaRepository是最常用的一個接口,我們只需要繼承這些接口,即可完成最基本的操作。這里我以student類的操作接口為例,代碼如下:
這樣一個實體類的操作接口就基本寫好了。更多詳細的寫法和操作接口的使用我將在后面的帖子中介紹。這里需要注意的是:
每一個模板類的操作接口必須要繼承一個JPA的操作接口,JpaRepository<Student,String>中第一個類型參數Student是指模板類的類型,第二個類型參數String是指模板類的主鍵類型,即@Id標注的屬性的類型。
在數據層寫完之后,接下來的問題就是我們應該如何與數據庫建立連接呢?這里我們通過編寫下面的配置文件來實現:
其內容如下,我所選用的DBMS為Mysql:
#選用的數據庫驅動
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#連接數據庫的
url spring.datasource.url=jdbc:mysql:
//localhost:3306/SM?useUnicode=true&characterEncoding=utf-8
#登陸數據庫的用戶名和密碼
spring.datasource.username=root spring.datasource.password=123456
#JPA操作數據庫的策略
spring.jpa.hibernate.ddl-auto=update
這里需要注意四點:
1.每一個DBMS有不同的數據驅動和url。
2.在數據庫連接的url中,jdbc:mysql:的是程序連接驅動使用的是jdbc,連接的DBMS是MySQL,://localhost:3306/含義為連接的是本地的MySQL,并且連接端口為3306。SM表示要連接的數據庫名稱。?useUnicode=true&characterEncoding=utf-8含義為MySQL和程序之間的編碼格式為utf8。
3.在連接的DBMS中,必須要有相應的數據庫存在,比如這里連接的是一個叫SM的數據庫,那么在MySQL中必須要有一個名為SM的數據庫存在.
4.spring.jpa.hibernate.ddl-auto可以設置JPA操作數據庫的策略,有四種策略,建議大家將這四種策略都試一下,加深理解:
create
:每次加載JPA時都會刪除上一次的生成的表,然后根據你的model類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行,表生成完畢后,之前表中的數據也會被清空。
create-drop
:每次加載JPA時根據model類生成表,但是數據庫連接一但關閉,表就自動刪除。
update
:最常用,第一次加載JPA時根據model類會自動建立起表的結構,以后加載hibernate時根據model類自動更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行只會新增,表中的數據也會唄保留。
validate
:每次加載時,驗證創建數據庫表結構,只會和數據庫中的表進行比較,不會創建新表,但是會插入新值。
這篇教程中涉及到的代碼,大家可以到我的GitHub上獲得,下一篇手記將將一下如何使用數據從的操作接口來實現業務層。
1、具有1-5工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加群。
2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加群。
3、如果沒有工作經驗,但基礎非常扎實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加群。
4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加群。
5.群號 283904828 【JAVA高級開發交流】
6.阿里Java高級大牛直播講解知識點,分享知識,上面五大專題都是各位老師多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!