这篇文章分享记录一下,运行超市订单管理系统的 SSM 项目遇到的问题和相关配置,以及 JDBC
连接数据库遇到的问题和解决方法。文章内容包括,运行 SSM
项目,弄好相关配置,解决项目运行出现的问题,以及解决方法和知识点补充。
首先在 idea
中打开项目,第一次导入项目,需要安装和下载相关的配置,如下图的项目的部分目录结构。我们可以看到 cn.smbms
目录下的五个层级,分别表示为:
Service
层处理业务逻辑,并将结果返回给视图(UI 层)或直接响应给客户端。Java
对象,通常用于描述业务模型或数据库映射对象。不带有业务逻辑或特殊行为。DAO
层进行数据访问、组装数据等。Web
页面、移动应用等。这些术语在 SSM
(Spring + Spring MVC + MyBatis)项目中都非常常见,每个层次之间都有着不同的关系和职责。例如,Controller 层负责接收用户请求并调用 Service
层处理业务逻辑,DAO
层负责访问数据库并提供数据操作的方法,而 Service
层则负责协调 DAO
层和 Controller 层之间的数据传输和处理。
然后找到项目结构,配置相关的模块、构建和 Facet。我这里的配置基本上是默认配置好的(导入项目时自动配置好的)。
然后是配置 tomcat (重中之重),注意看图片中的版本,是项目启动时默认的,但是出现了报错,因为我的电脑没下载这个版本的 tomcat
,因此要手动选择找到自己电脑中的 tomcat jar
包。
完整配置如下。注意 URL 的配置,因为这个项目首页是 index.html
,所以配置了这个 URL 地址,方便跑完服务后默认加载这个页面。然后默认的 HTTP
端口号是 8080 ,JMX
端口为 1099 。
接下来我们来启动一下服务,点击下图的绿色箭头启动。
服务启动成功 (Successfully completed request),没有报错,页面也跑出来了。
然后测试一下功能,看下是否能正常运行,不出意外的话肯定出意外了。这里分别点了下订单管理、供应商管理、用户管理这个三个功能,都出现了 500
报错,然后我一眼看到 JDBC Connection
这两个词,我就知道问题出在哪了,接下来我们解决一下这个问题。
上面也提及到了项目出现的报错,然后报错定位到了 JDBC
连接数据库出现了问题,除了 JDBC Connection
这两个词很清楚的显示了报错的定位,我们浅浅看下其他报错内容,也可以很清晰的知道哪出了问题,接下来我们来逐步解决。
这是一个 SSM
项目中的异常信息,其中嵌套了多个异常。可以从堆栈信息中分析出以下几点:
NestedServletException
,表示 Servlet
处理请求时发生了异常。Request processing failed
,即请求处理失败。org.mybatis.spring.MyBatisSystemException
,即 MyBatis
运行时发生了异常。org.apache.ibatis.exceptions.PersistenceException
,表示 MyBatis
操作数据库时发生了异常。Failed to obtain JDBC Connection
,表示获取数据库连接失败。综合来看,这个异常可能是由于应用程序无法连接到数据库服务器导致的。应检查以下几个方面:
第一次跑出来时,因为没有数据库,出现这个报错也无可奈何。之后搞到了数据库,然后用 Navicat
启动 MySQL
服务,然后在确保数据库地址、端口号、用户名、密码都正确的情况下还出现了报错。
然后我就认为是 JDBC
版本和 MySQL
版本的问题,其实项目跑出来的页面一股子复古的味道,所以我断定这个是一个老项目了。
然后我们到 WEB-INF => lib
文件下看看驱动是什么版本的,意料之中,这个包版本很低,而且我的数据库的版本是 8。这也是出现报错的主要原因。
然后我们把驱动也换成 8 的版本。
然后 JDBC
的语法也要修改,把 com.mysql.jdbc.Driver
改成 com.mysql.cj.jdbc.Driver
,然后还要指定时区 serverTimezone
。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/smbmsdb?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false">
property>
<property name="username" value="root">property>
<property name="password" value="123456" />
<property name="defaultAutoCommit" value="false" />
bean>
最后,重新启动服务,运行项目。我们可以发现订单管理页面没有出现报错了。到此 JDBC
连接数据库遇到的问题已解决。
前身和版本
com.mysql.jdbc.Driver
是旧版的 MySQL
驱动程序,已经过时,不再提供更新。它是从 MySQL Connector/J 5.1
版本开始使用的,到 MySQL Connector/J 5.1.49
版本停止更新。
com.mysql.cj.jdbc.Driver
是新版的 MySQL
驱动程序,当前稳定版本为 8.x,推荐使用此版本的驱动程序。它是从 MySQL Connector/J 5.1
版本开始引入的一个分支,最初是为了添加 Java 7 和 8 的功能而创建的,后来又添加了其他功能。
时间处理
在 com.mysql.jdbc.Driver
中,时间处理是基于服务器时区的。这意味着,在使用 com.mysql.jdbc.Driver
时,所有的时间戳都以服务器时区为基准。
但是,在 com.mysql.cj.jdbc.Driver
中,时间处理是基于连接时区的。这样可以更好地控制时间戳的处理方式,因为时间戳取决于应用程序的连接时区。
加载方式
在 com.mysql.jdbc.Driver
中,驱动程序将被自动加载和注册,无需显式加载或注册驱动程序。
而在 com.mysql.cj.jdbc.Driver
中,您需要显式地加载和注册驱动程序。通常在应用程序的初始化中注册驱动程序,即可使用这个驱动程序。
安全性
com.mysql.jdbc.Driver
存在一些安全性问题,因此不建议在生产环境中使用它。而 com.mysql.cj.jdbc.Driver
较为安全,推荐在生产环境中使用。连接属性
com.mysql.jdbc.Driver
和 com.mysql.cj.jdbc.Driver
都支持连接属性,但在两个驱动程序中,这些属性的名称和默认值是不同的。
com.mysql.jdbc.Driver
中的连接属性名称通常以 “jdbc” 的前缀开始,例如 “jdbcCompliantTruncation”,默认情况下为 “false”。
而 com.mysql.cj.jdbc.Driver
中的连接属性名称通常以 “mysql” 的前缀开始,例如 “allowPublicKeyRetrieval”,默认情况下为 “false”。
数据库的支持程度
com.mysql.jdbc.Driver
对于一些在新版 MySQL
中引入的功能和特性可能不支持。而 com.mysql.cj.jdbc.Driver
则对这些新特性进行了改进和扩展,如支持 JSON
数据类型、支持 OpenSSL
和 SHA256_PASSWORD
加密方式等。因此,在使用 MySQL
的新特性时,建议使用 com.mysql.cj.jdbc.Driver
,总之,com.mysql.cj.jdbc.Driver
更为全面、更加安全且功能更强大,建议优先使用它来连接 MySQL 数据库。
这就是文章的全部内容了,成功运行超市订单管理系统的 SSM
项目,以及 解决了 JDBC
连接数据库出现的问题。文章全部内容包括,运行 SSM
项目,弄好相关配置,解决项目运行出现的问题,以及解决方法和知识点补充,关于 com.mysql.jdbc.Driver
和 com.mysql.cj.jdbc.Driver
的区别。