注:本文大部分内容来自《Spring源码深度解析(第2版)》
一、JDBC
在使用普通的 JDBC 数据库时,就会很麻烦的写不必要的代码来处理异常,打开和关闭数据库连接等。但 Spring JDBC 框架负责所有的低层细节,从开始打开连接,准备和执行 SQL 语句,处理异常,处理事务,到最后关闭连接。
1、在Java程序中
1、在Java程序中加载驱动程序。通过Class.forName(指定数据库的驱动程序)的方式来加载添加到开发环境中的驱动程序。例如加载MySQL驱动程序代码为Class.forName ("com.mysql.JDBC.Driver")。
2、创建数据连接对象。通过 DriverManager 类创建数据库连接对象 Connection。DriverManager类作用于 Java 程序和 JDBC 驱动程序之间,用于检查所加载的驱动程序是否可以建立连接,然后通过它的 getConnection 方法根据数据库的 URL 、用户名和密码,创建一个 JDBC Connection 对象。URL=协议名+IP 地址(域名)+端口+数据库名称
3、创建 Statement对象。Statement 类的主要是用于执行静态 SQL 语句并返回它所生成结果的对象。通过Connection 对象的createStatement()方法可以创建 Statement 对象。
4、调用 Statement 对象的相关方法执行相对应的 SQL 语句。通过 execuUpdate()方法来对数据更新,包括插入和删除等操作。
通过调用 Statement 对象的 executeQuery()方法进行数据的查询,而查询结果会得到 ResulSet对象, ResulSe表示执行查询数据库后返回的数据的集合, ResulSet 对象具有可以指向当前数据行的指针。通过该对象的 next() 方法,使得指针指向下一行,然后将数据以列号或者字段名取出。如果当 next()方法返回 null ,则表示下一行没有数据存在。
5、关闭数据库连接。使用完数据库或者不需要访问数据库时,通过 Connection的close()方法及时关闭数据连接。
2、在Spring中
Spring对JDBC做了大量封装,消除了冗余代码,使得开发量大大减小。
1、创建数据表结构
2、创建对应数据表的PO
(注:PO:persistent object 持久对象
- 有时也被称为Data对象,对应数据库中的entity,可以简单认为一个PO对应数据库中的一条记录。
- 在hibernate持久化框架中与insert/delet操作密切相关。
- PO中不应该包含任何对数据库的操作。)
3、创建表与实体间的映射
4、创建数据操作接口
5、创建数据操作接口实现类
6、创建Spring 配置文件
7、测试
二、MyBatis
MyBatis 是支持普通SQL 查询、存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs映射成数据库中的记录。
1、MyBatis 独立使用
1.建立PO。用于对数据库中数据的映射,使程序员更关注于对Java类的使用而不是数据库的操作。
2. 建立Mapper。数据库操作的映射文件,也就是我们常常说的DAO ,用于映射数据库的操作,可以通过配置文件指定方法对应的SQL 语句或者直接使用Java提供的注解方式进行SQL 指定。
3. 建立配置文件。MyBatis 中的配置文件主要封装在configuration中,配置文件的基本结构如图所示。
-
configuration :根元素。
-
properties : 定义配直外在化。
-
settings : 一些全局性的配直。
-
typeAliases :为一些类定义别名。
-
typeHandlers :定义类型处理,也就是定义Java 类型与数据库中的数据类型之间的转换关系。
-
objectFactory :用于指定结果集对象的实例是如何创建的。
-
plugins: MyBatis 的插件,插件可以修改MyBatis内部的运行规则。
-
environments : 环境。
-
environment : 配直MyBatis 的环境。
-
transactionManager :事务管理器。
-
dataSource : 数据源。
- mappers : 指定映射文件或映射类。
4. 建立映射文件。对应于MyBaits 全局配置中的mappers 配置属性,主要用于建立对应数据库操作接口的SQL 映射。MyBatis 会将这里设定的SQL 与对应的Java 接口相关联,以保证在MyBatis 中调用接口的时候会到数据库中执行相应的SQL 来简化开发。
5 . 建立测试类
2、Spring 整合MvBatis
由于在上面示例基础上作更改,所以, User 与UserMapper 保持不变。
1. Spring 配置文件
对比之前独立使用MyBatis 的配置文件, 我们发现,之前在environments 中设置的dataSource 被转移到了Spring 的核心配置文件中管理。而且,针对于MyBatis , 注册了org.mybatis.Spring.SqlSessionFactoryBean 类型bean ,以及用于映射接口的org.mybatis.Spring.mapper.MapperFactoryBean。
2. MyBatis 配置文件。对比独立使用MyBatis 时的配置文件,当前的配置文件除了移除environments 配置外并没有太多的变化。
3. 映射文件( 保持不变)
4. 测试。我们发现,对于MyBatis 方面的配置文件, 除了将dataSource 配置移到Spring 配置文件中管理外,并没有太多变化,而在Spring 的配置文件中又增加了用于处理MyBatis 的两个bean 。Spring 整合MyBatis 的优势主要在于使用上,我们来看看Spring 中使用MyBatis 的用法。
三、事务
Spring 声明式事务让我们从复杂的事务处理中得到解脱,使我们再也不需要去处理获得连接、关闭连接、事务提交和回滚等操作,再也不需要在与事务相关的方法中处理大量的try. .. catch . .. finally 代码。
JDBC 方式下的事务使用示例
1.创建数据表结构
2. 创建对应数据表的PO
3. 创建表与实体间的映射
4. 创建数据操作接口
5 . 创建数据操作接口实现类
6. 创建Spring 配置文件
7 . 测试
在上面的测试示例中, UserServiceImpl 类对接口UserService中的save 函数的实现最后加入了一句抛出异常的代码: throw new RuntimeExceμtion("aa") 。当注掉这段代码执行测试类,那么会看到数据被成功的保存到了数据库中,但是如果加入这段代码时再次运行测试类, 发现此处的操作并不会将数据保存到数据库中。
注意:默认情况下Spring 中的事务处理只对RuntimeException 方法进行回滚,所以,如果此处将RuntimeException替换成普通的Exception不会产生回滚效果。
四、SpringMVC
SpringMVC分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
Spring 的MVC 是基于Servlet 功能实现的,通过实现Servlet 接口的DispatcherServlet 来封装其核心功能实现,通过将请求分派给处理程序,同时带有可配置的处理程序映射、视图解析、本地语言、主题解析以及上载文件支持。默认的处理程序是非常简单的Controller 接口,只有一个方法ModelAndView handleRequest(request, response) 。Spring 提供了一个控制器层次结构,可以派生子类。如果应用程序需要处理用户输入表单, 那么可以继承AbstractFormController。如果需要把多页输入处理到一个表单,那么可以继承AbstractWizardFormController。
对SpringMVC 或者其他比较成熟的MVC 框架而言,解决的问题无外乎以下几点。
-
将Web 页面的请求传给服务器。
-
根据不同的请求处理不同的逻辑羊元。
-
返回处理结果数据并跳转至响应的页面。
SpringMVC 快速体验
1. 配置web.xml
一个Web 中可以没有web.xml 文件,也就是说, web.xml 文件并不是Web 工程必需的。web.xml 文件用来初始化配置信息,比如Welcome 页面、servlet 、servlet-mapping 、filter、listener 、启动加载级别等。但是, SpringMVC 的实现原理是通过servlet 拦截所有URL来达到控制的目的,所以web.xml 的配置是必需的。
Spring 的MVC 之所以必须要配置web.xml ,其实最关键的是要配置两个地方。
- contextConfigLocation:Spring的核心就是配置文件,可以说配置文件是Spring中必不可少的东西,而这个参数就是使Web与Spring的配置文件相结合的一个关键配置。
- DispatcherServlet :包含了SpringMVC的请求逻辑, Spring使用此类拦截Web请求并进行相应的逻辑处理。
2. 创建Spring 配置文件applicationContext.xml
InternalResourceViewResolver 是一个辅助bean ,会在ModelAndView 返回的视图名前加上prefix指定的前缀,再在最后加上suffix 指定的后缀, 例如:由于XX.Controller 返回的ModelAndView 中的视图名是testview ,故该视图解析器将在/WEB-INF/jsp/testview.jsp处查找视图。
3 . 创建model
模型对于SpringMVC 来说并不是必不可少,如果处理程序非常简单,完全可以忽略。模型创建主要的目的就是承载数据,使数据传输更加方便。
4 . 创建controller
控制器用于处理Web 请求, 每个控制器都对应着一个逻辑处理。
在请求的最后返回了ModelAndView 类型的实例。ModelAndView 类在SpringMVC 中占有很重要的地位,控制器执行方法都必须返回一个ModelAndView, ModelAndView 对象保存了视图以及视图显示的模型数据,例如其中的参数如下。
-
第1个参数userlist:视图组件的逻辑名称。这里视图的逻辑名称就是userlist,视图解析器会使用该名称查找实际的View对象。
-
第2个参数users : 传递给视图的模型对象的名称。
-
第3个参数userList : 传递给视图的模型对象的值。
5. 创建视图文件userlist.jsp
视图文件用于展现请求处理结果,通过对JSTL 的支持,可以很方便地展现在控制器中放入ModelAndView 中的处理结果数据。
6. 创建Servlet 配置文件Spring-servlet.xml
因为SpringMVC 是基于Servlet 的实现,所以在Web 启动的时候,服务器会首先尝试加载对应于Servlet 的配置文件,而为了让项目更加模块化,通常我们将Web 部分的配置都存放于此配置文件中。
至此,已经完成了SpringMVC 的搭建,启动服务器,输入网址http://localhost:8080/Springrnvc/userlist.htm。看到了服务器返回界面如下图所示。