本篇文章主要内容如下:
- 概述
- 数据库建模
- 搭建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文件有关,已经项目的名称和目录结构,这里我修改如下:
开发网站所需要的基础包:
连接数据库和实现数据层所需要的包:
返回顶部,点击图中的Generate Project alt即可下载项目文件
将下载的压缩文件解压,导入进IDE,我这里使用的IDE是IDEA(推荐使用),这事一款很好用的集成开发环境。我使用IDEA导入项目后,如图所示,一开始没有出现文件目录是因为需要通过pom.xml文件下载相应的jar包,等待一段时间即可
利用JPA实现网站数据层
这里我采用的是JPA来实现数据库。有兴趣的同学也可以使用其它的框架比如mybatis。对于JPA的使用教学视频可以去看2小时学会spring boot和轻松玩转spring data者两个教程。首先,在JPA中,实体是映射到一个类的,我们俗称模板类。实体名称对应着类名,实体属性,对应类的属性。所以我们有四个实体,就需要四个类与之对于,分别为学生类、成绩类、教务处管理员类、教师类。这里就以学生类为例,其它的和这个代码差不多。
package com.SorceManagement.SM.model;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity //告诉JPA这事一个与数据库中表映射的实体类
public class Student {
@Id//使被注解的属性成为主键
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.每一个模板类都必须要有主键,并且作为主键的属性需要使用@Id来注解。
在模板类写好之后,接下来需要实现的是实体之间的关系,我不主张使用JPA来实现所有的实体关系,因为当实体之间关系复杂之后,使用@OneToOne、@OneToMany、@ManyToOne、@ManyToMany这几个注解来实现实体间关系会使得模板类变得复杂,而且在使用JPA的一些操作接口时,也会有问题。对于实体间的关系实现,我认为将其放在数据库里实现就好(外键)。
在实体和实体关系都写好后,接下来需要做的就是要实现对模板类的操作,比如最基本的数据的增删改查。JPA为我们提供了丰富的操作接口,其中JpaRepository是最常用的一个接口,我们只需要继承这些接口,即可完成最基本的操作。这里我以student类的操作接口为例,代码如下:
package com.SorceManagement.SM.Repository;
import com.SorceManagement.SM.model.Student;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* Created by dell on 2017/8/3.
*/
public interface studentRepository extends JpaRepository<Student,String> {
}
这样一个实体类的操作接口就基本写好了。更多详细的写法和操作接口的使用我将在后面的帖子中介绍。这里需要注意的是:
每一个模板类的操作接口必须要继承一个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上获得,下一篇手记将将一下如何使用数据从的操作接口来实现业务层。
热门评论
写的不错,期待后续的内容。
你的controller层呢
这个还没写完后面还会继续添加,主要是将网站应用的数据层搭建起来。。。。。。。。。