Spring+SpringMVC+MyBatis企业级应用
目录
古老的 SSM 企业级应用
Author:SimpleWu
目前 Spring+SpringMVC+Mybatis 也算是一套非常流行的配套开发框架。
- spring 核心 ioc、aop 技术,ioc 解耦,使得代码复用,可维护性大幅度提升,aop 提供切面编程,同样的增强了生产力。提供了对其他优秀开源框架的集成支持
- spring mvc 是对比 struts2 等 mvc 框架来说的,不说 struts2 爆出的那么多安全漏洞,而且是类拦截,所有 Action 变量共享,同时是 filter 入口的,而 spring mvc 是方法拦截,controller 独享 request response 数据,采用的 serlvet 入口,与 spring 无缝对接。开发而言,spring mvc 更加轻量和低入门。
- mybatis 轻量级半自动化框架,sql 由开发者编写可对语句进行调优,并且 mybatis 使用 XML 方式 JAVA 代码与 SQL 可以解耦并且支持动态 SQL 语句,学习成本低。
框架搭建步骤#
导包#
- 导入 Spring+SpringMVC(如果不会选全倒进去就行了)
- 导入 mybatis 包(如果需要用到日志可将 mybatis 依赖包导入)
- 导入 mybatis-spring-1.3.1.jar(整合必须又这个包)
- 导入 c3p0(当然你也可以使用其他连接池)
- 导入数据库驱动
配置 log4j.properties#
由于 MyBatis 依赖与 log4j 输出 sql 语句信息,所以需要配置 log4j 配置文件。
#设置输出级别和输出位置
log4j.rootLogger=debug,Console
#设置控制台相关的参数
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
#设置 MyBatis 的输出内容
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
配置 WEB.xml#
1. 设置编码过滤器
<filter>
<description>字符集过滤器</description>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<description>字符集编码</description>
<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>
2. 添加 Spring 配置文件位置 (等下我们创建 spring-context.xml)
<!-- 配置加载 Spring-context 文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-context.xml</param-value>
</context-param>
<!-- 添加 Spring 的监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
3.DispatcherServlet 配置
<!-- SprigMVC 配置 -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<description>springmvc 配置文件</description>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
4. 添加 PUT DELETE 支持
<!-- 添加 PUT DELETE 支持 -->
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5. 配置 Sessin 过期时间
<!-- 配置 session 超时时间,单位分钟 -->
<session-config>
<session-timeout>15</session-timeout>
</session-config>
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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
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-4.2.xsd">
<!-- 让扫描 spring 扫描这个包下所有的类,让标注 spring 注解的类生效 -->
<context:component-scan base-package="com.simple.ssm.controller">
<!-- 只扫描 @Controller 与 @ControllerAdvice 修饰的类 -->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
<span class="hljs-comment"><!-- 加入静态资源与动态资源支持 --></span>
<span class="hljs-tag"><<span class="hljs-name">mvc:default-servlet-handler</span>/></span>
<span class="hljs-tag"><<span class="hljs-name">mvc:annotation-driven</span>/></span>
<span class="hljs-comment"><!-- 视图解析器 --></span>
<span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"org.springframework.web.servlet.view.InternalResourceViewResolver"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"prefix"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"/WEB-INF/views/"</span> /></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"suffix"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">".jsp"</span>></span><span class="hljs-tag"></<span class="hljs-name">property</span>></span>
<span class="hljs-tag"></<span class="hljs-name">bean</span>></span>
</beans>
spring-context.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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
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-4.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">
<span class="hljs-comment"><!--引入外部数据库连接信息文件--></span>
<span class="hljs-tag"><<span class="hljs-name">context:property-placeholder</span> <span class="hljs-attr">location</span>=<span class="hljs-string">"classpath:db.properties"</span> /></span>
<span class="hljs-comment"><!-- 扫描所有除@Controller ,@ControllerAdvice修饰的bean --></span>
<span class="hljs-tag"><<span class="hljs-name">context:component-scan</span> <span class="hljs-attr">base-package</span>=<span class="hljs-string">"com.simple.ssm"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">context:exclude-filter</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"annotation"</span>
<span class="hljs-attr">expression</span>=<span class="hljs-string">"org.springframework.stereotype.Controller"</span> /></span>
<span class="hljs-tag"><<span class="hljs-name">context:exclude-filter</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"annotation"</span>
<span class="hljs-attr">expression</span>=<span class="hljs-string">"org.springframework.web.bind.annotation.ControllerAdvice"</span> /></span>
<span class="hljs-tag"></<span class="hljs-name">context:component-scan</span>></span>
<span class="hljs-comment"><!-- 配置c3p0连接池 --></span>
<span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"dataSource"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"com.mchange.v2.c3p0.ComboPooledDataSource"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"driverClass"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"${mysql.driverClass}"</span> /></span>
<span class="hljs-comment"><!-- jdbc:mysql://localhost/mybatis?characterEncoding=utf8&amp;serverTimezone=UTC --></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"jdbcUrl"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"${mysql.jdbcUrl}"</span> /></span>
<span class="hljs-comment"><!-- 连接用户名 --></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"user"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"${mysql.user}"</span> /></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"password"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"${mysql.password}"</span> /></span>
<span class="hljs-comment"><!-- 连接密码 --></span>
<span class="hljs-comment"><!-- 队列中的最小连接数 --></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"minPoolSize"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"15"</span> /></span>
<span class="hljs-comment"><!-- 队列中的最大连接数 --></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"maxPoolSize"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"25"</span> /></span>
<span class="hljs-comment"><!-- 当连接耗尽时创建的连接数 --></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"acquireIncrement"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"15"</span> /></span>
<span class="hljs-comment"><!-- 等待时间 --></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"checkoutTimeout"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"10000"</span> /></span>
<span class="hljs-comment"><!-- 初始化连接数 --></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"initialPoolSize"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"20"</span> /></span>
<span class="hljs-comment"><!-- 最大空闲时间,超出时间连接将被丢弃 --></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"maxIdleTime"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"20"</span> /></span>
<span class="hljs-comment"><!-- 每隔60秒检测空闲连接 --></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"idleConnectionTestPeriod"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"60000"</span> /></span>
<span class="hljs-tag"></<span class="hljs-name">bean</span>></span>
<span class="hljs-comment"><!-- 配置事务管理器 --></span>
<span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"transactionManager"</span>
<span class="hljs-attr">class</span>=<span class="hljs-string">"org.springframework.jdbc.datasource.DataSourceTransactionManager"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"dataSource"</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"dataSource"</span> /></span>
<span class="hljs-tag"></<span class="hljs-name">bean</span>></span>
<span class="hljs-comment"><!-- 拦截器方式配置事物 --></span>
<span class="hljs-comment"><!--
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="remove*" propagation="REQUIRED" />
<tx:method name="find*" propagation="SUPPORTS" />
<tx:method name="load*" propagation="SUPPORTS" />
<tx:method name="search*" propagation="SUPPORTS" />
<tx:method name="*" propagation="SUPPORTS" />
</tx:attributes>
</tx:advice>
--></span>
<span class="hljs-comment"><!-- 配置切面 --></span>
<span class="hljs-comment"><!-- <aop:config> 事务入口(Service的包路径) <aop:pointcut id="transactionPointcut"
expression="execution(* com.simple.ssm.service.*.*(..))" /> 将事务通知与切入点组合 <aop:advisor
pointcut-ref="transactionPointcut" advice-ref="txAdvice" /> </aop:config> --></span>
<span class="hljs-comment"><!-- 使用注解来控制事务 --></span>
<span class="hljs-tag"><<span class="hljs-name">tx:annotation-driven</span> <span class="hljs-attr">transaction-manager</span>=<span class="hljs-string">"transactionManager"</span> /></span>
<span class="hljs-comment"><!-- 配置mybatis, 绑定c3p0 --></span>
<span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"sqlSessionFactory"</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"org.mybatis.spring.SqlSessionFactoryBean"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"dataSource"</span> <span class="hljs-attr">ref</span>=<span class="hljs-string">"dataSource"</span> /></span>
<span class="hljs-comment"><!-- 配置mybatis配置文件所在位置 --></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"configLocation"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"classpath:mybatis-config.xml"</span> /></span>
<span class="hljs-comment"><!-- 配置实体类XML映射所在位置 --></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"mapperLocations"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"classpath:com/simple/ssm/dao/mapper/*.xml"</span> /></span>
<span class="hljs-tag"></<span class="hljs-name">bean</span>></span>
<span class="hljs-comment"><!-- 扫描生成所有dao层 --></span>
<span class="hljs-tag"><<span class="hljs-name">bean</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"org.mybatis.spring.mapper.MapperScannerConfigurer"</span>></span>
<span class="hljs-comment"><!-- 指定持久化接口包位置 --></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"basePackage"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"com.simple.ssm.dao"</span>></span><span class="hljs-tag"></<span class="hljs-name">property</span>></span>
<span class="hljs-tag"><<span class="hljs-name">property</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"sqlSessionFactoryBeanName"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"sqlSessionFactory"</span>></span><span class="hljs-tag"></<span class="hljs-name">property</span>></span>
<span class="hljs-tag"></<span class="hljs-name">bean</span>></span>
</beans>
mybaits-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>
<settings>
<!-- 开启驼峰式命名规则 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>
<!-- 开启懒加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
<span class="hljs-tag"><<span class="hljs-name">typeAliases</span>></span>
<span class="hljs-tag"><<span class="hljs-name">package</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"com.simple.ssm.entitys"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">typeAliases</span>></span>
</configuration>
db.properties(可内置)#
mysql.driverClass=com.mysql.jdbc.Driver
mysql.jdbcUrl=jdbc:mysql://localhost/mybatis?characterEncoding=utf8&serverTimezone=UTC
mysql.user=root
mysql.password=root
到这里其实我们的 SSM 已经整合完成,如果我们需要其他功能可以在加,不要忘记导入包。