疾风式全栈(13)-后端开发基础(草稿)
有了数据库,我们就有了全栈所用到的整套技术,从浏览器到数据库.那么我们就开始尝试把他们整合起来,体验一下实际的软件开发大概是些什么内容.
我们还是以简单的原则,首先实现基本功能.如果我们要在自己的电脑上测试,可能还是需要自己安装数据库软件.云数据库目前我知道免费的只有腾讯云的小程序开发环境,但是无法从公网访问,只有通过上传代码到腾讯云,在内部连接数据库.而代码环境目前只支持php和node.其中又以node的支持最完备.
而要在自己电脑上安装的话,我们一般也是选择mysql. oracle 和 sql server的安装包都很大,运行起来也不小.mysql可以直接在官网下载安装版.基本是一路下一步就可以,在网上也可以搜到很多指引.尽管我是偏好解压版,但是mysql的解压版,每次设置都会出一些问题,不想折腾的就用安装版吧.安装过程中,会为root用户设置密码.还有一个默认的端口号,没什么特殊要求可以不用改.连接用的图形化客户端也可以选择官方的workbench,虽然其他可能用的更多,不过好像都不是免费的.
假设我们建好了数据库,表和数据都添加好了.我们来以一种简单快捷的方式实现一个基本的服务器端.
使用Idea,选择新建项目,类型选择Spring Initializr, 选择添加web,data rest,data jpa和mysql支持.就生成了一个项目骨架.在配置文件中添加数据库的地址和用户名密码,再使用idea的数据库连接插件,根据数据库表生成实体类,为每一个实体类创建一个repository继承JPARepository.然后启动项目,根据提示的路径,访问接口地址,就可以看到返回的数据库中的数据了.增删改查都是可以的,只要熟悉了接口的命名规则就可以用了.
找不到接口地址的,可以添加HAL Browser支持,就可以在网页上查看所有生成的接口了.具体方法可搜索或参考官网文档.
以这样的方式,从数据库到web,基本上只需要简单的几行声明,就可以实现基本功能了.如果有更具体的需要,spring data rest也提供了相应的处理函数,把代码写在对应的处理函数里就可以了.
通过这种方式,后台接口基本上自动生成,再加上自己写的具体业务代码,以及通过过滤器实现授权访问控制.后端基本上是非常简单和清楚的.数据通过HTTP接口开放给前端,前端可以根据实际需求在前端展示和处理数据.这样给了前端极大的自由和灵活性,多数时候也给了客户更加流畅的体验.
meteor.js也是采取这样的思路,轻薄的后台,自动同步数据的传输机制.提高了开发效率和客户端的响应速度.
采用类似思想的技术还包括
美团的koa-restql,基于node和koa2.
CouchDB支持restful接口操作,不过并非关系数据库.
其他大家可以搜索或自己修改.
如果不使用idea的话,Spring Initializr也可以通过网站使用.实体类也可以手工编写或者通过其他方式生成.
当然也可以自己写调用sql和生成HTTP响应的代码.这时候我们就要明白框架自动帮我们做了哪些工作.
-
首先,Spring Initializr生成的项目框架是基于spring boot的.spring是java社区著名的框架,核心功能是依赖注入,我理解就是对大量对象的统一管理.java里的对象在spring里称为bean,spring容器中的bean是默认单例的,不用担心会占用大量多余的内存.相互调用也只需要简单的声明就可以.而spring boot对配置更加简化,一些基本的配置都自动实现了.所以我们连接数据库所需要配置的DataSource,在spring boot中,只要添加了数据库驱动的jar文件,填写了地址和用户名密码,就自动配置好了,甚至帮我们建好了连接池,非常方便.
-
spring data提供的是统一的数据访问模型,对于关系数据库和非关系数据库都提供了一致的接口.
我们这里使用的JPA是java社区提供的关系数据库映射规范.通过标准的函数,替代手工编写sql语句,实际上是自动帮我们生成了sql执行.一般使用的实现还是hibernate.不过如果我们用了spring data rest,这些我们就都不用关心了.如果我们准备自己写sql,其实这些我们也不用关心.我们可以直接用spring的JDBCTemplete.JDBC才是java真正和关系数据库交互的标准.但是直接使用JDBC需要写大量模版代码,而使用JDBCTemplete,我们只需要关系sql语句,传递的参数,和接收数据的集合就可以了. -
对于HTTP请求的处理,spring也提供了方便的封装,在处理函数上加上声明,就可以自动接收和转换传入的参数,返回的结果也可以自动格式化成HTTP响应.
这也就是在java项目中常见的三层结构,数据访问层,web层和中间的service层,处理业务逻辑的部分.
过去流行SSH,现在常用SSM,不过其实有spring足矣.MyBatis也是手工编写sql语句的,个人感觉没有解决太多问题,现在在国内的流行,感觉只是一种思维惯性,拉个框架凑数成三个而已.我们只想越简单越好.
我们重点说一下关于HTTP的请求和相应信息的类型.这关系到前后端如何发送和接收,以及在spring里如何自动转化的问题.传送数据常用的格式我们前面说过是JSON和XML.XML基于标签,类似HTML.JSON基于js.其实现在主要用的也是json.在请求和相应头部可以设置content-type: application/json.这样在前端js中,发送和接收都很方便,在spring中,由于默认配置了JSON解析器,一般也是可以自动转换格式的.返回时一般也不会有问题,接收时,如果出现问题,接收不到,就要检查发送的类型是否匹配.可以在网上搜一下,仿照别人的写.常见的一个问题是,请求经常会采用form格式(content-type是application/x-www-form-urlencoded,类似?a=1&b=2这样的格式),而这在spring里获取的格式是不一样的.所以这里一定要细致和统一.