目录:
- 一、整合环境搭建
- 整合思路
- 准备所需JAR包
- 编写配置文件
- 二、整合应用测试
作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!
该文章参考学习教材为:
《Java EE企业级应用开发教程 (Spring + Spring MVC +MyBatis)》 黑马程序员 / 编著
文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章文章用于本人学习使用 , 同时希望能帮助大家。
欢迎大家点赞👍 收藏⭐ 关注💖哦!!!(侵权可联系我,进行删除,如果雷同,纯属巧合)
一、整合环境搭建
整合思路
由于 Spring MVC是Spring框架 中的 一个模块,所以 Spring MVC 与 Spring之间不存在整合的问题,只要引入相应JAR 包就可以直接使用。因此 SSM框架的整合就只涉及Spring 与MyBatis的整合,以及 Spring MVC与MyBatis的整合,如下图所示 :
在讲Spring与MyBatis框架的整合时,我们是 通过Spring实例化Bean,然后 调用实例对象中的查询方法 来执行 MyBatis映射文件中的SQL语句 的,如果能够正确查询出数据库中的数据,那么我们就 认为Spring 与MyBatis框架整合成功 。同样,在学习完 Spring MVC 后,如果我们可以 通过前台页面来执行查询方法,并且 查询出的数据 能够在 页面中正确显示,那么我们 也可以认为三大框架整合成功。
准备所需JAR包
要 实现SSM框架的整合,首先要准备 这三个框架的JAR包,以及 其他整合所需的JAR包 ,将 整合所需JAR包 添加到 WEB-INF下 的 lib包 下。
SSM框架整合所需JAR
编写配置文件
db.properties :
jdbc.driver = com.mysql.jdbc.Driver jdbc.url =jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC jdbc.username = root jdbc.password = root #最大连接数 jdbc.maxTotal = 30 #最大空闲数 jdbc.maxIdle = 10 #初始化连接数 jdbc.initialSize = 5
log4j.properties :
# 因为Mybatis默认使用功能log4j来输出日志信息,所以如果要查看控制处输出sql语句 # 就要在classpath路径下配置log4g的配置文件 : log4j.properties (log4j要配置的"日志文件") : # 即在src目录下配置 log4j.properties配置文件,然后将以下的配置信息复制到配置文件中 # Global logging configuration log4j.rootLogger=ERROR, stdout # MyBatis logging configuration... #将com.myh包下所有类的日志记录设计为DEBUG log4j.logger.com.myh=DEBUG # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
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" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tool http://www.springframework.org/schema/tool/spring-tool.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 读取db.properties文件 property-placeholder : 特性占位符 --> <context:property-placeholder location="classpath:db.properties"/> <!-- 配置数据源 : BasicDataSource : 基本数据源--> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!-- 最大连接数 --> <property name="maxTotal" value="${jdbc.maxTotal}"/> <!-- 最大空闲连接数 --> <property name="maxIdle" value="${jdbc.maxIdle}"/> <!-- 初始化连接数 --> <property name="initialSize" value="${jdbc.maxTotal}"/> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- ref是引用"本页面"的内容 value是引入"非本页面"有的内容 --> <property name="dataSource" ref="dataSource"/> </bean> <!-- 开启事务注解 --> <tx:annotation-driven transaction-manager="transactionManager"/> <!-- 配置Mybatis的内容 : 配置SqlSessionFactory : SqlSession工厂 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注入数据源 --> <property name="dataSource" ref="dataSource"/> <!-- 指定Mybatis配置文件的位置 --> <property name="configLocation" value="classpath:mybatis-config.xml"/> </bean> <!-- 配置mapper扫描器,将指定包下的所有XxxDao.java加入到IOC容器中 (就不用手动将一个一个将将XxxDao接口加入到IOC容器中) --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.myh.dao"/> </bean> <!-- 进行“组件扫描”,根包扫描,让注解生效 --> <context:component-scan base-package="com.myh.service"/> </beans>
springmvc-config.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" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 配置组件扫描,进行根包扫描,让注解生效 --> <context:component-scan base-package="com.myh.controller"/> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> <!-- 注解驱动 : 作用1 : 用于启用"注解驱动"的"控制器方法",同时让注解生效。(一般而言,用到"控制器类"或"控制器方法" 就要配置"注解驱动") 作用2 : 会注册RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter这两个bean 作用3 : 对“读写XML”和“读写JSON”的支持 (所以此处的JSON数据交互要在springmvc-config.xml中用此注解) 作用4 : <mvc:annotation-driven/>注解会会自动配置一些常用的消息转换器(Message Converters),其中就包括处理JSON数据的`MappingJackson2HttpMessageConverter`(所以进行JSON数据交互时要导入该标签: 注解驱动) --> <!-- 配置注解驱动 --> <mvc:annotation-driven/> </beans>
web.xml :
<?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"> <!-- 加载Spring的配置文件: applicationContext.xml --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 配置加载Spring文件的监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 编码过滤器 --> <filter> <filter-name>encoding</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>encoding</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <!-- 配置前端控制器 --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置springmvc-config.xml的位置 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-config.xml</param-value> </init-param> <!-- 配置启动服务器时加载该配置文件,加载该servlet --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <!-- / : 拦截所有请求(除了jsp) --> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
在实际开发时,为了 避免Spring配置文件 中的 信息过于臃肿,通常会将 Spring配置文件中 的 信息按照不同的功能分散 在 多个配置文件 中。例如可以将 事务配置 放置在名称为 applicationContext-transaction.xml 的文件中,将 数据源等信息放置在名称为 applicationContext-db.xml 的文件中等。这样,在 web.xml 中配置加载Spring文件信息时,只需通过 applicationContext-*.xml 的方式即 可自动加载全部配置文件。
mybatis-config.xml :
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 配置别名,不用写全限定类名,写类名对应的小写类名即可 --> <!-- 为持久化类设置“别名” --> <typeAliases> <package name="com.myh.po"/> </typeAliases> </configuration>
二、整合应用测试
通过 上面的配置已经完成 了 SSM框架整合环境 的 搭建工作,可以说完成了这些配置后,就已经 完成了这三个框架大部分的整合工作。接下来,同样以 查询客户信息为例,来讲解 SSM 框架的整合开发,其 具体实现步骤如下 :
Customer.java :
package com.myh.po; /** * po包为"持久化包", Customer为“客户持久化类” */ public class Customer { private Integer id; private String username; private String jobs; private String phone; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getJobs() { return jobs; } public void setJobs(String jobs) { this.jobs = jobs; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } @Override public String toString() { return "Customer{" + "id=" + id + ", username='" + username + '\'' + ", jobs='" + jobs + '\'' + ", phone='" + phone + '\'' + '}'; } }
CustomerMapper.java :
package com.myh.mapper; import com.myh.po.Customer; /** * 直接操作数据库的CustomerMapper.xml文件对应的接口文件 : CustomerMapper.java, * 将两者链接之后,调用 CustomerMapper.java接口中的方式即可操作数据库 */ public interface CustomerMapper { /** * 根据id查查询客户信息 */ public Customer findCustomerById(Integer id); }
CustomerMapper.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"> <!-- namespace的命名空间 --> <mapper namespace="com.myh.mapper.CustomerMapper"> <!-- 根据id查询客户信息 --> <select id="findCustomerById" parameterType="Integer" resultMap="resultMap"> select * from tb_customer where t_id = #{id} </select> <resultMap id="resultMap" type="com.myh.po.Customer"> <id property="id" column="t_id"/> <result property="username" column="t_username"/> <result property="jobs" column="t_jobs"/> <result property="phone" column="t_phone"/> </resultMap> </mapper>
CustomerService.java (接口):
package com.myh.service; import com.myh.po.Customer; public interface CustomerService { //接口 public Customer findCustomerById(Integer id); }
CustomerServiceImpl.java (实现类):
package com.myh.service.Impl; import com.myh.mapper.CustomerMapper; import com.myh.po.Customer; import com.myh.service.CustomerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service //用该注解将该类加入到IOC容器中 @Transactional //将类将开启事务 public class CustomerServiceImpl implements CustomerService { @Autowired private CustomerMapper customerMapper; public Customer findCustomerById(Integer id) { return this.customerMapper.findCustomerById(id); } }
在上面的代码 中,使用了 @Service 注解来标识业务层的实现类,使用了 @Transactional注解来标识类中的所有方法都纳入 Spring 的事务管理,并使用 @Autowired注解将CustomerMapper接口对象注入到本类中,然后在本类的查询方法中调用了CustomerMapper对象的查询客户方法。
CustomerController.java (处理器类):
package com.myh.controller; import com.myh.po.Customer; import com.myh.service.CustomerService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller //将该类标记为"处理器类",使该类中的方法能被url链接到、查询到 public class CustomerController { //控制器类 @Autowired private CustomerService customerService; /** * 根据id查询客户详情 */ @RequestMapping("/findCustomerById") public String findCustomerById(Integer id, Model model) { Customer customer = customerService.findCustomerById(id); //使用功能model响应数据给前端 model.addAttribute("customer", customer); //返回客户信息展页面 return "customer"; } }
Customer.jsp :
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>客户信息展示页面</title> </head> <body> <table border="1"> <tr> <td>编号</td> <td>名称</td> <td>职业</td> <td>电话</td> </tr> <tr> <td>${customer.id}</td> <td>${customer.username}</td> <td>${customer.jobs}</td> <td>${customer.phone}</td> </tr> </table> </body> </html>
在上述代码中,编写了一个用于展示客户信息的表格,表格会通过 EL表达式 来获取控制层返回的客户信息。