讲解ssm框架整合(最通俗易懂)
⽬录
环境
1 Mybatis
2 Spring 整合 Mybatis
3 整合 SpringMVC
4 Spring 配置整合⽂件
结束
环境
MySQL 8.0.16
1 Mybatis
1.1 数据库配置⽂件
jdbc.sql.cj.jdbc.Driver
# 如果使⽤mysql 6+,增加⼀个时区的配置
jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&useSSL=false
jdbc.username=root
jdbc.password=123456
JDBC 连接 mysql 5:
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
JDBC 连接 mysql 6:
url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC&?useUnicode=true&characterEncoding=utf8&useSSL=false
1.2 配置 Mybatis
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-////DTD Config 3.0//EN"
"/dtd/mybatis-3-config.dtd">
<configuration>
<!--配置数据源,交给 spring 去做-->
<typeAliases>
<package name="com.fyy.pojo"/>
</typeAliases>
<mappers>
<mapper class="com.fyy.dao.BookMapper"/>
</mappers>
</configuration>
typeAiases 标签作⽤?
其中,<typeAiases>标签的作⽤只是为 Java 类型指定⼀个短的名字,它只和xml 配置有关,存在的意义仅在于⽤来减少类完全限定名的冗余。
指定⼀个包名,Mybatis 会在此包名下搜索需要的 Java Bean,每⼀个在此包下的 Java Bean,在没有注解的情况下,会使⽤ Bean 的⾸字母⼩写的⾮限定类名作为它的别名,⽐如:com.fyy.pojo.User 的别名为:user ,若有注解,则别名为其注解值。如下例⼦:
@Alias("hello")
public class Hello(){}
mappers标签作⽤?
Mybatis 是基于 Sql 映射配置的框架,Sql 语句在Mapper 配置⽂件中,当构建 SqlSession 类之后,就需要去读取 Mapper 配置⽂件中的 sql 配置。
mappers : 映射器,以最佳的⽅式告诉 Mybatis 去哪⾥映射⽂件,就是⽤来配置需要加载的 sql 映射配置⽂件路径的。
mappers 下的每⼀个 mapper 都是⼀个mapper,配置的都是⼀个独⽴的映射配置⽂件的路径,配置⽅式有以下⼏种。
1、接⼝所在包
<mappers>
<!-- mapper接⼝所在的包名 -->
<package name="com.fyy.mapper"/>
</mappers>
# package标签,通过 name 属性指定 mapper 接⼝所在的包名,此时对应的映射⽂件必须
与接⼝位于同⼀路径下,并且名称相同。
2、相对路径配置
<mappers>
<mapper resource="com/fyy/l"/>
</mappers>
# mapper标签,通过 resource 属性引⼊ classpath 路径的相对资源
3、类注册引⼊
<mappers>
<mapper class="com.fyy.mapper.FlowerMapper"/>
</mappers>
# mapper 标签,通过 class 属性指定 mapper 接⼝名称,此时对应的映射⽂件必须与接⼝位于同⼀路径
下,并且名称相同
javaswing美化4、使⽤ url 绝对路径⽅式引⼊(不推荐)
<mappers>
<mapper url="file:///var/l"/>
</mappers>
# mapper 标签,通过 url 引⼊⽹络资源或者本地磁盘资源
总结
只有配置了 mappers 信息,Mybatis 才知道去哪⾥加载 Mapper 配置⽂件,开发中,根据项⽬中 Mapper 的配置偏好,选择整合配置⽂件的配置⽅式。
2 Spring 整合 Mybatis
2.1 Spring 整合 dao 层
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:context="/schema/context"
xsi:schemaLocation="/schema/beans
/schema/beans/spring-beans.xsd /schema/context /schema/context/spring-context.xsd">
<!-- 配置整合Mybatis-->
<!--1、关联数据库配置⽂件-->
<context:property-placeholder location="classpath:database.properties"/>
<!--2、连接池-->
<!--数据库连接池
三角函数中的万能公式dbcp 半⾃动化操作不能⾃动连接
c3p0 ⾃动化操作(⾃动的加载配置⽂件并且设置到对象⾥⾯)-->
<bean id="dataSource" class="hange.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"/>vbs脚本怎么停止
</bean>
<!-- 3.配置SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="batis.spring.SqlSessionFactoryBean">
<!-- 注⼊数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置MyBaties全局配置⽂件:l -->
<property name="configLocation" value="l"/>
</bean>
<!-- 4.配置扫描Dao接⼝包,动态实现Dao接⼝注⼊到spring容器中 -->
<bean class="batis.spring.mapper.MapperScannerConfigurer">
<!-- 注⼊sqlSessionFactory -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<!-- 给出需要扫描Dao接⼝包 -->
<property name="basePackage" value="com.fyy.dao"/>
</bean>
</beans>
2.1.1 context:property-placeholder标签作⽤?
在开发中有些参数是常量,⽐如:连接数据库的 url,password,username 等信息,不需要常变化,但在不同阶段⼜需要变化,有没有有⼀种⽅案⽅便我们在⼀个阶段内不需要频繁写⼀个参数的值,但在不同阶段间⼜可以⽅便的切换参数的配置信息。
解决⽅案:Spring 3 中提供了⼀种简便的⽅式就是 content:property-placeholder元素,即可解决上述问题。
在 content:property-placeholder 标签中利⽤属性 localtion ,值为⽂件路径,可以使⽤ classpath: 指定⽂件名即可。这⾥我们关联上数据库配置信息。
Spring 容器中仅允许最多定义⼀个 context:property-placeholder ,其余的会被忽略。
2.1.2 数据库连接池
每次创建⼀个数据库连接都是⼀次极⼤的资源消费,所以连接复⽤,通过建⽴⼀个数据库连接池以及⼀套连接使⽤管理策略,可以使⼀个数据库连接可以得到⾼效、安全的复⽤,能避免了数据库连接池频繁建⽴、关闭的开销。
连接池的本质:介于 Java 和 JDBC 之间的 Java jar 包!
第1步中,我们关联了数据库配置信息,利⽤ bean 标签可获取其中的配置信息。
字符串长度排序可根据项⽬实际开发中,配置连接池的最⼤数量、最⼩数量、关闭连接后是否⾃动 commit、获取连接超时时间、获取连接失败重试次数等,很多属性,在这不⼀⼀赘述了。
2.1.3 配置 SqlSessionFactory 对象
SqlSessionFacoty 的作⽤就是创建 SqlSession,SqlSession 就是⼀个会话,相当于 JDBC 中的 Connection 对象,每次应⽤访问数据库,就要通过 SqlSessionFactory 创建SqlSession ,所以 SqlSessionFacoty 应该在 Mybatis 整个⽣命周期中,每⼀个数据库只应该对应⼀个 SqlSessionFacoty.
SqlSessionFacoty 在整个 Mybatis 运⾏流程中的作⽤如下图。
配置 SqlSessionFactory 对象时,将数据库连接池注⼊到其中,再配置 mybatis 全局配置⽂件。
我的理解是:在 SqlSessionFactory 创建 SqlSession 连接数据库时,需要知道数据库连接池的信息,以及数据源。
2.1.4 配置扫描dao接⼝包
MapperScannerConfigurer ⾃动扫描将 Mapper 接⼝⽣成代理注⼊到 Spring容器,Mybatis 在与 Spring 整合的时候配置 MapperFactoryBean 来⽣成 Mapper 接⼝的代理。basePackage 属性是让你为映射器接⼝⽂件设置基本的包路径,你可以使⽤分号或者逗号作为分隔符设置多余⼀个包的路径,每个映射器将会在指定的包路径中递归的被搜索到。注意,没有必要去指定 SqlSessionFactory 或 SqlSessionTemplate,因为 MapperScannerConfigurer 将会创建 MapperFactoryBean,之后⾃动装配,但如果使⽤了⼀个以上的 DataSource,那么⾃动装配可能会失效。这种情况下,可以使⽤ sqlSessionFactoryBeanName 或 sqlSessionTemplateBeanName 属性来设置正确的 bean 名称来使⽤。
⼤⽩话理解:扫描dao层的接⼝,MapperScannerConfigurer 会⾃动为每个接⼝⽣成⼀个接⼝代理,这个接⼝代理是接⼝的实现类,并注⼊到Spring容器中。
2.2 Spring 整合 service 层
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:context="/schema/context"
xsi:schemaLocation="/schema/beans
/schema/beans/spring-beans.xsd
/schema/context
/schema/context/spring-context.xsd">
<!-- 扫描service相关的bean -->
<context:component-scan base-package="com.fyy.service" />
<!--BookServiceImpl注⼊到IOC容器中-->
<bean id="BookServiceImpl" class="com.fyy.service.BookServiceImpl">
<property name="bookMapper" ref="bookMapper"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注⼊数据库连接池 -->
<property name="dataSource" ref="dataSource" />
</bean>
</beans>
事务管理器:DataSourceTransactionManager
事务管理是应⽤系统开发中必不可少的⼀部分。Spring 为事务管理提供了丰富的功能⽀持。Spring 事务管理分为编码式和声明式的两种⽅式。编程式事务指的是通过编码⽅式实现事务;声明式事务基于
AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使⽤中声明式事务⽤的⽐较多。声明式事务有两种⽅式,⼀种是在配置⽂件(xml)中做相关的事务规则声明,另⼀种是基于 @Transactional 注解的⽅式。
其中配置⽂件声明事务,是将数据库连接池注⼊到事务管理器中。关于注解⽅式声明事务,就不在这⾥做过多介绍,后期会单独拿出来分享Spring事务。
3 整合 SpringMVC
3.l ⽂件是如何执⾏的?
3.1.1 执⾏顺序
访问顺序为:1->2->3->4,其中 2 和 3 的值必须相同。
⽽被DispatcherServlet 处理前,还会经过 2 ,3 步骤,url 匹配成功后,这个 url 访问名为 servlet-name 中值的 servlet,两个 servlet-name 值必须相同,因为 servlet 标签中的servlet-name 标签映射到 servlet-class 标签中的值,最终访问 servlet-class 标签中的 DispatcherServlet 类,此时,请求才会被 DispatcherServlet 处理。
3.1.2 init-param标签
图中 \标签中的 \标签作⽤是,设置 springmvc 配置⽂件位置以及名称,springmvc配置⽂件不设置默认位置是:webapp,可以使⽤ classpath 设置⽂件的名称为:l ,代表 springmvc 配置⽂件名必须为 l,如不使⽤ classpath 设置其路径及名称,默认在 webapp下,名称为:\标签中的值 + "-l",例如:如标签中值为:springmvc,则默认的 springmvc 配置⽂件名为:l
3.1.3 load-on-startup标签
图中 \标签作⽤是,设置 servlet加载时间,如不设置默认在第⼀次请求访问时加载 servlet,若设置此标签值为正整数,会将 servlet 的加载时间提前到项⽬启动时,此标签中可以写整数,但写负整数和0和没有设置是⼀样的效果,只有设置为正整数才会将 servlet 的加载时间提前到项⽬启动时,也就是 tomcat 启动时,值越⼩,代表优先级越⾼。
3.2 springmvc 配置⽂件是如何执⾏的?
3.2.1 mvc:annotation-driven作⽤?
springmvc注解驱动会⾃动注册:DefaultAnnotationHandlerMapping 与 AnnotationMethodHandlerAdapter 两个bean,这两个 bean 是 SpringMVC 为 @Controller 分发请求所必须的,解决了使⽤ @Controller 注解的前提配置。
在 Spring MVC 3.1 以上:
DefaultAnnotationHandlerMapping 变更为:RequestMappingHandlerMapping
AnnotationMethodHandlerAdapter 变更为:RequestMappingHandlerAdapter
通常如果我们希望通过注解的⽅式来进⾏ SpringMVC开发,我们会在 springmvc 配置⽂件中使⽤注解驱动:\,那这个标签做了什么?通过寻源码,到注解驱动的实现类是:org.springframework.fig.AnnotationDrivenBeanDefinitionParser
我们来看看这个类主要做了什么⼯作?
AnnotationDrivenBeanDefinitionParser类向⼯⼚中注册了⼏个 bean 实例,其中包括:
1. RequestMappingHandlerMapping
2. BeanNameUrlHandlerMapping
3. RequestMappingHandlerAdapter
4. HttpRequestHandlerAdapter
5. SimpleControllerHandlerAdapter
6. ExceptionHandlerExceptionResolver
7. ResponseStatusExceptionResolver
8. DefaultHandlerExceptionResolver
上⾯的bean实例都是做什么的呢?
前两个 bean 是 HandlerMapping 接⼝的实现类,⽤来处理请求映射的。其中第⼀个处理是 @RequestMapping 注解的,第⼆个是将 controller 类的名字映射为请求 url,中间三个 adpter 是⽤来处理请求的,具体说就是确定调⽤哪个 controller 的哪个⽅法来处理当前请求,第⼀个处理 @Controller 注解的处理器,⽀持⾃定义⽅法参数和返回值,第⼆个是处理继承 HttpRequestHandler 的处理器,第三个处理继承⾃ Controller 接⼝的处理器,后⾯三个是⽤来处理异常的解析器。
结论
如果使⽤@Controller 注解,没有配置注解驱动: <mvc:annotation-driven> 的话,那么所有的请求都⽆法到 DispatcherServlet ,并⽆法把请求分发⾄控制器。添加注解驱动后,才会扫描所有带有 @Controller 注解的类,由 spring 管理并维护。
3.2.2 mvc:default-servlet-handler作⽤?
还记得我们在 l 中配置了 url-pattern,⽤来过滤请求,SpringMVC 将接收到的所有请求都看做是⼀个普通请求,包括对于静态资源的请求,这样⼀来,所有对于静态资源的请求都会被看做是⼀个普通的后台控制器请求,⽽静态资源的请求会因为不到资源⽽报404异常。查看 tomcat ⽇志就可以看到会有警告。
对于此问题 SpringMVC 在全局配置⽂件中提供了⼀个 <mvc:default-servlet-handler>标签,在 web 容器启动的时候会在上下⽂中定义⼀个 DefaultServletHttpRequestHandler ,它会对 DispatcherServlet 请求进⾏处理,如果该请求已经做了映射,那么会接着交给后台对应的处理程序,如果没有映射,就交给 web 应⽤服务器默认的 servlet 处理,从⽽到对应的静态资源,只有不到静态资源时会报错。
如果默认的 Servlet 容器不⽤默认的 default ,⽤不同名称进⾏⾃定义配置,或者在缺省 Servlet 名称未知的情况下使⽤了不同的 Servlet 容器,则必须显⽰提供默认 Servlet 的名称。
<mvc:default-servlet-handler default-servlet-name="myCustomDefaultServlet"/>
3.2.3 context:component-scan 作⽤?
扫描组件,将所有使⽤ @Controller 注解的类作为 SpringMVC 的控制层。其中 base-package 属性是指定扫描的包。
3.2.4 视图解析器作⽤?
视图解析器,是将 prefix + 视图名称 + suffix = 确定最终要跳转的页⾯,其中视图名称是什么??处理请求的⽅法会返回⼀个字符串,这个字符串即视图名称,最终会通过配置⽂件中配置的视图解析器实现页⾯的跳转。例如:
@Controller
public class TestController {
@RequestMapping("hello")
public String hello() {
System.out.println("success");
return "success";
}页面设计思路
}
# 其中返回字符串为:success,所以处理此请求最终要跳转的页⾯为:/WEB-INF/view/success.jsp
mysql面试题及讲解关于 SpringMVC的讲解可以查看⼩编的另⼀篇⽂章。
4 Spring 配置整合⽂件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/schema/beans
/schema/beans/spring-beans.xsd">
<import resource="classpath:l"/>
<import resource="classpath:l"/>
<import resource="classpath:l"/>
</beans>
ClassPathXmlApplicationContext
ClassPathResource
XmlWebApplicationContext
FileSystemXmlApplicationContext
…
其中 \ 是将多个配置⽂件通过导⼊的⽅式整合,让配置信息更清晰,达到了解耦的效果。
结束
以上就是本⼈学习ssm框架配置的总结,有的地⽅不够深⼊,但对于初学者来说应该也会收获颇丰,如有错误,还请⼤佬们指正!更多相关ssm框架整合内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论