SSM框架整合
一. 框架简介及特征
1.SpringMVC
springmvc是spring的一个模块,一个“小弟”,用于web开发,可理解为servlet的升级版。Spring MVC将控制器、模型对象、过滤器以及处理程序对象的角色,分离了后就更容易控制或者进行定制。
2.Spring
Spring:平时开发接触最多的估计就是IOC容器,它可以装载bean(也就是Java中的类,当然也包括service dao里面的),有了这个机制,就不用在每次使用这个类的时候为它初始化,很少看到关键字new。另外spring的aop,事务管理等等都是人们经常用到的。
3.Mybatis
Mybatis:mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。
-
易于上手和掌握。
-
sql写在xml里,便于统一管理和优化。
-
解除sql与程序代码的耦合。
-
提供xml标签,支持编写动态sql。
二、SpringMVC流程架构图
三、SSM框架原理
1.SpringMVC运行原理
1.用户浏览器端发送请求到前端控制器dispatcherservlet中;
2.dispatcherservlet收到请求,请求查询到控制器处理器handlermapping,handlermapping再返回处理器执行链到dispatcherservlet中;
3.dispatcherservlet拿到执行链到处理器适配器中handlerAdaptor,处理器适配器根据执行链找到相应的控制器,控制器执行完后返回一个ModelAndView对象给适配器处理器,适配器处理器将ModelAndView对象返回给前端控制器;
4.前端控制器拿到modelandview对象就去找视图解析器,视图解析器再返回一个视图;
5.前端控制器拿到视图后进行视图渲染;
6.最后将渲染好的视图响应会浏览器;
1.1 SpringMVC 三层架构运行流程
2.Spring IOC和AOP思想
Spring Ioc容器,指的是反转控制IOC容器负责实例化和初始化容器中的对象以及配置对象之间的依赖。对象的创建权交给Spring容器,开发人员只需要在Spring容器中获取对象就行了。不用再去实例化并在类中绑定关系。
Spring除了IOC思想还有一个AOP思想,就是面向切面编程,其底层的实现原理就是动态代理,将要被增强的一个或者多个方法作为切点,而增强方法作为通知,通过织入的配置而成一个切面。从而实现不更改源代码动态的实现增强方法。可以用于日志打印,提示等。例如在卡里取钱,取完钱后一般就会有一个通知短信,就可以使用切面编程的思想,在取钱这个功能方法执行之后织入一个短信增强方法。
3.Mybaties的架构设计
实现Mybatis的两个方法:
1)使用Mybatis提供的API,获取sqlsession对象通过传递StatementId和查询的参数,使用sqlsession对象完成和数据库的交互;
2)使用Mapper接口方式。
4.Mybaties运行原理
1.加载配置文件
将SQL的配置信息加载成为一个个MappedStatement对象,包括了参数映射配置,执行的SQL语句、 结果映射配置,存储在内存中。
2.SQL解析
当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map/JavaBean或者基本 数据类型),Mybatis会根据SQL的ID找到对应的MappedStatement, 然后根据传入的参数对象 MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。
3.SQL执行
将最终得到的SQL和参数拿到数据库执行,得到操作数据库的结果。
4.结果映射
将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap/JavaBean或者基本数据类型, 并将最终的结果返回。
四、SSM框架配置
1.SSM框架需要导入的jar包
<!--1、引入数据源驱动包:dbcp2的jar包,也可以引入c3p0,druid-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.7.0</version>
</dependency>
<!--2、引入logging的jar包-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!--3、引入pool2的jar包-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.9.0</version>
</dependency>
<!--4.导入commons-io的jar包-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<!--5.导入commons-fileupload的jar包-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!--6、引入fastjson的jar包-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
<!--7、引入jstl的jar包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--8、引入log4j的jar包-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--9、引入Mybatis的jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!--10、引入mybatis-spring的jar包-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<!--11、mysql-connector-java的jar包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<!--12、引入servlet-api的jar包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!--13、引入spring-aop的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.3</version>
</dependency>
<!--14、引入spring-aspects的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.3</version>
</dependency>
<!--15、引入spring-beans的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.3</version>
</dependency>
<!--16、引入spring-context的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.3</version>
</dependency>
<!--17、引入spring-core的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.3</version>
</dependency>
<!--18、引入spring-expression的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.3.3</version>
</dependency>
<!--19、引入spring-jdbc的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.3</version>
</dependency>
<!--20、引入spring-messaging的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-messaging</artifactId>
<version>5.3.3</version>
</dependency>
<!--21、引入spring-test的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.3</version>
<scope>test</scope>
</dependency>
<!--22、引入spring-tx的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.3</version>
</dependency>
<!--23、引入spring-web的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.3</version>
</dependency>
<!--24、引入spring-webmvc的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.3</version>
</dependency>
<!--25、引入standard的jar包-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!--Maven资源过滤设置-->
<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>
2.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">
<!--配置前端过滤器 DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--springmvc上下文配置-->
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<!--tomcat启动时加载-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!--跟上面servlet名字对应-->
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--乱码过滤-->
<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>
3.Spring-mvc.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">
<!-- 启动mvc注解驱动 -->
<mvc:annotation-driven />
<!-- 静态资源过滤 -->
<mvc:default-servlet-handler/>
<!-- 配置扫描的控制器包 -->
<context:component-scan base-package="com.yhq.controller"/>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 扫描web相关的bean -->
<context:component-scan base-package="com.yhq.controller" />
</beans>
4.jdbc.properties配置文件
jdbc.driver=com.mysql.jdbc.driver
jdbc.url=jdbc:mysql://localhost:3306/test?servserTimezone=UTC&useSSL=true&characterEncoding=utf8&useUnicode=true
jdbc.username=root
jdbc.password=123456
5.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.yhq.pojo"/>
</typeAliases>
<!--配置映射文件-->
<mappers>
<mapper resource="com/yhq/dao/BookMapper.xml"/>
</mappers>
</configuration>
6.Spring整合Mybatis的相关的配置文件和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"
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/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置整合mybatis -->
<!-- 1.关联数据库文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 2.数据库连接池 c3p0-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<!-- 配置连接池属性 -->
<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">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<!-- 4.配置扫描Dao接口包,动态实现Dao接口注入到spring容器中 -->
<!--解释 :https://www.cnblogs.com/jpfss/p/7799806.html-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 注入sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 给出需要扫描Dao接口包 -->
<property name="basePackage" value="com.yhq.dao"/>
</bean>
</beans>
7.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"
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/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 扫描service相关的bean -->
<context:component-scan base-package="com.yhq.service" />
<!--BookServiceImpl注入到IOC容器中-->
<bean id="BookServiceImpl" class="com.kuang.service.BookServiceImpl">
<property name="bookMapper" ref="bookMapper"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
8.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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<import resource="spring-dao.xml"/>
<import resource="spring-service.xml"/>
<import resource="spring-mvc.xml"/>
</beans>