目前已经学习了 MyBatis 框架,Spring 框架,以及Spring MVC 框架。现阶段学习将这三个框架整合到一起,实现简单的前后端交互的曾删改差功能页面。
Mybatis 框架主要负责数据库的操作问题,以及数据回显。该框架将 SQL 与 Java 代码拆分开,降低耦合度的同时使代码可视程度更高,方便后期的 SQL 维护。
Spring 框架主要负责解决在企业级开发时业务逻辑层与其他层之间有大量耦合现象。将 Java 对象的创建和管理交给 Spring IOC 容器处理,减少了很多的对象重复创建,主要理念就是:谁用这个对象就由谁来创建!而不是事前创建完成再去调用!
Spring MVC 框架负责V-C交互的问题,即V(View:视图)和C(Controller:控制器)之间的交互问题,具体表现在:用户可以通过视图将请求数据提交给服务器端的控制器,而控制器可以接收到相关数据后进行处理,最终,给予客户端某个视图,使得客户端得到响应结果。
注:其实这些框架的出现就是为了实现一件事,代码解耦,优化程序!将原本写在一起的代码查分开来,各司其职,各自优化,使程序的开发过程更加简单,后续优化或者改动更加便捷,程序更加高效。
文章目录
- 一、环境准备
- 二、编辑 Dao 层(以及 MyBatis 相关配置)代码
- 三、编辑 Service 层接口和实现类逻辑代码
- 四、编辑 Spring 相关配置
- 4.1 Spring 整合 Mybatis,配置数据源,将数据源以 bean 的形式进行管理
- 4.2 Spring 整合 service 层
- 4.3 整合 Spring MVC 层
- 4.3.1 引入 web 框架支持,配置 web.xml
- 4.3.1 配置整合 Spring MVC
一、环境准备
-
IDEA、MySql、Tomcat、Maven
-
数据库准备
-
创建数据库
CREATE DATABASE `ssmbuild`;
-
在 ssmbuild 库中创建相关的表并导入数据
-- 指定ssmbuild 库 USE `ssmbuild`;DROP TABLE IF EXISTS `books`;CREATE TABLE `books` ( `bookID` INT(10) NOT NULL AUTO_INCREMENT COMMENT '书id', `bookName` VARCHAR(100) NOT NULL COMMENT '书名', `bookCounts` INT(11) NOT NULL COMMENT '数量', `detail` VARCHAR(200) NOT NULL COMMENT '描述', KEY `bookID` (`bookID`) ) ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO `books`(`bookID`,`bookName`,`bookCounts`,`detail`)VALUES (1,'Java',1,'从入门到放弃'), (2,'MySQL',10,'从删库到跑路'), (3,'Linux',5,'从进门到进牢');
-
-
项目准备
-
创建基本的 maven 项目,并在 pom.xml 中导入相关依赖和姿态资源配置
-
依赖准备
<dependencies><!--Junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency><!--数据库驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!-- 数据库连接池:c3p0 --><dependency><groupId>com.mchange</groupId><artifactId>c3p0</artifactId><version>0.9.5.2</version></dependency><!--Servlet - JSP --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!--Mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.2</version></dependency><!-- Mybatis整合Spring--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.2</version></dependency><!--Spring--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.1.9.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.9.RELEASE</version></dependency><!-- Lombok工具 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version><scope>provided</scope></dependency></dependencies>
-
静态资源配置
<!-- 配置静态资源,避免找不到相关的文件 --><build><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources></build>
-
-
在 Java 资源目录下创建之后需要的包
-
二、编辑 Dao 层(以及 MyBatis 相关配置)代码
-
在 pojo 包下创建 Books 表的实体类
@Data @AllArgsConstructor @NoArgsConstructor public class Books {private int bookID;private String bookName;private int bookCounts;private String detail; }
-
创建 Mapper 接口,以及与接口对应的 xml
public interface BooksMapper {// 查询全部书籍信息List<Books> queryBooksAll();// 根据书籍ID查询List<Books> queryBooksId(@Param("bookID") int id);// 新增书籍int saveBooks(Books books);// 修改书籍信息int updateBooks(Books books);// 删除书籍int deleteBooks(Books books); }
-
接口对应的 xml-BooksMapper.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.sys.mapper.BooksMapper"><select id="queryBooksAll" resultType="com.sys.pojo.Books">select * from books</select><select id="queryBooksId" resultType="com.sys.pojo.Books">select * from books where 1=1<if test="bookID != null">and bookID = #{bookID}</if></select><insert id="saveBooks" parameterType="com.sys.pojo.Books">insert into books (bookName, bookCounts, detail)values (#{bookName}, #{bookCounts}, #{detail})</insert><update id="updateBooks" parameterType="com.sys.pojo.Books">update books set bookCounts = #{bookCounts} where 1=1<if test="bookID != null">and bookID = #{bookID}</if></update><delete id="deleteBooks" parameterType="com.sys.pojo.Books">delete from books where 1=1<if test="booksID != null">and booksID = #{booksID}</if></delete></mapper>
-
在resources 资源目录下创建资源配置文件
-
创建 MyBatis 配置文件:MyBatis-Config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><!-- 数据源不再由 MyBatis 负责,交给 Spring 来做 --><!-- 配置实体 --><typeAliases><package name="com.sys.pojo"/></typeAliases><!-- 配置mapper接口 --><mappers><mapper class="com.sys.mapper.BooksMapper"/></mappers> </configuration>
-
创建数据源配置文件:database.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=utf8 jdbc.username=root jdbc.password=root
-
三、编辑 Service 层接口和实现类逻辑代码
-
在 service 包下创建接口
public interface BooksService {// 查询全部书籍信息List<Books> queryBooksAll();// 根据ID查询List<Books> queryBooksId();// 新增书籍int saveBooks(Books books);// 修改书籍信息int updateBooks(Books books);// 删除书籍int deleteBooks(Books books);}
-
创建对应的实现类
@Service public class BooksServiceImpl implements BooksService {// 依赖注入,通过该 bean 调用其中的方法@AutowiredBooksMapper bokksMapper;public List<Books> queryBooksAll() {List<Books> list = bokksMapper.queryBooksAll();return list;}public List<Books> queryBooksId() {List<Books> list = bokksMapper.queryBooksId(1);return list;}public int saveBooks(Books books) {Books book = new Books();book.setBookName("Java 八股文,背!");book.setBookCounts(5);book.setDetail("从Java基础到框架的知识点,面试需要背");return bokksMapper.saveBooks(book);}public int updateBooks(Books books) {Books book = new Books();book.setBookID(1);book.setBookCounts(4);return bokksMapper.updateBooks(books);}public int deleteBooks(Books books) {Books book = new Books();book.setBookID(3);return bokksMapper.deleteBooks(books);} }
-
四、编辑 Spring 相关配置
-
创建 Spring 配置文件:applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"></beans>
4.1 Spring 整合 Mybatis,配置数据源,将数据源以 bean 的形式进行管理
-
配置 Spring 整合 dao层,创建 Spring-dao.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"></beans>
-
具体有如下步骤
-
1、导入数据源文件
<context:property-placeholder location="classpath:database.properties"/>
-
2、配置数据库连接池
<!--数据库连接池: dbcp 半自动化操作 不能自动连接 c3p0 自动化操作(自动的加载配置文件 并且设置到对象里面)--> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><!--配置数据库连接池相关属性,通过 EL 表达式获取database.properties中的具体配置--><property name="driverClass" value="${jdbc.driver}"/><property name="jdbcUrl" value="${jdbc.url}"/><property name="user" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/><!--配置c3p0连接池私有属性--><property name="maxPoolSize" value="30"/><!--最大连接池大小--><property name="minPoolSize" value="10"/><!--最小连接池大小--><!-- 关闭连接后不自动commit --><property name="autoCommitOnClose" value="false"/><!-- 获取连接超时时间 --><property name="checkoutTimeout" value="10000"/><!-- 当获取连接失败重试次数 --><property name="acquireRetryAttempts" value="2"/> </bean>
-
3、配置SqlSessionFactory对象
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!--将数据连接池注入到 SqlSessionFactory 对象中--><property name="dataSource" ref="dataSource"/><!--配置 Mybatis全局配置文件--><property name="configLocation" value="classpath:mybatis-config.xml"/> </bean>
-
4、配置扫描Dao接口包,动态实现Dao接口注入到spring容器中
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!-- 将对象sqlSessionFactory注入sqlSessionFactoryBeanName对象中 --><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/><!-- 配置Spring自动扫描,mapper包下的接口会被自动扫描 --><property name="basePackage" value="com.sys.dao"/> </bean>
-
-
文件完整配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--配置整合 MyBatis --><!--1.关联数据源配置文件--><context:property-placeholder location="classpath:database.properties"/><!--2.配置数据库连接池--><!--数据库连接池:dbcp 半自动化操作 不能自动连接c3p0 自动化操作(自动的加载配置文件 并且设置到对象里面)--><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><!--配置数据库连接池相关属性,通过 EL 表达式获取database.properties中的具体配置--><property name="driverClass" value="${jdbc.driver}"/><property name="jdbcUrl" value="${jdbc.url}"/><property name="user" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/><!--配置c3p0连接池私有属性--><property name="maxPoolSize" value="30"/><!--最大连接池大小--><property name="minPoolSize" value="10"/><!--最小连接池大小--><!-- 关闭连接后不自动commit --><property name="autoCommitOnClose" value="false"/><!-- 获取连接超时时间 --><property name="checkoutTimeout" value="10000"/><!-- 当获取连接失败重试次数 --><property name="acquireRetryAttempts" value="2"/></bean><!--3.配置SqlSessionFactory对象--><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!--将数据连接池注入到 SqlSessionFactory 对象中--><property name="dataSource" ref="dataSource"/><!--配置 Mybatis全局配置文件--><property name="configLocation" value="classpath:mybatis-config.xml"/></bean><!-- 4.配置扫描Dao接口包,动态实现Dao接口注入到spring容器中 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!-- 将对象sqlSessionFactory注入sqlSessionFactoryBeanName对象中 --><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/><!-- 配置Spring自动扫描,mapper包下的接口会被自动扫描 --><property name="basePackage" value="com.sys.dao"/></bean></beans>
-
4.2 Spring 整合 service 层
-
配置 Spring 整合 service 层,创建 Spring-Service.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"></beans>
-
具体步骤如下:
-
1、配置 service 包下的自动扫描
<!--1.扫描service包下的所有类(不包括接口)--><context:component-scan base-package="com.sys.service"/>
-
2、将业务类注入到 Spring 容器中,由容器进行管理
<!--2.将我们所有的业务类注入到Spring中,可以通过配置或者注解实现--><bean id="BooksServiceImpl" class="com.sys.service.impl.BooksServiceImpl"><property name="booksMapper" ref="booksMapper"/></bean>
-
3、配置事务管理器,管理注入进来的数据库连接池
<!--3.配置事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!--注入数据库连接池--><property name="dataSource" ref="dataSource"/></bean>
-
-
文件完整配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--1.扫描service包下的所有类(不包括接口)--><context:component-scan base-package="com.sys.service"/><!--2.将我们所有的业务类注入到Spring中,可以通过配置或者注解实现--><bean id="BooksServiceImpl" class="com.sys.service.impl.BooksServiceImpl"><property name="booksMapper" ref="booksMapper"/></bean><!--3.配置事务管理器--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><!--注入数据库连接池--><property name="dataSource" ref="dataSource"/></bean></beans>
-
Spring 层配置完成:Spring 就是一个大杂烩,一个容器!这些配置都可以整合到 Spring 容器当中。
4.3 整合 Spring MVC 层
配置整合 Spring MVC 层
4.3.1 引入 web 框架支持,配置 web.xml
-
具体步骤如下:
-
配置 DispatcherServlet
<!--DispatcherServlet--><servlet><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><!--一定要注意:我们这里加载的是总的配置文件,之前被这里坑了!--> <param-value>classpath:applicationContext.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>DispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
-
配置乱码过滤
<!--配置乱码过滤:encodingFilter--><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
-
配置 Session 过期时间
<!--Session过期时间--><session-config><session-timeout>15</session-timeout></session-config>
-
-
文件完整配置
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--DispatcherServlet--><servlet><servlet-name>DispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><!--一定要注意:我们这里加载的是总的配置文件,之前被这里坑了!--> <param-value>classpath:applicationContext.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>DispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!--encodingFilter--><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--Session过期时间--><session-config><session-timeout>15</session-timeout></session-config></web-app>
4.3.1 配置整合 Spring MVC
-
创建 Spring-MVC.xml