我的Java Web之路48 - 数据库应用的开发步骤
yuyutoo 2024-11-07 14:17 6 浏览 0 评论
本系列文章旨在记录和总结自己在Java Web开发之路上的知识点、经验、问题和思考,希望能帮助更多(Java)码农和想成为(Java)码农的人。
目录
- 介绍
- 数据库选型
- 租房网的数据库选型
- 数据库设计
- 租房网的数据库设计
- 编写访问数据库的代码
介绍
我们的租房网应用目前使用Spring MVC和Spring IoC,已经将展示层、模型层和控制器层进行了初步的分离(参考这篇文章)。
但是模型层使用的仍然是模拟数据,实际生产环境(就是部署到真正供用户访问的服务器,一般还有开发环境和测试环境)中肯定是使用真实数据,所以必须将一切数据都存储到数据库中(这里的数据库就是泛指可以永久保存数据的系统,比如文件系统、关系数据库、NoSQL数据库等,可以参考这篇文章)。
在Java中,主要使用JDBC(Java DataBase Connectivity,即Java数据库连接)来访问各种数据库,主要是关系数据库。
我们就使用JDBC来进一步解决租房网的数据持久化问题。不过,数据持久化问题不仅仅涉及持久化本身,还涉及数据持久化之后如何访问的问题。我将采用比较符合人的思维习惯的步骤来介绍这个过程。
下面的内容都是笔者自己的思考,不一定就正确或者适用,仅供读者朋友参考,也欢迎读者朋友批评指正。
数据库选型
首先,我们第一个想到的问题就是我们的数据要存在什么地方?
你可能会说,当然是硬盘上啊。这样回答也没有错,硬盘的确是当下主要的存储介质,不管是机械硬盘、固态硬盘、磁盘阵列。
然而,我们如果要直接编程操作存储介质那就太费劲了,于是人们发明了文件系统(也可以说是一种数据库管理系统)、数据库管理系统(可能是基于文件系统的),它们都提供相应的编程接口(即API),这样就能减轻数据库应用的编程负担。
但是,就目前来说,数据库分很多种,文件系统、关系数据库、NoSQL数据库等等,而每一种类又有很多具体的数据库产品,比如关系数据库就有Oracle、MySQL等等。我们到底要选择哪一种的哪一款产品呢?
嗯,这就是数据库选型的问题。它取决于下面的几个因素:
- 数据本身的特点,比如数据从哪产生的、产生的频率多大、产生的数据是什么内容,比如数字、文本、图片、视频、音频、地理位置等;有的数据可以描述一个个现实的实体对象,有的数据描述的是实体对象的行为或者实体对象之间的关系;有的数据可以形成流,有的数据可以形成树、图等结构。结构化、半结构化、非结构化这三个概念也是描述数据本身的特点的。事实上,结构化数据基本上可以等同于关系数据,即可以提炼出表及其各个列(即实体及其各个属性)。
- 人们使用数据的特点,是一次写入数据后以后只读不再更新,还是需要不断更新该数据,新增数据的频率是多大,更新数据的频率是多大,每次读取、新增、更新的数据量是多少,数据的读写分布在某个局部范围还是均匀分布,是单条处理居多还是批量处理居多,访问聚合数据居多还是独立数据居多,是每个数据操作独立还是往往多个数据操作是一个整体,是同一个数据多个用户需要访问还是基本上一个数据就一个用户访问等等。
- 数据库产品本身的许可类型(License)、价格、特性、性能、稳定性、部署是否容易、扩容成本、运维成本等。
租房网应用的数据库选型
目前租房网应用的数据主要有两个,一个是用户数据,一个是房源数据。用户数据主要是通过用户注册添加的,但目前租房网应用并没有这个功能。房源数据也是用户发布而添加的,租房网应用同样还没有这个功能。
很明显,用户和房源很容易映射到现实中的实体,一个用户具有用户名和密码等属性,一个房源具有位置、房主、其他具体情况等静态信息(事实上,这些应该算是房产的属性,房产只有在需要出租出去的时候才成为房源,房源应该是房产的其中某种状态,但我们先不用搞这么复杂,就先这么统一对待吧),以及发布时间、发布者等动态/行为信息。
它们都是用户通过浏览器添加到我们的数据库中的,数据量应该也不会太大。后续的数据访问也主要是以读操作为主,短时间内访问量也不会太大。当然这个跟你对应用的定位有关,你如果希望应用迅速火爆起来,必然要实施各种营销和推广措施,这样的话短时间内数据量和访问量可能快速增长。
既然如此,我们完全可以采用关系数据库来解决数据的持久化问题。事实上,大多数Web应用都可以采用关系数据库,或者至少先拿关系数据库来尝试一下,那些所谓的大数据只存在于少数巨头互联网公司。
另外,开发环境和测试环境、生产环境的数据库应该不一样。在开发环境,我们最好选择不需要单独部署数据库服务器的数据库产品,否则,开发受限太多,既要部署数据库服务器,还受网络情况等影响,单元测试也不容易做。
测试环境和生产环境的数据库应该选择同款数据库才对。
所以,在租房网应用的开发环境中,我选择的是H2Database(可以参考这篇文章),直接在工程中添加它的一个JAR包即可。至于测试环境和生产环境,那就不作考虑了,毕竟它只是用来演示的,又不是真的要上线运营。
数据库设计
选定好了数据库,我们需要根据该数据库产品进行设计。
简单来说,对于关系数据库,我们就是要设计数据库中存在哪些表,每张表的各个列是什么,每个列的数据类型和约束是什么,是否要建立索引等等。
但事实上,要想进行数据库设计,一般先要对我们的业务、数据进行分析,实际上也属于需求分析的范畴。分析的方法也有很多,大家可以自行查阅相关资料。
当然,关系数据库的设计形成了比较系统的理论,什么关系模型、关系代数、关系演算、三范式、完整性约束等等,这里就不再赘述了。
当然,数据库设计可以采用文档工具记录下来,也可以采用所选定的数据库管理系统直接设计,也可以采用专业的第三方产品比如PowerDesigner等。
而设计也会有相应的方法论、理论、原则、规范等,这个也需要经过学习、实践、思考、总结等成长四步而沉淀到个人的,这里也不再赘述了。
一句话,方法论和工具都很重要。
租房网的数据库设计
至于我们的租房网,我们就继续采用简单、够用为原则,目前涉及到的数据就是用户数据和房源数据,那就设计用户表和房源表。
用户表设计三个列,一列是用户ID,一旦生成就不再变;一列是用户名;一列是密码。三个列都是字符串类型,但长度可以限制在某个固定长度,表的主键就是用户ID。实际上密码不能明文存储到数据库中,而是需要加密存储。
房源表也设计三个列吧,分别是房源ID、房源名称、房源详情,也都是字符串类型,但房源详情可以采用变长字符串,长度可以大一些,200、500都可以,但也不可过大,表的主键是房源ID。
这都是粗略的设计,仅用作演示我们开发基于数据库的应用是需要这么一步的,并不符合现实的需求,如果有需要,后面可以改进以符合现实的需求。
在测试环境和生产环境中,往往需要由数据库管理员(即DBA)来建立数据库、数据表,分配相应的权限,包括数据库用户名和密码,甚至是部署独立的数据库服务器。
在开发环境中,一般是采用嵌入式的数据库,建库、建表、添加测试数据等都是自己执行SQL脚本或编程来实现。
编写访问数据库的代码
这一步往往依赖于某个库。
在Java中,JDBC是最常用的数据库访问API,而它仅仅是个接口规范,实际上还需要具体某个支持JDBC的数据库产品提供的驱动包,它本质上就包含JDBC各个接口的实现类。
还记得这篇文章中提到的接口的作用和使用模式吗?
JDBC基本上也是遵从这种方式,上面的某个接口可以替换成JDBC中的某个接口,底下的实现类就是各个数据库厂商提供的驱动里面相应于该接口的某个实现类,上面使用该接口的外部程序就是我们的Web应用程序了,它仅仅使用JDBC接口而已,但实际运行时需要配置一个具体的数据库驱动(即JDBC的实现),这其实就是数据库驱动加载,后面再详细介绍。
当然,直接使用JDBC可能比较复杂,于是很多第三方厂商又将JDBC进行了封装,比如Spring就提供了JDBCTemplate来简化JDBC的操作,还有很多ORM(Object Relational Mapping,简称ORM,对象关系映射)框架也提供了某个方面的封装,这些以后再详细介绍。
下篇文章我们就初步使用JDBC来实现租房网应用的数据持久化吧。
相关推荐
- 全局和隐式 using 指令详解(全局命令)
-
1.什么是全局和隐式using?在.NET6及更高版本中,Microsoft引入了...
- 请停止微服务,做好单体的模块化才是王道:Spring Modulith介绍
-
1、介绍模块化单体是一种架构风格,代码是根据模块的概念构成的。对于许多组织而言,模块化单体可能是一个很好的选择。它有助于保持一定程度的独立性,这有助于我们在需要的时候轻松过渡到微服务架构。Spri...
- ASP.NET程序集引用之痛:版本冲突、依赖地狱等解析与实战
-
我是一位多年后端经验的工程师,其中前几年用ASP.NET...
- .NET AOT 详解(.net 6 aot)
-
简介AOT(Ahead-Of-TimeCompilation)是一种将代码直接编译为机器码的技术,与传统的...
- 一款基于Yii2开发的免费商城系统(一款基于yii2开发的免费商城系统是什么)
-
哈喽,我是老鱼,一名致力于在技术道路上的终身学习者、实践者、分享者!...
- asar归档解包(游戏arc文件解包)
-
要学习Electron逆向,首先要有一个Electron开发的程序的发布的包,这里就以其官方的electron-quick-start作为例子来进行一下逆向的过程。...
- 在PyCharm 中免费集成Amazon CodeWhisperer
-
CodeWhisperer是Amazon发布的一款免费的AI编程辅助小工具,可在你的集成开发环境(IDE)中生成实时单行或全函数代码建议,帮助你快速构建软件。简单来说,AmazonCodeWhi...
- 2014年最优秀JavaScript编辑器大盘点
-
1.WebstormWebStorm是一种轻量级的、功能强大的IDE,为Node.js复杂的客户端开发和服务器端开发提供完美的解决方案。WebStorm的智能代码编辑器支持JavaScript,...
- 基于springboot、tio、oauth2.0前端vuede 超轻量级聊天软件分享
-
项目简介:基于JS的超轻量级聊天软件。前端:vue、iview、electron实现的PC桌面版聊天程序,主要适用于私有云项目内部聊天,企业内部管理通讯等功能,主要通讯协议websocket。支持...
- JetBrains Toolbox推出全新产品订阅授权模式
-
捷克知名软件开发公司JetBrains最为人所熟知的产品是Java编程语言开发撰写时所用的集成开发环境IntelliJIDEA,相信很多开发者都有所了解。而近期自2015年11月2日起,JetBr...
- idea最新激活jetbrains-agent.jar包,亲测有效
-
这里分享一个2019.3.3版本的jetbrains-agent.jar,亲测有效,在网上找了很多都不能使用,终于找到一个可以使用的了,这里分享一下具体激活步骤,此方法适用于Jebrains家所有产品...
- CountDownTimer的理解(countdowntomars)
-
CountDownTimer是android开发常用的计时类,按照注释中的说明使用方法如下:kotlin:object:CountDownTimer(30000,1000){...
- 反射为什么性能会很慢?(反射时为什么会越来越长)
-
1.背景前段时间维护一个5、6年前的项目,项目总是在某些功能使用上不尽人意,性能上总是差一些,仔细过了一下代码发现使用了不少封装好的工具类,工具类里面用了好多的反射,反射会影响到执行效率吗?盲猜了一...
- btrace 开源!基于 Systrace 高性能 Trace 工具
-
介绍btrace(又名RheaTrace)是抖音基础技术团队自研的一款高性能AndroidTrace工具,它基于Systrace实现,并针对Systrace不足之处加以改进,核心改进...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- .NET 奇葩问题调试经历之3——使用了grpc通讯类库后,内存一直增长......
- 全局和隐式 using 指令详解(全局命令)
- 请停止微服务,做好单体的模块化才是王道:Spring Modulith介绍
- ASP.NET程序集引用之痛:版本冲突、依赖地狱等解析与实战
- .NET AOT 详解(.net 6 aot)
- 一款基于Yii2开发的免费商城系统(一款基于yii2开发的免费商城系统是什么)
- asar归档解包(游戏arc文件解包)
- 在PyCharm 中免费集成Amazon CodeWhisperer
- 2014年最优秀JavaScript编辑器大盘点
- 基于springboot、tio、oauth2.0前端vuede 超轻量级聊天软件分享
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)