Spring+SpringMVC+MyBatis企业级应用

古老的 SSM 企业级应用

Author:SimpleWu

目前 Spring+SpringMVC+Mybatis 也算是一套非常流行的配套开发框架。

  1. spring 核心 ioc、aop 技术,ioc 解耦,使得代码复用,可维护性大幅度提升,aop 提供切面编程,同样的增强了生产力。提供了对其他优秀开源框架的集成支持
  2. spring mvc 是对比 struts2 等 mvc 框架来说的,不说 struts2 爆出的那么多安全漏洞,而且是类拦截,所有 Action 变量共享,同时是 filter 入口的,而 spring mvc 是方法拦截,controller 独享 request response 数据,采用的 serlvet 入口,与 spring 无缝对接。开发而言,spring mvc 更加轻量和低入门。
  3. mybatis 轻量级半自动化框架,sql 由开发者编写可对语句进行调优,并且 mybatis 使用 XML 方式 JAVA 代码与 SQL 可以解耦并且支持动态 SQL 语句,学习成本低。

框架搭建步骤#

导包#

  1. 导入 Spring+SpringMVC(如果不会选全倒进去就行了)
  2. 导入 mybatis 包(如果需要用到日志可将 mybatis 依赖包导入)
  3. 导入 mybatis-spring-1.3.1.jar(整合必须又这个包)
  4. 导入 c3p0(当然你也可以使用其他连接池)
  5. 导入数据库驱动

配置 log4j.properties#

由于 MyBatis 依赖与 log4j 输出 sql 语句信息,所以需要配置 log4j 配置文件。

Copy
#设置输出级别和输出位置 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. 设置编码过滤器

Copy
<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)

Copy
<!-- 配置加载 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 配置

Copy
<!-- 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 支持

Copy
<!-- 添加 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 过期时间

Copy
<!-- 配置 session 超时时间,单位分钟 --> <session-config> <session-timeout>15</session-timeout> </session-config>

spring-mvc.xml#

Copy
<?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">&lt;!-- 加入静态资源与动态资源支持 --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">mvc:default-servlet-handler</span>/&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">mvc:annotation-driven</span>/&gt;</span>

<span class="hljs-comment">&lt;!-- 视图解析器 --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">bean</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"org.springframework.web.servlet.view.InternalResourceViewResolver"</span>&gt;</span>
    <span class="hljs-tag">&lt;<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> /&gt;</span>
    <span class="hljs-tag">&lt;<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>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">property</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">bean</span>&gt;</span>

</beans>

spring-context.xml#

Copy
<?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">&lt;!--引入外部数据库连接信息文件--&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">context:property-placeholder</span> <span class="hljs-attr">location</span>=<span class="hljs-string">"classpath:db.properties"</span> /&gt;</span>

<span class="hljs-comment">&lt;!-- 扫描所有除@Controller ,@ControllerAdvice修饰的bean --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">context:component-scan</span> <span class="hljs-attr">base-package</span>=<span class="hljs-string">"com.simple.ssm"</span>&gt;</span>
	<span class="hljs-tag">&lt;<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> /&gt;</span>
	<span class="hljs-tag">&lt;<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> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">context:component-scan</span>&gt;</span>

<span class="hljs-comment">&lt;!-- 配置c3p0连接池 --&gt;</span>
<span class="hljs-tag">&lt;<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>&gt;</span>
	<span class="hljs-tag">&lt;<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> /&gt;</span>
	<span class="hljs-comment">&lt;!-- jdbc:mysql://localhost/mybatis?characterEncoding=utf8&amp;amp;serverTimezone=UTC --&gt;</span>
	<span class="hljs-tag">&lt;<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> /&gt;</span>
	<span class="hljs-comment">&lt;!-- 连接用户名 --&gt;</span>
	<span class="hljs-tag">&lt;<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> /&gt;</span>
	<span class="hljs-tag">&lt;<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> /&gt;</span>
	<span class="hljs-comment">&lt;!-- 连接密码 --&gt;</span>
	<span class="hljs-comment">&lt;!-- 队列中的最小连接数 --&gt;</span>
	<span class="hljs-tag">&lt;<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> /&gt;</span>
	<span class="hljs-comment">&lt;!-- 队列中的最大连接数 --&gt;</span>
	<span class="hljs-tag">&lt;<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> /&gt;</span>
	<span class="hljs-comment">&lt;!-- 当连接耗尽时创建的连接数 --&gt;</span>
	<span class="hljs-tag">&lt;<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> /&gt;</span>
	<span class="hljs-comment">&lt;!-- 等待时间 --&gt;</span>
	<span class="hljs-tag">&lt;<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> /&gt;</span>
	<span class="hljs-comment">&lt;!-- 初始化连接数 --&gt;</span>
	<span class="hljs-tag">&lt;<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> /&gt;</span>
	<span class="hljs-comment">&lt;!-- 最大空闲时间,超出时间连接将被丢弃 --&gt;</span>
	<span class="hljs-tag">&lt;<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> /&gt;</span>
	<span class="hljs-comment">&lt;!-- 每隔60秒检测空闲连接 --&gt;</span>
	<span class="hljs-tag">&lt;<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> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">bean</span>&gt;</span>

<span class="hljs-comment">&lt;!-- 配置事务管理器 --&gt;</span>
<span class="hljs-tag">&lt;<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>&gt;</span>
	<span class="hljs-tag">&lt;<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> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">bean</span>&gt;</span>

<span class="hljs-comment">&lt;!-- 拦截器方式配置事物 --&gt;</span>
<span class="hljs-comment">&lt;!-- 
	&lt;tx:advice id="txAdvice" transaction-manager="transactionManager"&gt;
		&lt;tx:attributes&gt;
			&lt;tx:method name="add*" propagation="REQUIRED" /&gt;
			&lt;tx:method name="insert*" propagation="REQUIRED" /&gt;
			&lt;tx:method name="save*" propagation="REQUIRED" /&gt;
			&lt;tx:method name="update*" propagation="REQUIRED" /&gt;
			&lt;tx:method name="delete*" propagation="REQUIRED" /&gt;
			&lt;tx:method name="remove*" propagation="REQUIRED" /&gt;
			&lt;tx:method name="find*" propagation="SUPPORTS" /&gt;
			&lt;tx:method name="load*" propagation="SUPPORTS" /&gt;
			&lt;tx:method name="search*" propagation="SUPPORTS" /&gt;
			&lt;tx:method name="*" propagation="SUPPORTS" /&gt;
		&lt;/tx:attributes&gt;
	&lt;/tx:advice&gt;
 --&gt;</span>

<span class="hljs-comment">&lt;!-- 配置切面 --&gt;</span>
<span class="hljs-comment">&lt;!-- &lt;aop:config&gt; 事务入口(Service的包路径) &lt;aop:pointcut id="transactionPointcut" 
	expression="execution(* com.simple.ssm.service.*.*(..))" /&gt; 将事务通知与切入点组合 &lt;aop:advisor 
	pointcut-ref="transactionPointcut" advice-ref="txAdvice" /&gt; &lt;/aop:config&gt; --&gt;</span>

<span class="hljs-comment">&lt;!-- 使用注解来控制事务 --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">tx:annotation-driven</span> <span class="hljs-attr">transaction-manager</span>=<span class="hljs-string">"transactionManager"</span> /&gt;</span>

<span class="hljs-comment">&lt;!-- 配置mybatis, 绑定c3p0 --&gt;</span>
<span class="hljs-tag">&lt;<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>&gt;</span>
	<span class="hljs-tag">&lt;<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> /&gt;</span>
	<span class="hljs-comment">&lt;!-- 配置mybatis配置文件所在位置 --&gt;</span>
	<span class="hljs-tag">&lt;<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> /&gt;</span>
	<span class="hljs-comment">&lt;!-- 配置实体类XML映射所在位置 --&gt;</span>
	<span class="hljs-tag">&lt;<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> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">bean</span>&gt;</span>

<span class="hljs-comment">&lt;!-- 扫描生成所有dao层 --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">bean</span> <span class="hljs-attr">class</span>=<span class="hljs-string">"org.mybatis.spring.mapper.MapperScannerConfigurer"</span>&gt;</span>
	<span class="hljs-comment">&lt;!-- 指定持久化接口包位置 --&gt;</span>
	<span class="hljs-tag">&lt;<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>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">property</span>&gt;</span>
	<span class="hljs-tag">&lt;<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>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">property</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">bean</span>&gt;</span>

</beans>

mybaits-config.xml#

Copy
<?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">&lt;<span class="hljs-name">typeAliases</span>&gt;</span>
	<span class="hljs-tag">&lt;<span class="hljs-name">package</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"com.simple.ssm.entitys"</span>/&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">typeAliases</span>&gt;</span>

</configuration>

db.properties(可内置)#

Copy
mysql.driverClass=com.mysql.jdbc.Driver mysql.jdbcUrl=jdbc:mysql://localhost/mybatis?characterEncoding=utf8&serverTimezone=UTC mysql.user=root mysql.password=root

到这里其实我们的 SSM 已经整合完成,如果我们需要其他功能可以在加,不要忘记导入包。