我的Java Web之路48 - 数据库应用的开发步骤
yuyutoo 2024-11-07 14:17 4 浏览 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来实现租房网应用的数据持久化吧。
相关推荐
- URL URI傻傻分不清楚,dart告诉你该怎么用
-
简介如果我们要访问一个网站,需要知道这个网站的地址,网站的地址一般被称为URL,他的全称是UniformResourceLocator。那么什么是URI呢?...
- 你最深爱的编程语言其实很烂
-
我最近写了几篇比较严肃的博客,是关于一些沮丧的事情,结果我开始有些忧郁。很严重。所以,我想应该说些比较轻松的事情。我要做的就是数落大家最喜欢的编程语言。你会问我为什么,为什么要搞这种恶作剧?亲爱的朋友...
- 路由器交换机基础配置6——命令行显示信息设置
-
一、控制命令行显示信息设备中的部分命令执行后会出现提示、警告、执行结果等显示信息,用户可以控制这些显示信息的显示方式,以方便阅读。1、提示和警告信息提供中、英文两种语言显示。可以通过language-...
- python是一种什么类型的编程语言
-
Python(英国发音:/'paθn/美国发音:/'paθɑn/)是一种广泛使用的解释型、高级编程、通用型编程语言,由吉多·范罗苏姆创造,第一版发布于1991年。可以视之为一种改良(加入一些其他编程...
- 60年了,LISP语言的进化史是否会引发你对AI未来的新思考?
-
图:pixabay作为长期垄断AI领域的高级计算机语言程序,Lisp语言到底经过了怎样的变迁?也许,我们可能已经忘记了一些在今天仍然有用的东西,或者说,至少了解这些历史对一些新的想法产生有所影响。o2...
- Java 和 JavaScript 的关系
-
Java和JavaScript不同之处:●出身不同:Javascript与Java是由不同的公司开发的不同产品。Javascript是Netscape公司的脚本语言,而Java...
- Micro:命令行文本编辑器 (Go)
-
Micro是一款基于终端的文本编辑器,使用Go开发。Micro是个命令行编辑器,主要特性是易用,直观,并且包含所有现代化终端的优点。功能:易用常用快捷键绑定(ctrl-s,ctrl-c,...
- 7 行代码 3 分钟:从零开始实现一门编程语言
-
本文最初发布于MattMight的个人博客。...
- 码上去学海南公司:C语言到底能干什么?我列举了8种经典案例
-
虽然C语言执行速度极快,占用资源极少,但是它使用起来非常麻烦,完全没有Java、Python、Go、JavaScript、C#等方便和灵活,会严重拖慢项目的开发进度,所以,通常只有在“不得不”的情...
- 什么是 JavaScript?
-
本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!作者|慕课网精英讲师然冬...
- 新人如何自学安卓手机软件开发?
-
当我们问一个人,你是做什么的,听到我是做软件开发的,不由自主就会感觉,这个人好厉害。越来越多的人投身于软件开发行业,可能有些人本身不是学这个专业的,出于对这个行业的热爱,自学软件开发。现在这个社会,多...
- Android开发基础入门(一):UI与基础控件
-
Android基础入门前言:...
- 第02章 《小Z安卓程序员之路》Android Studio
-
不积跬步无以至千里,不积小流无以成江海!!每天进步一点点我是杨哲丶,一个梦想把科技和艺术结合在一起的程序猿!!小Z在开始查询的如何使用SVN和如何使用Git版本控制工具的时候,发现网上大部分居然是关于...
- 支付宝团队 | 移动客户端实战教程(iOS和Android)
-
今天给大家推荐一个非常好的PPT,是github在线的,是支付宝团队内部分享技术用的PPT,适合Web端和移动端的同学入门客户端开发,是我见过的最详细的《iOS&Android开发从入门到...
- 只需二步,就可以在win11操作系统上运行Android程序,非常简单
-
你想像过吗,只需几个简单的步骤即可在你的Windows电脑上运行Android应用程序。现在,在Windows11中运行安卓应用程序现在就像在手机上运行应用程序一样简单。微软和亚马逊联手打造了数千款...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
推荐7个模板代码和其他游戏源码下载的网址
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
【开源分享】2024PHP在线客服系统源码(搭建教程+终身使用)
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
- 最近发表
- 标签列表
-
- 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)