2017 最新 Spring+SpringMVC+MyBatis (SSM)框架整合

好久都没有搭建框架,最近写一个微信小程序,准备搭建一个轻量级框架做服务端。
之前公司用的ssh等,版本都比较老。准备搭建一个比较新一点的框架。过程中遇到很多问题所以在本文里详细说明一下。

我使用的是MyEclipse8.6\Mysql是5.1\操作系统是Win7.64\Jdk 1.7\Tomcat7.0

首先要说明一下就是包的准备。
我这里介绍一种方法就是创建一个Maven项目专门用来下载包,另外建一个项目作为搭建SSM的项目,这样只需要把包下载好就可以不用Maven项目,免得每次加载的时候building太慢。关于maven的安装和使用方式请自己查看有关maven教程此处就不再讲解。
这里需要注意一下原来的maven下载比较慢所以需要配置阿里云的maven镜像地址。在maven的安装目录下找到
maven\conf\settings.xml 里面找到<mirrors></mirrors>标签在里面添加以下代码:
  <!--*仓库阿里云镜像 --> 
<mirror>
      <id>alimaven</id>
      <name>aliyun maven</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
      <mirrorOf>central</mirrorOf>        
   </mirror>
然后在maven项目的pom.xml里配置对应的包 以下是pom.xml :

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org</groupId>
  <artifactId>wimdc</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>wimdc Maven Webapp</name>
  <url>http://maven.apache.org</url>
  
  <properties>
<!-- spring版本号 -->
<spring.version>4.2.0.RELEASE</spring.version>
<!-- mybatis版本号 -->
<mybatis.version>3.4.2</mybatis.version>
<!-- log4j日志文件管理包版本 -->
<slf4j.version>1.7.7</slf4j.version>
<log4j.version>1.2.17</log4j.version>
</properties>
  
  
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.9</version>
      <scope>test</scope>
    </dependency>
    
    <!-- spring核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- mybatis核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- mybatis/spring包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!-- 导入java ee jar 包 --> 
      <dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
     </dependency>
      <dependency>
      <groupId>org.apache.openejb</groupId>
      <artifactId>javaee-api</artifactId>
      <version>5.0-1</version>
      <scope>provided</scope>
      </dependency>
      <dependency>
      <groupId>javax.faces</groupId>
      <artifactId>jsf-api</artifactId>
      <version>1.2_04</version>
      <scope>provided</scope>
      </dependency>
      <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
      <scope>provided</scope>
      </dependency>
      <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
      <scope>provided</scope>
      </dependency>
      <dependency>
      <groupId>javax.faces</groupId>
      <artifactId>jsf-impl</artifactId>
      <version>1.2_04</version>
      <scope>provided</scope>
      </dependency>
      
      <!-- 导入Mysql数据库链接jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<!-- 导入dbcp的jar包,用来在applicationContext.xml中配置数据库 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<!-- JSTL标签类 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 日志文件管理包 -->
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- 格式化对象,方便输出日志 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.41</version>
</dependency>


<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<!-- 映入JSON -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.7</version>
</dependency>
<!-- 上传组件包 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
      
      
  </dependencies>
  <build>
    <finalName>wimdc</finalName>
  </build>
</project>

这里要说明一下。各个包对应的版本可以参考以下网址:
打开后可以看到mybatis-spring 1.3.0的包。兼容的对应mybatis为3.4.0 以及兼容的spring的包的对应版本。
如果你想尝试更高版本的包。你可以通过在此网站查询到兼容的包再进行搭建。免得搭建后不兼容导致很多异常。
2017 最新 Spring+SpringMVC+MyBatis (SSM)框架整合

先建立自己的mysql表。

/*==============================================================*/
/* Table: suser                                                 */
/*==============================================================*/
create table suser
(
   uid                  bigint(20) not null auto_increment comment '用户ID',
   uname                varchar(20)  comment '用户姓名',
   uwechat              varchar(100)  comment '用户微信号',
   uaccount             varchar(100)  comment '用户帐号',
   upassword            varchar(100)  comment '用户密码',
   ucardid              varchar(20)  comment '身份证号码',
   uphone               varchar(20)  comment '用户电话',
   uaddress             varchar(200)  comment '用户地址',
   ustate               varchar(2)  comment '用户状态',
   primary key (uid)
);

先建立 jdbc.properties :

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/wmdc?autoReconnect=true
jdbc.username=root
jdbc.password=root
#定义初始连接数
initialSize=0
#定义最大连接数
maxActive=20
#定义最大空闲
maxIdle=20
#定义最小空闲
minIdle=1
#定义最长等待时间
maxWait=1


然后建立实体类、mapper和对应xml,为了方便我下载了mybatis-generator-core-1.3.2.jar包自动生成
然后需要创建配置文件:mbgConfiguration.xml 当然名字可以自己命名:



<?xml version="1.0" encoding="utf-8"?>  
<!DOCTYPE generatorConfiguration  
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"  
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">  
  
<generatorConfiguration>  
    <properties resource="jdbc.properties" />  
    <context id="sqlserverTables" targetRuntime="MyBatis3">  
        <!-- 生成的pojo,将implements Serializable-->  
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>  
        <commentGenerator>  
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->  
            <property name="suppressAllComments" value="true" />  
        </commentGenerator>  
  
        <!-- 数据库链接URL、用户名、密码 -->  
        <jdbcConnection driverClass="${jdbc.driver}"  
                        connectionURL="${jdbc.url}"  
                        userId="${jdbc.username}"  
                        password="${jdbc.password}">  
        </jdbcConnection>  
  
        <!--    
        默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer  
            true,把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal    
        -->  
        <javaTypeResolver>  
            <property name="forceBigDecimals" value="false" />  
        </javaTypeResolver>  
  
        <!--   
        生成model模型,对应的包路径,以及文件存放路径(targetProject),targetProject可以指定具体的路径,如./src/main/java,  
        也可以使用“MAVEN”来自动生成,这样生成的代码会在target/generatord-source目录下  
        -->  
        <!--<javaModelGenerator targetPackage="com.joey.mybaties.test.pojo" targetProject="MAVEN">-->  
        <javaModelGenerator targetPackage="wmdc.base.entity" targetProject="./src">  
            <property name="enableSubPackages" value="true"/>  
            <!-- 从数据库返回的值被清理前后的空格  -->  
            <property name="trimStrings" value="true" />  
        </javaModelGenerator>  
  
        <!--对应的mapper.xml文件  -->  
        <sqlMapGenerator targetPackage="wmdc.base.dao" targetProject="./src">  
            <property name="enableSubPackages" value="true"/>  
        </sqlMapGenerator>  
  
        <!-- 对应的Mapper接口类文件 -->  
        <javaClientGenerator type="XMLMAPPER" targetPackage="wmdc.base.dao" targetProject="./src">  
            <property name="enableSubPackages" value="true"/>  
        </javaClientGenerator>  
  
  
        <!-- 列出要生成代码的所有表,这里配置的是不生成Example文件 -->  
        <table tableName="suser" domainObjectName="SUser"  
               enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"  
               enableSelectByExample="false" selectByExampleQueryId="false" >  
            <property name="useActualColumnNames" value="false"/>  
        </table>   

    </context>  
</generatorConfiguration>    

然后后建立GenMain.java进行生成

package wmdc.base.util; 

import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.exception.InvalidConfigurationException;
import org.mybatis.generator.exception.XMLParserException;
import org.mybatis.generator.internal.DefaultShellCallback;
 

public class GenMain {
    public static void main(String[] args) {
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        String genCfg = "D:/Workspaces/MyEclipse 8.6/wmdc/WebRoot/WEB-INF/classes/mbgConfiguration.xml";
        File configFile = new File(genCfg);
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = null;
        try {
            config = cp.parseConfiguration(configFile);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XMLParserException e) {
            e.printStackTrace();
        }
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = null;
        try {
            myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        } catch (InvalidConfigurationException e) {
            e.printStackTrace();
        }
        try {
            myBatisGenerator.generate(null);
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

代码生成成功后可以看到SUser.java SUserMapper.java SUserMapper.xml 都生成好了

然后再创建ISUserService接口类

package wmdc.base.service;
 

import java.util.List;
 
import wmdc.base.entity.SUser;


public interface ISUserService {
 
 public SUser selectByPrimaryKey(Long uid); 
 
}

service实现类SUserServiceImpl

package wmdc.base.service.impl;
 

import java.util.List;

import javax.annotation.Resource;
 
import org.springframework.stereotype.Service;



import wmdc.base.dao.SUserMapper;
import wmdc.base.entity.SUser;
import wmdc.base.service.ISUserService;



@Service("suserService")
public class SUserServiceImpl implements ISUserService  {

@Resource
private SUserMapper userDao;
 

@Override
public SUser selectByPrimaryKey(Long uid) { 
return userDao.selectByPrimaryKey(uid);
}

再建立控制器类

@Controller 
public class SUserController {
@Autowired
    private ISUserService suserService;

public ISUserService getSuserService() {
return suserService;
}
@Autowired
public void setSuserService(ISUserService suserService) {
this.suserService = suserService;
}

@RequestMapping("getSUserInfobyID")
public String getSUserInfobyID(HttpServletRequest request){
try {
List<SUser> list = new ArrayList<SUser>();
list.add(suserService.selectByPrimaryKey(Long.valueOf("1"))); 
System.out.println(list);
request.setAttribute("addLists", list);
return "listAll";
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("InfoMessage", "信息载入失败!具体异常信息:" + e.getMessage());
return "result";
}
}
 
}


最后配置spring   先建立spring-mybatis.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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
                        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd  
                        http://www.springframework.org/schema/context  
                        http://www.springframework.org/schema/context/spring-context-4.2.xsd  
                        http://www.springframework.org/schema/mvc  
                        http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
<!-- 自动扫描 -->
<context:component-scan base-package="wmdc.base" />  
<!-- 引入配置文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties" />
<!-- <properties resource="jdbc.properties"></properties>-->
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<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="initialSize" value="${initialSize}"></property>
<!-- 连接池最大数量 -->
<property name="maxActive" value="${maxActive}"></property>
<!-- 连接池最大空闲 -->
<property name="maxIdle" value="${maxIdle}"></property>
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${minIdle}"></property>
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="${maxWait}"></property>
</bean>

<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:wmdc/base/dao/*.xml"></property>
</bean>

<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="wmdc.base.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>

<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

</beans>

再创建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:p="http://www.springframework.org/schema/p"  
     xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans    
                        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd    
                        http://www.springframework.org/schema/context    
                        http://www.springframework.org/schema/context/spring-context-4.2.xsd    
                        http://www.springframework.org/schema/mvc    
                        http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">  
<!-- 自动扫描该包,使SpringMVC认为包下用了@controller注解的类是控制器 -->
<context:component-scan base-package="wmdc.base.controller" />
<!--避免IE执行AJAX时,返回JSON出现下载文件 -->
<bean id="mappingJacksonHttpMessageConverter"
 class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" >
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 -->
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="mappingJacksonHttpMessageConverter" /><!-- JSON转换器 -->
</list>
</property>
</bean>
<!-- 定义跳转的文件的前后缀 ,视图模式配置-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 -->
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 -->
<bean id="multipartResolver"  
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
        <!-- 默认编码 -->
        <property name="defaultEncoding" value="utf-8" />  
        <!-- 文件大小最大值 -->
        <property name="maxUploadSize" value="10485760000" />  
        <!-- 内存中的最大值 -->
        <property name="maxInMemorySize" value="40960" />  
    </bean>  
</beans>

最后再修改web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<display-name>Archetype Created Web Application</display-name>
<!-- Spring和mybatis的配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mybatis.xml</param-value>
</context-param>
<!-- 编码过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<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>
<!-- Spring监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 防止Spring内存溢出监听器 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>

<!-- Spring MVC servlet -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!-- 此处可以可以配置成*.do,对应struts的后缀习惯 -->
<url-pattern>*.do</url-pattern>
</servlet-mapping> 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

此时需要测试建立jsp测试一下搭建是否正常

index.jsp

<body>
     <a href="getSUserInfobyID.do">查看一条数据</a> 
     <a href="getSUserAll.do">查看全部数据</a>
 </body>

listAll.jsp

  <body>
    所有结果<br/>
    <table border="1">
     <tr>
     <td>编号</td>
     <td>用户名</td>
     <td>密码</td>
     <td>操作</td>
     </tr>
     <c:forEach var="list"  items="${addLists}">
     <tr> 
     <td>${list.uname}</td>
     <td>${list.uaccount}</td> 
     </tr>
     </c:forEach> 
    </table>
  </body>


然后在数据插入一条数据后在浏览器打开
2017 最新 Spring+SpringMVC+MyBatis (SSM)框架整合
点击查看一条数据

2017 最新 Spring+SpringMVC+MyBatis (SSM)框架整合
至此整个项目搭建成功。