Maven+Spring+SpringMVC+MyBatis框架的搭建

4 篇文章 0 订阅
3 篇文章 0 订阅



1、操作系统:windows7 
2、开发软件:Eclipse JavaEE Luna版本 
3、数据库MySQL,数据库管理可以使用Navicat,破解版的很容易下到,另外需要下载一个MyBatis-generator,主要是可以通过数据库的表反向生成实体类Java文件,mapper.xml文件还有对应的Dao层接口对应的Java文件,可以到我的网盘下载:http://pan.baidu.com/s/1boW1MBt 
4、服务器:Tomcat7.0+ 
5、JDK版本:1.7+ 
6、Maven插件:根据自己习惯,选择是使用Eclipse内置的Maven还是自己重新下载Maven插件包进行集成 
7、properties文件插件:主要为了防止properties文件中出现unicode的乱码,properties直接用这个插件进行编辑,也可以到我的网盘下载:http://pan.baidu.com/s/1kVq4poz下载后直接按照一般插件包的安装方式进行安装就可以了。

下面先给出我的pom.xml文件中依赖的jar包,估计下载jar要用很长时间O(∩_∩)O~,今天不早了,明天正式开始搭建。

[xml]  view plain  copy
 print ?
  1. <properties>  
  2.         <!-- spring版本号 -->  
  3.         <spring.version>4.2.5.RELEASE</spring.version>  
  4.         <!-- mybatis版本号 -->  
  5.         <mybatis.version>3.3.1</mybatis.version>  
  6.         <!-- springmybatis版本号 -->  
  7.         <springMybatis.version>1.2.2</springMybatis.version>  
  8.         <!-- mysql版本号 -->  
  9.         <mysql.version>5.1.38</mysql.version>  
  10.         <!-- druid 版本 -->  
  11.         <druid.version>1.0.18</druid.version>  
  12.         <!-- log4j日志管理包版本 -->  
  13.         <log4j.version>1.2.17</log4j.version>  
  14.         <!-- fastjson版本号 -->  
  15.         <fastjson.version>1.2.8</fastjson.version>  
  16.         <!-- jaksonMapper版本号 -->  
  17.         <jacksonMapper.version>1.9.13</jacksonMapper.version>  
  18.         <!-- commonsFileupload版本号 -->  
  19.     <commonsFileupload.version>1.3.1</commonsFileupload.version>  
  20.         <!-- commonsio版本号 -->  
  21.         <commonsio.version>2.4</commonsio.version>  
  22.         <!-- commoncodec版本号 -->  
  23.         <commonscodec.version>1.10</commonscodec.version>  
  24.         <!-- 提供封装好的字符串,集合等操作的工具类 -->  
  25.         <commonsLang.verison>2.6</commonsLang.verison>  
  26.         <!-- jackson-core版本号 -->  
  27.         <jacksonCore.version>2.7.3</jacksonCore.version>  
  28.         <!-- jackson-databind版本号 -->  
  29.         <jacksonDataBind.version>2.7.3</jacksonDataBind.version>  
  30.         <!-- aspectj版本号 -->  
  31.         <aspectj.version>1.7.2</aspectj.version>  
  32.         <!-- junit版本号 -->  
  33.         <junit.version>4.11</junit.version>  
  34. </properties>  
  35.   
  36. <dependencies>  
  37.         <!-- junit 相关jar包 start -->  
  38.         <dependency>  
  39.             <groupId>junit</groupId>  
  40.             <artifactId>junit</artifactId>  
  41.             <version>${junit.version}</version>  
  42.             <!-- 表示开发的时候引入,发布的时候不会加载此包 -->  
  43.             <scope>test</scope>  
  44.         </dependency>  
  45.         <!-- junit 相关jar包 end -->  
  46.   
  47.         <!-- spring核心包 start -->  
  48.         <dependency>  
  49.             <groupId>org.springframework</groupId>  
  50.             <artifactId>spring-core</artifactId>  
  51.             <version>${spring.version}</version>  
  52.         </dependency>  
  53.         <dependency>  
  54.             <groupId>org.springframework</groupId>  
  55.             <artifactId>spring-web</artifactId>  
  56.             <version>${spring.version}</version>  
  57.         </dependency>  
  58.         <dependency>  
  59.             <groupId>org.springframework</groupId>  
  60.             <artifactId>spring-oxm</artifactId>  
  61.             <version>${spring.version}</version>  
  62.         </dependency>  
  63.         <dependency>  
  64.             <groupId>org.springframework</groupId>  
  65.             <artifactId>spring-tx</artifactId>  
  66.             <version>${spring.version}</version>  
  67.         </dependency>  
  68.         <dependency>  
  69.             <groupId>org.springframework</groupId>  
  70.             <artifactId>spring-jdbc</artifactId>  
  71.             <version>${spring.version}</version>  
  72.         </dependency>  
  73.         <dependency>  
  74.             <groupId>org.springframework</groupId>  
  75.             <artifactId>spring-webmvc</artifactId>  
  76.             <version>${spring.version}</version>  
  77.         </dependency>  
  78.         <dependency>  
  79.             <groupId>org.springframework</groupId>  
  80.             <artifactId>spring-aop</artifactId>  
  81.             <version>${spring.version}</version>  
  82.         </dependency>  
  83.         <dependency>  
  84.             <groupId>org.springframework</groupId>  
  85.             <artifactId>spring-context-support</artifactId>  
  86.             <version>${spring.version}</version>  
  87.         </dependency>  
  88.         <dependency>  
  89.             <groupId>org.springframework</groupId>  
  90.             <artifactId>spring-test</artifactId>  
  91.             <version>${spring.version}</version>  
  92.         </dependency>  
  93.         <!-- spring核心包 end -->  
  94.   
  95.         <!-- aspectj切面jar start -->  
  96.         <dependency>  
  97.             <groupId>org.aspectj</groupId>  
  98.             <artifactId>aspectjweaver</artifactId>  
  99.             <version>${aspectj.version}</version>  
  100.         </dependency>  
  101.         <!-- aspectj切面jar end -->  
  102.   
  103.         <!-- mybatis核心包 start -->  
  104.         <dependency>  
  105.             <groupId>org.mybatis</groupId>  
  106.             <artifactId>mybatis</artifactId>  
  107.             <version>${mybatis.version}</version>  
  108.         </dependency>  
  109.         <!-- mybatis核心包 end -->  
  110.   
  111.         <!-- springMybatis包 start -->  
  112.         <dependency>  
  113.             <groupId>org.mybatis</groupId>  
  114.             <artifactId>mybatis-spring</artifactId>  
  115.             <version>${springMybatis.version}</version>  
  116.         </dependency>  
  117.         <!-- springMybatis包 end -->  
  118.   
  119.         <!-- mysql数据库驱动jar包 start -->  
  120.         <dependency>  
  121.             <groupId>mysql</groupId>  
  122.             <artifactId>mysql-connector-java</artifactId>  
  123.             <version>${mysql.version}</version>  
  124.         </dependency>  
  125.         <!-- mysql数据库驱动jar包 end -->  
  126.   
  127.         <!--alibaba数据源 start -->  
  128.         <dependency>  
  129.             <groupId>com.alibaba</groupId>  
  130.             <artifactId>druid</artifactId>  
  131.             <version>${druid.version}</version>  
  132.         </dependency>  
  133.         <!-- alibaba数据源 end -->  
  134.   
  135.         <!-- log4j 日志管理包 start -->  
  136.         <dependency>  
  137.             <groupId>log4j</groupId>  
  138.             <artifactId>log4j</artifactId>  
  139.             <version>${log4j.version}</version>  
  140.         </dependency>  
  141.         <!-- log4j 日志管理包 end -->  
  142.   
  143.         <!-- fastjson start -->  
  144.         <dependency>  
  145.             <groupId>com.alibaba</groupId>  
  146.             <artifactId>fastjson</artifactId>  
  147.             <version>${fastjson.version}</version>  
  148.         </dependency>  
  149.         <!-- fastjson end -->  
  150.   
  151.         <!-- json映射包 start -->  
  152.         <dependency>  
  153.             <groupId>org.codehaus.jackson</groupId>  
  154.             <artifactId>jackson-mapper-asl</artifactId>  
  155.             <version>${jaksonMapper.version}</version>  
  156.         </dependency>  
  157.         <!-- json映射包 end -->  
  158.   
  159.         <!-- 解析json用,spring-mvc.xml中的conveter依赖于此 -->  
  160.         <dependency>  
  161.             <groupId>com.fasterxml.jackson.core</groupId>  
  162.             <artifactId>jackson-core</artifactId>  
  163.             <version>${jacksonCore.version}</version>  
  164.         </dependency>  
  165.         <dependency>  
  166.             <groupId>com.fasterxml.jackson.core</groupId>  
  167.             <artifactId>jackson-databind</artifactId>  
  168.             <version>${jacksonDataBind.version}</version>  
  169.         </dependency>  
  170.         <!-- 解析json用,spring-mvc.xml中的conveter依赖于此 -->  
  171.   
  172.         <!-- 文件上传相关包 start -->  
  173.         <dependency>  
  174.             <groupId>commons-fileupload</groupId>  
  175.             <artifactId>commons-fileupload</artifactId>  
  176.             <version>${commonsFileupload.version}</version>  
  177.         </dependency>  
  178.         <dependency>  
  179.             <groupId>commons-io</groupId>  
  180.             <artifactId>commons-io</artifactId>  
  181.             <version>${commonsio.version}</version>  
  182.         </dependency>  
  183.         <dependency>  
  184.             <groupId>commons-codec</groupId>  
  185.             <artifactId>commons-codec</artifactId>  
  186.             <version>${commonscodec.version}</version>  
  187.         </dependency>  
  188.         <!-- 文件上传相关包 end -->  
  189.   
  190.         <!-- 提供封装好的字符串,集合等操作的工具类 start -->  
  191.         <dependency>  
  192.             <groupId>commons-lang</groupId>  
  193.             <artifactId>commons-lang</artifactId>  
  194.             <version>${commonsLang.verison}</version>  
  195.         </dependency>  
  196.         <!-- 提供封装好的字符串,集合等操作的工具类 end -->  
  197. </dependencies>  

现在开始正式搭建,首先构建如下的包结构 
这里写图片描述 
src/main/Java下面的包: 
com.sdusz.framework.ssm.constant-一些定义的常量的类,反向生成得到 
com.sdusz.framework.ssm.controller-控制器 
com.sdusz.framework.ssm.entity-与数据库表对应的实体类 
com.sdusz.framework.ssm.exception-自定义异常 
com.sdusz.framework.ssm.filter-自定义过滤器 
com.sdusz.framework.ssm.inteceptor-自定义拦截器 
com.sdusz.framework.ssm.listener-自定义监听器 
com.sdusz.framework.ssm.mapper-mybatis的dao接口层,反向生成得到 
com.sdusz.framework.ssm.model-一些入参和出参对应的值对象 
com.sdusz.framework.ssm.service-service层 
com.sdusz.framework.ssm.serviceImpl-service实现层 
com.sdusz.framework.ssm.task-定时任务相关类,可以先不建(以后再讲) 
com.sdusz.framework.ssm.util-自定义工具类,方便个性化操作

src/main/resources下面的文件夹: 
config-一些配置参数对应的文件 
i18n-服务端国际化对应的properties文件 
mybatis-myBatis中的.xml文件,反向生成得到 
spring-spring配置文件,包括一些与spring集成的其他框架的配置文件 
mybatis-generator-core-1.3.2-反向生成用的工具包,可以不放

集成SpringMVC

1、在spring文件夹下建立这两个文件 
这里写图片描述 
spring-context.xml 就是spring容器上下文对应的配置文件,也是AOP,DI,IOC的核心文件。 
spring-mvc.xml主要是就是对应了dispatcherServlet的定义,包括数据到Controller层,以及从Controller返回时的Converter。 
spring-context.xml现在内容如下,现在可以什么bean和aop的定义都不写,但是一定要有这么一个结构,否则等下服务启动是会报错的,因为启动时会将配置文件中的<beans></beans>之间定义的bean进行解析,加载到BeanFactory中去,如果没有这个beans节点,无法解析,就会报错。

[xml]  view plain  copy
 print ?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"  
  4.     xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"  
  5.     xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"  
  6.     xsi:schemaLocation="  
  7.     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd  
  8.     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd  
  9.     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd  
  10.     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd  
  11.     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">  
  12.   
  13. </beans>  

spring-mvc.xml内容如下,

[xml]  view plain  copy
 print ?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd  
  7.                         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd  
  8.                         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd  
  9.                         http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd  
  10.                         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">  
  11.   
  12.     <!-- MVC注解扫描start -->  
  13.     <mvc:annotation-driven>  
  14.         <mvc:message-converters>  
  15.             <!--避免IE执行AJAX时,返回JSON出现下载文件 start-->    
  16.             <bean id="mappingJacksonHttpMessageConverter"  class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">    
  17.                 <property name="supportedMediaTypes">    
  18.                     <list>    
  19.                        <value>application/json;charset=UTF-8</value>                    
  20.                     </list>    
  21.                 </property>    
  22.             </bean>    
  23.             <bean id="StringHttpMessageConverter"  class="org.springframework.http.converter.StringHttpMessageConverter">    
  24.                 <property name="supportedMediaTypes">    
  25.                     <list>    
  26.                         <value>text/html;charset=UTF-8</value>    
  27.                     </list>    
  28.                 </property>    
  29.             </bean>  
  30.             <!--避免IE执行AJAX时,返回JSON出现下载文件 end-->    
  31.         </mvc:message-converters>  
  32.     </mvc:annotation-driven>      
  33.     <!-- MVC注解扫描end -->  
  34.   
  35.     <!-- 扫描controller包 start -->  
  36.     <context:component-scan base-package="com.sdusz.framework.ssm" use-default-filters="false">  
  37.         <context:include-filter type="regex" expression="com.sdusz.framework.ssm.controller.*" />  
  38.     </context:component-scan>  
  39.     <!-- 扫描controller包 end -->  
  40.   
  41.     <!-- 使用默认servlet的处理方式处理MVC start -->  
  42.     <mvc:default-servlet-handler />  
  43.     <!-- 使用默认servlet的处理方式处理MVC end -->  
  44.   
  45.     <!-- 使用CGLib动态代理技术植入增强 start -->  
  46.     <aop:aspectj-autoproxy proxy-target-class="true" />  
  47.     <!-- 使用CGLib动态代理技术植入增强 end -->  
  48. </beans>  

web.xml中添加如下配置,其中: 
contextConfigLocation为类路径下的,也就是src/main/resurces下的spring/spring-context.xml文件,不配置将会默认去找WEB-INF下的applicationContext.xrnl 文件,找不到就会报错,log4j配置文件的位置同理,这里就不给出log4j的具体配置了,因为因项目而异,配置没有通用性。

[xml]  view plain  copy
 print ?
  1. <!-- 首页 start -->  
  2. <welcome-file-list>  
  3.     <welcome-file>index.html</welcome-file>  
  4. </welcome-file-list>  
  5. <!-- 首页 end -->  
  6.   
  7. <!-- 上下文初始化参数 start -->  
  8. <context-param>  
  9.     <param-name>contextConfigLocation</param-name>  
  10.     <param-value>classpath:spring/spring-context.xml</param-value>  
  11. </context-param>  
  12. <!-- 上下文初始化参数 end -->  
  13.   
  14. <!-- log4j配置文件路径 start -->  
  15. <context-param>  
  16.     <param-name>log4jConfigLocation</param-name>  
  17.     <param-value>classpath:config/log4j.properties</param-value>  
  18. </context-param>  
  19. <!-- log4j配置文件路径 end -->  
  20.   
  21. <!-- log4j刷新周期 start -->  
  22. <context-param>  
  23.     <param-name>log4jRefreshInterval</param-name>  
  24.     <param-value>600000</param-value>  
  25. </context-param>  
  26. <!-- log4j刷新周期 end -->  
  27.   
  28. <!-- 项目根目录名称 start -->  
  29. <context-param>  
  30.     <param-name>webAppRootKey</param-name>  
  31.     <param-value>ssm.root</param-value>  
  32. </context-param>  
  33. <!-- 项目根目录名称 end -->  
  34.   
  35. <!-- spring全站编码过滤器 start -->  
  36. <filter>  
  37.     <filter-name>encodingFilter</filter-name>  
  38.     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
  39.     <async-supported>true</async-supported>  
  40.     <init-param>  
  41.         <param-name>encoding</param-name>  
  42.         <param-value>UTF-8</param-value>  
  43.     </init-param>  
  44.     <init-param>  
  45.         <param-name>forceEncoding</param-name>  
  46.         <param-value>true</param-value>  
  47.     </init-param>  
  48. </filter>  
  49. <filter-mapping>  
  50.     <filter-name>encodingFilter</filter-name>  
  51.     <url-pattern>/*</url-pattern>  
  52. </filter-mapping>  
  53. <!-- spring全站编码过滤器 end -->  
  54. <!-- log4j监听器 start -->  
  55. <listener>  
  56.     <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>  
  57. </listener>  
  58. <!-- log4j监听器 end -->  
  59.   
  60. <!-- Spring上下文初始化监听器 start -->  
  61. <listener>  
  62.     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  63. </listener>  
  64. <!-- Spring上下文初始化监听器 end -->  
  65.   
  66. <!-- 防止Spring内存溢出监听器 start -->  
  67. <listener>  
  68.     <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>  
  69. </listener>  
  70. <!-- 防止Spring内存溢出监听器 end -->  
  71. <!-- SpringMVC servlet start -->  
  72. <servlet>  
  73.     <servlet-name>SpringMVC</servlet-name>  
  74.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  75.     <init-param>  
  76.         <param-name>contextConfigLocation</param-name>  
  77.         <param-value>classpath:spring/spring-mvc.xml</param-value>  
  78.     </init-param>  
  79.     <load-on-startup>2</load-on-startup>  
  80.     <async-supported>true</async-supported>  
  81. </servlet>  
  82. <servlet-mapping>  
  83.     <servlet-name>SpringMVC</servlet-name>  
  84.     <url-pattern>/interfaces/*</url-pattern>  
  85. </servlet-mapping>  
  86. <!-- SpringMVC servlet end -->  
  87. <!-- session过期时间 start -->  
  88. <session-config>  
  89.     <session-timeout>30</session-timeout>  
  90. </session-config>  
  91. <!-- session过期时间 end -->  

在com.sdusz.framework.ssm.controller包下添加一个测试TestController.java

[java]  view plain  copy
 print ?
  1. @Controller  
  2. @RequestMapping("test")  
  3. public class TestController {  
  4.     /** 
  5.      * 方法描述: 返回单个字符串 
  6.      * 初始作者: shenmengqi 
  7.      * 创建日期: 2016年3月18日-上午9:22:08 
  8.      * 开始版本: 2.0.0 
  9.      * ================================================= 
  10.      * 修改记录: 
  11.      * 修改作者 日期 修改内容 
  12.      * ================================================ 
  13.      * 
  14.      * @return 
  15.      *         String 返回的字符串 
  16.      */  
  17.     @RequestMapping("/m001")  
  18.     @ResponseBody  
  19.     public String getString() {  
  20.   
  21.         return "hello,这只是一个字符串!";  
  22.     }  
  23.     /** 
  24.      * 方法描述: 返回map对象 
  25.      * 初始作者: shenmengqi 
  26.      * 创建日期: 2016年3月18日-上午9:21:37 
  27.      * 开始版本: 2.0.0 
  28.      * ================================================= 
  29.      * 修改记录: 
  30.      * 修改作者 日期 修改内容 
  31.      * ================================================ 
  32.      * 
  33.      * @return 
  34.      *         Map<String,String> 返回的map对象 
  35.      */  
  36.     @RequestMapping("/m002")  
  37.     @ResponseBody  
  38.     public Map<String, String> getJSON() {  
  39.   
  40.         Map<String, String> data = new HashMap<String, String>();  
  41.         data.put("id""001");  
  42.         data.put("name""张三");  
  43.         return data;  
  44.     }  
  45. }  
  46.     /** 
  47.      * 方法描述: 访问restful接口并将参数作为结果返回 
  48.      * 初始作者: shenmengqi 
  49.      * 创建日期: 2016年3月18日-上午9:22:40 
  50.      * 开始版本: 2.0.0 
  51.      * ================================================= 
  52.      * 修改记录: 
  53.      * 修改作者 日期 修改内容 
  54.      * ================================================ 
  55.      * 
  56.      * @param clientType 
  57.      *            对应{clientType} 
  58.      * @param loginId 
  59.      *            对应{loginId} 
  60.      * @param userType 
  61.      *            对应{userType} 
  62.      * @return 
  63.      *         Map<String,String> 参数组装出的map对象 
  64.      */  
  65.     @RequestMapping("/{clientType}/{loginId}/{userType}/m003")  
  66.     @ResponseBody  
  67.     public Map<String, String> testRestful(@PathVariable String clientType, @PathVariable String loginId,  
  68.             @PathVariable String userType) {  
  69.   
  70.         Map<String, String> data = new HashMap<String, String>();  
  71.         data.put("clientType", clientType);  
  72.         data.put("loginid", loginId);  
  73.         data.put("userType", userType);  
  74.         return data;  
  75.     }  
  76.         /** 
  77.      * 方法描述: 测试将model转为json传到前台</br> 
  78.      * 初始作者: shenmengqi 
  79.      * 创建日期: 2016年3月28日-下午10:12:47 
  80.      * 开始版本: 2.0.0 
  81.      * ================================================= 
  82.      * 修改记录: 
  83.      * 修改作者 日期 修改内容 
  84.      * ================================================ 
  85.      * 
  86.      * @param models 
  87.      *            传入model 
  88.      * @return 
  89.      *         Object json对象 
  90.      */  
  91.     @RequestMapping("/m005")  
  92.     @ResponseBody  
  93.     public Object testParamList(@RequestBody List<VoModel> models) {  
  94.   
  95.         return JSON.toJSON(models);  
  96.     }  

这里边的接口的返回值类型任意,另外方法上需要加上@ResponseBody注解,由于在spring-mvc.xml中配置了Converter,其实最终返回给前台的结果都是json对象,contentType就是application/json;charset=utf-8,但是如果要从前台传入VO就必须将对象用JSON.stringify()进行转换,类前面要加@Controller注解。上面接口的访问路径依次为: 
1.http://ip:port/工程名/interfaces/test/m001 
参数:无 
请求类型:任意 
结果:hello,这只是一个字符串! 
2.http://ip:port/工程名/interfaces/test/m002 
参数:无 
请求类型:任意 
结果:{“name”:”张三”,”id”:”001”} 
3.http://ip:port/工程名/interfaces/test/1/2/3/m003 
参数:无 
请求类型:任意 
结果:{“clientType”:”1”,”loginid”:”2”,”userType”:”3”} 
4.http://ip:port/工程名/interfaces/test/m005 
参数:参数的结构要与@RequestBody的结构一致,key必须与javabean的属性对应,

[{
"id":"001",
"name":"name"
}]

请求类型:POST 
结果:

[
    {
        "name": "name",
        "id": "001",
        "voModel2": null,
        "email": null
    }
]

如果上述几个接口都可以调用成功,且没有乱码出现,那么Spring与SpringMVC就已经整合成功了!

之前spring和SpringMVC已经整合成功了,现在开始整合MyBatis。 
先在数据库中创建emp表:

[sql]  view plain  copy
 print ?
  1. DROP TABLE IF EXISTS `emp`;  
  2. CREATE TABLE `emp` (  
  3.   `id` varchar(64) NOT NULL,  
  4.   `namevarchar(100) NOT NULL,  
  5.   `age` int(11) DEFAULT NULL,  
  6.   `gender` int(11) DEFAULT NULL,  
  7.   `birthday` datetime DEFAULT NULL,  
  8.   `hiredate` datetime DEFAULT NULL,  
  9.   `job` varchar(10) DEFAULT NULL,  
  10.   `hobbies` varchar(200) DEFAULT NULL,  
  11.   PRIMARY KEY (`id`)  
  12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  

在之前的spring-context.xml开始添加配置 
1、配置注解扫描,扫描service包下的注解,主要是为了之后可以将@Service注解的类注入到Controller层进行使用

[xml]  view plain  copy
 print ?
  1. <!-- 开启注解扫描 start -->  
  2. <context:annotation-config />     
  3. <context:component-scan base-package="com.sdusz.framework.ssm" use-default-filters="false">  
  4.     <context:include-filter type="regex" expression="com.sdusz.framework.ssm.service*.*" />  
  5. </context:component-scan>  
  6. <!-- 开启注解扫描 end -->  

2、配置读取properties的bean,读取到的所有properties配置文件中的所有键值对,之后要用到其中的值只需要${key}即可使用

[xml]  view plain  copy
 print ?
  1. <!-- 加载properties配置文件 start -->  
  2. <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  3.     <property name="locations">  
  4.         <list>  
  5.             <value>classpath:config/jdbc.properties</value>  
  6.         </list>  
  7.     </property>  
  8.     <!-- <property name="ignoreUnresolvablePlaceholders" value="true" /> -->  
  9. </bean>  
  10. <!-- 加载properties配置文件 end -->  

3、配置数据源:这里我选择使用阿里的druid数据源,第一安全性高,第二异常的处理比其他数据源更为强大,第三由于阿里公司的业务偏向大数据,数据源设计自然也吸取了大数据高并发的一些理念进行设计,而且经过前人实践证明,执行效率确实是目前主流数据源中最高的。

[xml]  view plain  copy
 print ?
  1. <!-- 配置druid数据源 start -->  
  2.     <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">  
  3.         <property name="url" value="${jdbc.url}" />  
  4.         <property name="username" value="${jdbc.username}" />  
  5.         <property name="password" value="${jdbc.password}" />  
  6.         <property name="driverClassName" value="${jdbc.driverClassName}" />  
  7.         <property name="filters" value="${jdbc.filters}" />  
  8.         <property name="maxActive" value="${jdbc.maxActive}" />  
  9.         <property name="initialSize" value="${jdbc.initialSize}" />  
  10.         <property name="maxWait" value="${jdbc.maxWait}" />  
  11.         <property name="minIdle" value="${jdbc.minIdle}" />  
  12.         <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />  
  13.         <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}" />  
  14.         <property name="validationQuery" value="${jdbc.validationQuery}" />  
  15.         <property name="testWhileIdle" value="${jdbc.testWhileIdle}" />  
  16.         <property name="testOnBorrow" value="${jdbc.testOnBorrow}" />  
  17.         <property name="testOnReturn" value="${jdbc.testOnReturn}" />  
  18.         <property name="poolPreparedStatements" value="${jdbc.poolPreparedStatements}" />  
  19.         <property name="maxOpenPreparedStatements" value="${jdbc.maxOpenPreparedStatements}" />  
  20.         <property name="removeAbandoned" value="${jdbc.removeAbandoned}" />  
  21.         <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}" />  
  22.         <property name="logAbandoned" value="${jdbc.logAbandoned}" />  
  23.     </bean>  
  24.     <!-- 配置druid数据源 end -->  

上面的bean中property对应的值,就是从jdbc.properties配置文件中读取的,jdbc.properties配置文件的内容如下:

[xml]  view plain  copy
 print ?
  1. ####druid数据源配置  
  2. #链接字符串  
  3. jdbc.url=jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8  
  4. #数据库驱动类名  
  5. jdbc.driverClassName=com.mysql.jdbc.Driver  
  6. #用户名  
  7. jdbc.username=root   
  8. #密码  
  9. jdbc.password=root  
  10. #属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:监控统计用的filter:stat 日志用的filter:log4j 防御sql注入的filter:wall  
  11. jdbc.filters=stat   
  12. #最大连接池数量  
  13. jdbc.maxActive=20   
  14. #初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时  
  15. jdbc.initialSize=10  
  16. #获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配useUnfairLock属性为true使用非公平锁。  
  17. jdbc.maxWait=60000   
  18. #最小连接池数量  
  19. jdbc.minIdle=10   
  20. #有两个含义:1) Destroy线程会检测连接的间隔时间2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明  
  21. jdbc.timeBetweenEvictionRunsMillis=60000   
  22. #一个连接在池中最小生存的时间,单位是毫秒  
  23. jdbc.minEvictableIdleTimeMillis=300000   
  24. #用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。  
  25. jdbc.validationQuery=SELECT 'x'   
  26. #建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。  
  27. jdbc.testWhileIdle=true   
  28. #申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。  
  29. jdbc.testOnBorrow=false   
  30. #归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能  
  31. jdbc.testOnReturn=false   
  32. #在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100  
  33. jdbc.maxOpenPreparedStatements=20   
  34. #是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。5.5及以上版本有PSCache,建议开启。要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。  
  35. jdbc.poolPreparedStatements=true   
  36. #打开removeAbandoned功能  
  37. jdbc.removeAbandoned=true   
  38. #1800秒,也就是30分钟  
  39. jdbc.removeAbandonedTimeout=1800   
  40. #关闭abanded连接时输出错误日志  
  41. jdbc.logAbandoned=true  

4、配置MyBatis的SqlSssionFactory,mapperLocations配置为扫描src/main/mybatis目录下的所有.xml文件,就是所有的MyBatis的mapper.xml文件,另外设置mybatis的全局配置文件路径,这个可以不用配置,这样就使用默认配置。

[xml]  view plain  copy
 print ?
  1. <!-- 配置sqlSessionFactory start-->  
  2.  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">    
  3.     <property name="dataSource" ref="dataSource" />    
  4.     <!-- 自动扫描mapper文件 -->    
  5.     <property name="mapperLocations" value="classpath:mybatis/*.xml"></property>    
  6.     <!-- mybatis全局配置文件 -->  
  7.     <property name="configLocation" value="classpath:config/mybatis-config.xml"></property>  
  8.  </bean>    
  9. <!-- 配置sqlSessionFactory end-->  

mybatis-config.xml文件内容如下:

[xml]  view plain  copy
 print ?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE configuration   PUBLIC "-//mybatis.org//DTD Config 3.0 //EN"    "http://mybatis.org/dtd/mybatis-3-config.dtd">  
  3. <configuration>  
  4.      <settings>  
  5.         <!-- 配置全局性 cache 的 ( 开 / 关) default:true -->  
  6.         <setting name="cacheEnabled" value="false"/>  
  7.         <!-- 是否使用 懒加载 关联对象同 hibernate中的延迟加载 一样default:true -->  
  8.         <!-- <setting name="lazyLoadingEnabled" value="true"/> -->  
  9.         <!-- [当对象使用延迟加载时 属性的加载取决于能被引用到的那些延迟属性,否则,按需加载(需要的是时候才去加载)] -->  
  10.         <setting name="aggressiveLazyLoading" value="true"/>  
  11.         <!-- 是否允许单条sql 返回多个数据集(取决于驱动的兼容性) default:true -->  
  12.         <setting name="multipleResultSetsEnabled" value="true"/>  
  13.         <!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true-->  
  14.         <setting name="useColumnLabel" value="true"/>  
  15.         <!--允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。default:false-->  
  16.         <setting name="useGeneratedKeys" value="false"/>  
  17.         <!--指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分FULL:全部-->  
  18.         <setting name="autoMappingBehavior" value="PARTIAL"/>  
  19.         <!-- 这是默认的执行类型   
  20.             SIMPLE :简单    
  21.             REUSE:执行器可能重复使用prepared statements 语句   
  22.             BATCH:执行器可以重复执行语句和批量更新  
  23.         -->  
  24.         <setting name="defaultExecutorType" value="SIMPLE"/>  
  25.         <!-- 设置驱动等待数据响应的超时数默认没有设置-->  
  26.         <setting name="defaultStatementTimeout" value="25000"/>  
  27.         <!--是否启用 行内嵌套语句defaut:false-->  
  28.         <setting name="safeRowBoundsEnabled" value="false"/>  
  29.         <!-- [是否 启用数据中 A_column 自动映射 到 java类中驼峰命名的属性 default:fasle] -->  
  30.         <setting name="mapUnderscoreToCamelCase" value="false"/>  
  31.         <!-- 设置本地缓存范围 session:就会有数据的共享statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->  
  32.         <setting name="localCacheScope" value="SESSION"/>  
  33.         <!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER -->  
  34.         <setting name="jdbcTypeForNull" value="NULL"/>  
  35.         <!-- 设置触发延迟加载的方法-->  
  36.         <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>  
  37.     </settings>   
  38. </configuration>  

5、配置扫描dao接口所在的包

[xml]  view plain  copy
 print ?
  1. <!-- 扫描Dao接口所在的包名 start -->    
  2. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">    
  3.     <property name="basePackage" value="com.sdusz.framework.ssm.mapper" />    
  4.     <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>    
  5. </bean>    
  6. <!-- 扫描Dao接口所在的包名 end -->  

6、配置JdbcTemplate,本来集成了mybatis,为何还要jdbcTemplate呢?原因是mybatis的批量处理效率不高,而且不同数据库,写法也略有差异,使用更接近底层jdbc的jdbcTemplate进行批量操作,可以提升性能。

[xml]  view plain  copy
 print ?
  1. <!-- jdbcTemplate start -->  
  2. <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">  
  3.     <constructor-arg name="dataSource" ref="dataSource"/>  
  4. </bean>  
  5. <!-- jdbcTemplate end -->  

7、配置数据源事务切面,进行事务管理,我将事务的回滚配置在service层,对于异常,进行回滚,如果有异常,不要捕获,直接网上抛,到时用一个统一的拦截器进行处理即可,对于需要用事务进行控制的方法,方法的命名一定要以下面事务切面中给出的前缀命名,当然,也可自己添加其它的。

[xml]  view plain  copy
 print ?
  1. <!-- 数据源事务管理器start -->  
  2.     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  3.         <property name="dataSource" ref="dataSource" />  
  4.     </bean>  
  5.     <!-- 数据源事务管理器end -->  
  6.   
  7.     <!-- 事务切面 start-->  
  8.     <tx:advice id="txAdvice" transaction-manager="txManager">  
  9.         <tx:attributes>  
  10.             <tx:method name="get*" propagation="REQUIRED" read-only="true" />  
  11.             <tx:method name="count*" propagation="REQUIRED" read-only="true" />  
  12.             <tx:method name="find*" propagation="REQUIRED" read-only="true" />  
  13.             <tx:method name="list*" propagation="REQUIRED" read-only="true" />  
  14.             <tx:method name="search*" propagation="REQUIRED" read-only="true" />  
  15.             <tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>  
  16.             <tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>  
  17.             <tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>  
  18.             <tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>  
  19.             <tx:method name="modify*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>  
  20.             <tx:method name="edit*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>  
  21.             <!-- 批量操作最好用jdbcTemplate -->  
  22.             <tx:method name="batch*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>  
  23.         </tx:attributes>  
  24.     </tx:advice>  
  25.     <!-- 事务切面 end -->  
  26.   
  27.     <!-- 事务aop切入点 start-->  
  28.     <aop:config>  
  29.         <aop:pointcut id="txPointcut" expression="execution(* com.sdusz.framework.ssm.service.*.*(..)) " />  
  30.         <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />  
  31.     </aop:config>  
  32.     <!-- 事务aop切入点 end-->  

下面进行测试

1、在com.sdusz.framework.ssm.entity添加反向生成的Emp.Java类,对应数据库中的EMP表

[java]  view plain  copy
 print ?
  1. package com.sdusz.framework.ssm.entity;  
  2.   
  3. import java.io.Serializable;  
  4. import java.util.Date;  
  5.   
  6. import com.alibaba.fastjson.JSON;  
  7.   
  8. /** 
  9.  * 文件名称: com.sdusz.framework.ssm.entity.Emp.java 
  10.  * 初始作者: shenmengqi 
  11.  * 创建日期: 2016年3月18日 
  12.  * 功能说明: 测试实体-员工实体类  
  13.  * ================================================= 
  14.  * 修改记录: 
  15.  * 修改作者 日期 修改内容 
  16.  * ================================================ 
  17.  * Copyright (c) 2010-2011 .All rights reserved. 
  18.  */  
  19. public class Emp implements Serializable {  
  20.   
  21.     /** 
  22.      * 序列化版本号 
  23.      */  
  24.     private static final long   serialVersionUID    = 1L;  
  25.   
  26.     /** 
  27.      * 实体对应的数据库表名 
  28.      */  
  29.     public static final String  TABLE_NAME          = "emp";  
  30.   
  31.     /** 
  32.      * id 
  33.      */  
  34.     private String              id;  
  35.   
  36.     /** 
  37.      * 姓名 
  38.      */  
  39.     private String              name;  
  40.   
  41.     /** 
  42.      * 年龄 
  43.      */  
  44.     private Integer             age;  
  45.   
  46.     /** 
  47.      * 性别 
  48.      */  
  49.     private Integer             gender;  
  50.   
  51.     /** 
  52.      * 生日 
  53.      */  
  54.     private Date                birthday;  
  55.   
  56.     /** 
  57.      * 入职日期 
  58.      */  
  59.     private Date                hiredate;  
  60.     /** 
  61.      * 工作 
  62.      */  
  63.     private String              job;  
  64.   
  65.     /** 
  66.      * 爱好 
  67.      */  
  68.     private String              hobbies;  
  69.   
  70.     /** 
  71.      * 方法描述: 获取年龄 
  72.      * 初始作者: shenmengqi 
  73.      * 创建日期: 2016年3月18日-上午9:31:17 
  74.      * 开始版本: 2.0.0 
  75.      * ================================================= 
  76.      * 修改记录: 
  77.      * 修改作者 日期 修改内容 
  78.      * ================================================ 
  79.      * 
  80.      * @return 
  81.      *         Integer 年龄 
  82.      */  
  83.     public Integer getAge() {  
  84.   
  85.         return age;  
  86.     }  
  87.   
  88.     /** 
  89.      * 方法描述: 获取生日 
  90.      * 初始作者: shenmengqi 
  91.      * 创建日期: 2016年3月18日-上午9:31:40 
  92.      * 开始版本: 2.0.0 
  93.      * ================================================= 
  94.      * 修改记录: 
  95.      * 修改作者 日期 修改内容 
  96.      * ================================================ 
  97.      * 
  98.      * @return 
  99.      *         Date 生日 
  100.      */  
  101.     public Date getBirthday() {  
  102.   
  103.         return birthday;  
  104.     }  
  105.   
  106.     /** 
  107.      * 方法描述: 获取性别 
  108.      * 初始作者: shenmengqi 
  109.      * 创建日期: 2016年3月18日-上午9:31:57 
  110.      * 开始版本: 2.0.0 
  111.      * ================================================= 
  112.      * 修改记录: 
  113.      * 修改作者 日期 修改内容 
  114.      * ================================================ 
  115.      * 
  116.      * @return 
  117.      *         Integer 性别 
  118.      */  
  119.     public Integer getGender() {  
  120.   
  121.         return gender;  
  122.     }  
  123.   
  124.     /** 
  125.      * 方法描述: 获取入职日期 
  126.      * 初始作者: shenmengqi 
  127.      * 创建日期: 2016年3月18日-上午9:32:17 
  128.      * 开始版本: 2.0.0 
  129.      * ================================================= 
  130.      * 修改记录: 
  131.      * 修改作者 日期 修改内容 
  132.      * ================================================ 
  133.      * 
  134.      * @return 
  135.      *         Date 入职日期 
  136.      */  
  137.     public Date getHiredate() {  
  138.   
  139.         return hiredate;  
  140.     }  
  141.   
  142.     /** 
  143.      * 方法描述: 获取爱好 
  144.      * 初始作者: shenmengqi 
  145.      * 创建日期: 2016年3月18日-上午9:32:37 
  146.      * 开始版本: 2.0.0 
  147.      * ================================================= 
  148.      * 修改记录: 
  149.      * 修改作者 日期 修改内容 
  150.      * ================================================ 
  151.      * 
  152.      * @return 
  153.      *         String 爱好 
  154.      */  
  155.     public String getHobbies() {  
  156.   
  157.         return hobbies;  
  158.     }  
  159.   
  160.     /** 
  161.      * 方法描述: 获取id 
  162.      * 初始作者: shenmengqi 
  163.      * 创建日期: 2016年3月18日-上午9:33:02 
  164.      * 开始版本: 2.0.0 
  165.      * ================================================= 
  166.      * 修改记录: 
  167.      * 修改作者 日期 修改内容 
  168.      * ================================================ 
  169.      * 
  170.      * @return 
  171.      *         String id 
  172.      */  
  173.     public String getId() {  
  174.   
  175.         return id;  
  176.     }  
  177.   
  178.     /** 
  179.      * 方法描述: 获取工作 
  180.      * 初始作者: shenmengqi 
  181.      * 创建日期: 2016年3月18日-上午9:33:20 
  182.      * 开始版本: 2.0.0 
  183.      * ================================================= 
  184.      * 修改记录: 
  185.      * 修改作者 日期 修改内容 
  186.      * ================================================ 
  187.      * 
  188.      * @return 
  189.      *         String 工作 
  190.      */  
  191.     public String getJob() {  
  192.   
  193.         return job;  
  194.     }  
  195.   
  196.     /** 
  197.      * 方法描述: 获取姓名 
  198.      * 初始作者: shenmengqi 
  199.      * 创建日期: 2016年3月18日-上午9:33:37 
  200.      * 开始版本: 2.0.0 
  201.      * ================================================= 
  202.      * 修改记录: 
  203.      * 修改作者 日期 修改内容 
  204.      * ================================================ 
  205.      * 
  206.      * @return 
  207.      *         String 姓名 
  208.      */  
  209.     public String getName() {  
  210.   
  211.         return name;  
  212.     }  
  213.   
  214.     /** 
  215.      * 方法描述: 设置年龄 
  216.      * 初始作者: shenmengqi 
  217.      * 创建日期: 2016年3月18日-上午9:33:54 
  218.      * 开始版本: 2.0.0 
  219.      * ================================================= 
  220.      * 修改记录: 
  221.      * 修改作者 日期 修改内容 
  222.      * ================================================ 
  223.      * 
  224.      * @param age 
  225.      *            年龄 
  226.      */  
  227.     public void setAge(Integer age) {  
  228.   
  229.         this.age = age;  
  230.     }  
  231.   
  232.     /** 
  233.      * 方法描述: 设置生日 
  234.      * 初始作者: shenmengqi 
  235.      * 创建日期: 2016年3月18日-上午9:34:09 
  236.      * 开始版本: 2.0.0 
  237.      * ================================================= 
  238.      * 修改记录: 
  239.      * 修改作者 日期 修改内容 
  240.      * ================================================ 
  241.      * 
  242.      * @param birthday 
  243.      *            生日 
  244.      */  
  245.     public void setBirthday(Date birthday) {  
  246.   
  247.         this.birthday = birthday;  
  248.     }  
  249.   
  250.     /** 
  251.      * 方法描述: 设置性别 
  252.      * 初始作者: shenmengqi 
  253.      * 创建日期: 2016年3月18日-上午9:34:30 
  254.      * 开始版本: 2.0.0 
  255.      * ================================================= 
  256.      * 修改记录: 
  257.      * 修改作者 日期 修改内容 
  258.      * ================================================ 
  259.      * 
  260.      * @param gender 
  261.      *            性别 
  262.      */  
  263.     public void setGender(Integer gender) {  
  264.   
  265.         this.gender = gender;  
  266.     }  
  267.   
  268.     /** 
  269.      * 方法描述: 设置入职日期 
  270.      * 初始作者: shenmengqi 
  271.      * 创建日期: 2016年3月18日-上午9:34:56 
  272.      * 开始版本: 2.0.0 
  273.      * ================================================= 
  274.      * 修改记录: 
  275.      * 修改作者 日期 修改内容 
  276.      * ================================================ 
  277.      * 
  278.      * @param hiredate 
  279.      *            入职日期 
  280.      */  
  281.     public void setHiredate(Date hiredate) {  
  282.   
  283.         this.hiredate = hiredate;  
  284.     }  
  285.   
  286.     /** 
  287.      * 方法描述: 设置爱好 
  288.      * 初始作者: shenmengqi 
  289.      * 创建日期: 2016年3月18日-上午9:35:16 
  290.      * 开始版本: 2.0.0 
  291.      * ================================================= 
  292.      * 修改记录: 
  293.      * 修改作者 日期 修改内容 
  294.      * ================================================ 
  295.      * 
  296.      * @param hobbies 
  297.      *            爱好 
  298.      */  
  299.     public void setHobbies(String hobbies) {  
  300.   
  301.         this.hobbies = hobbies;  
  302.     }  
  303.   
  304.     /** 
  305.      * 方法描述: 设置id 
  306.      * 初始作者: shenmengqi 
  307.      * 创建日期: 2016年3月18日-上午9:35:37 
  308.      * 开始版本: 2.0.0 
  309.      * ================================================= 
  310.      * 修改记录: 
  311.      * 修改作者 日期 修改内容 
  312.      * ================================================ 
  313.      * 
  314.      * @param id 
  315.      *            id 
  316.      */  
  317.     public void setId(String id) {  
  318.   
  319.         this.id = id;  
  320.     }  
  321.   
  322.     /** 
  323.      * 方法描述: 设置工作 
  324.      * 初始作者: shenmengqi 
  325.      * 创建日期: 2016年3月18日-上午9:35:53 
  326.      * 开始版本: 2.0.0 
  327.      * ================================================= 
  328.      * 修改记录: 
  329.      * 修改作者 日期 修改内容 
  330.      * ================================================ 
  331.      * 
  332.      * @param job 
  333.      *            工作 
  334.      */  
  335.     public void setJob(String job) {  
  336.   
  337.         this.job = job;  
  338.     }  
  339.   
  340.     /** 
  341.      * 方法描述: 设置姓名 
  342.      * 初始作者: shenmengqi 
  343.      * 创建日期: 2016年3月18日-上午9:36:10 
  344.      * 开始版本: 2.0.0 
  345.      * ================================================= 
  346.      * 修改记录: 
  347.      * 修改作者 日期 修改内容 
  348.      * ================================================ 
  349.      * 
  350.      * @param name 
  351.      *            姓名 
  352.      */  
  353.     public void setName(String name) {  
  354.   
  355.         this.name = name;  
  356.     }  
  357.   
  358.     /** 
  359.      * 方法描述: 重写toString()方法 
  360.      * 初始作者: shenmengqi 
  361.      * 创建日期: 2016年3月22日-下午2:14:07 
  362.      * 开始版本: 2.0.0 
  363.      * ================================================= 
  364.      * 修改记录: 
  365.      * 修改作者 日期 修改内容 
  366.      * ================================================ 
  367.      */  
  368.     @Override  
  369.     public String toString() {  
  370.   
  371.         return JSON.toJSONString(this);  
  372.     }  
  373.   
  374. }  

2、com.sdusz.framework.ssm.mapper添加反向生成的EmpMapper.java类,删去其中的默认方法,添加自己需要的方法

[java]  view plain  copy
 print ?
  1. package com.sdusz.framework.ssm.mapper;  
  2.   
  3. import org.apache.ibatis.annotations.Param;  
  4.   
  5. import com.sdusz.framework.ssm.entity.Emp;  
  6.   
  7. /** 
  8.  * 文件名称: com.sdusz.framework.ssm.mapper.EmpMapper.java 
  9.  * 初始作者: shenmengqi 
  10.  * 创建日期: 2016年3月18日 
  11.  * 功能说明: 员工mapper  
  12.  * ================================================= 
  13.  * 修改记录: 
  14.  * 修改作者 日期 修改内容 
  15.  * ================================================ 
  16.  * Copyright (c) 2010-2011 .All rights reserved. 
  17.  */  
  18. public interface EmpMapper {  
  19.   
  20.     /** 
  21.      * 方法描述: 通过id获取员工信息 
  22.      * 初始作者: shenmengqi 
  23.      * 创建日期: 2016年3月17日-下午1:45:04 
  24.      * 开始版本: 2.0.0 
  25.      * ================================================= 
  26.      * 修改记录: 
  27.      * 修改作者 日期 修改内容 
  28.      * ================================================ 
  29.      * 
  30.      * @param id 
  31.      *            主键 
  32.      * @return 
  33.      *         Emp 员工实体 
  34.      */  
  35.     Emp selectEmpById(@Param("id") String id);  
  36. }  

3、在src/main/resources下的mybatis目录下添加反向生成的EmpMapper.xml文件,删除其中的无用内容,添加自己的语句,对应每个语句的id即为EmpMapper.java中每个方法的方法名

[xml]  view plain  copy
 print ?
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >  
  3. <!-- 员工mapper -->  
  4. <mapper namespace="com.sdusz.framework.ssm.mapper.EmpMapper" >  
  5.     <!-- 通过id获取员工信息-->  
  6.     <select id="selectEmpById" parameterType="java.lang.String" resultType="com.sdusz.framework.ssm.entity.Emp">  
  7.         select * from emp where id=#{id,jdbcType=BIGINT}  
  8.     </select>  
  9. </mapper>  

4、com.sdusz.framework.ssm.service添加EmpService.java接口

[java]  view plain  copy
 print ?
  1. package com.sdusz.framework.ssm.service;  
  2.   
  3. import com.sdusz.framework.ssm.entity.Emp;  
  4.   
  5. /** 
  6.  * 文件名称: com.sdusz.framework.ssm.service.EmpService.java 
  7.  * 初始作者: shenmengqi 
  8.  * 创建日期: 2016年3月18日 
  9.  * 功能说明: 员工service  
  10.  * ================================================= 
  11.  * 修改记录: 
  12.  * 修改作者 日期 修改内容 
  13.  * ================================================ 
  14.  * Copyright (c) 2010-2011 .All rights reserved. 
  15.  */  
  16. public interface EmpService {  
  17.   
  18.     /** 
  19.      * 方法描述: 批量添加员工信息,用jdbc,另一方面为了测试事务的有效性 
  20.      * 初始作者: shenmengqi 
  21.      * 创建日期: 2016年3月18日-上午9:49:09 
  22.      * 开始版本: 2.0.0 
  23.      * ================================================= 
  24.      * 修改记录: 
  25.      * 修改作者 日期 修改内容 
  26.      * ================================================ 
  27.      * 
  28.      * @return int 
  29.      *         插入成功的数量 
  30.      * @throws Exception 
  31.      *             异常 
  32.      */  
  33.     int batchAddEmp() throws Exception;  
  34.   
  35.     /** 
  36.      * 方法描述: 通过id获取员工信息 
  37.      * 初始作者: shenmengqi 
  38.      * 创建日期: 2016年3月18日-上午9:49:55 
  39.      * 开始版本: 2.0.0 
  40.      * ================================================= 
  41.      * 修改记录: 
  42.      * 修改作者 日期 修改内容 
  43.      * ================================================ 
  44.      * 
  45.      * @param id 
  46.      *            员工id 
  47.      * @return 
  48.      *         Emp 员工实体 
  49.      */  
  50.     Emp getEmpById(String id);  
  51. }  

5、com.sdusz.framework.ssm.serviceImpl添加EmpServiceImpl.java类,实现EmpService接口,对于JdbcTemplate还有EmpMapper直接使用@Autowired进行注入,第二个方法直接通过id获取员工信息,第一个方法使用JdbcTemplate批量插入员工信息(这里我没用批量插入的api,为了观察更清晰,用循环进行插入,看某一条出错,其余是否会回滚),顺便可以测试异常事务切面异常情况是否会进行回滚

[java]  view plain  copy
 print ?
  1. package com.sdusz.framework.ssm.serviceImpl;  
  2. import java.util.Date;  
  3. import java.util.Random;  
  4. import org.apache.log4j.Logger;  
  5. import org.springframework.beans.factory.annotation.Autowired;  
  6. import org.springframework.cache.annotation.Cacheable;  
  7. import org.springframework.jdbc.core.JdbcTemplate;  
  8. import com.sdusz.framework.ssm.entity.Emp;  
  9. import com.sdusz.framework.ssm.mapper.EmpMapper;  
  10. import com.sdusz.framework.ssm.service.EmpService;  
  11. import com.sdusz.framework.ssm.util.UUIDUtils;  
  12.   
  13. /** 
  14.  * 文件名称: com.sdusz.framework.ssm.serviceImpl.EmpServiceImpl.java 
  15.  * 初始作者: shenmengqi 
  16.  * 创建日期: 2016年3月18日 
  17.  * 功能说明: 员工service实现类 
  18.  * ================================================= 
  19.  * 修改记录: 
  20.  * 修改作者 日期 修改内容 
  21.  * ================================================ 
  22.  * Copyright (c) 2010-2011 .All rights reserved. 
  23.  */  
  24. public class EmpServiceImpl implements EmpService {  
  25.   
  26.     /** 
  27.      * log4j日志对象 
  28.      */  
  29.     private static final Logger log = Logger.getLogger(EmpServiceImpl.class);  
  30.   
  31.     /** 
  32.      * 员工mapper 
  33.      */  
  34.     @Autowired  
  35.     private EmpMapper           empMapper;  
  36.   
  37.     /** 
  38.      * jdbcTemplate 
  39.      */  
  40.     @Autowired  
  41.     private JdbcTemplate        jdbcTemplate;  
  42.   
  43.     /** 
  44.      * 方法描述: 用jdbcTemplate循环插入员工信息,一方面测试jdbcTemplate,另一方面测试事务有效性 
  45.      * 初始作者: shenmengqi 
  46.      * 创建日期: 2016年3月17日-下午2:03:11 
  47.      * 开始版本: 2.0.0 
  48.      * ================================================= 
  49.      * 修改记录: 
  50.      * 修改作者 日期 修改内容 
  51.      * ================================================ 
  52.      * 
  53.      * @throws Exception 
  54.      *             异常对象 
  55.      */  
  56.   
  57.     @Override  
  58.     public int batchAddEmp() throws Exception {  
  59.   
  60.         int r = 0;  
  61.         for (int i = 0; i < new Random().nextInt(5); i++) {  
  62.             // log.info("开始插入第" + (i + 1) + "条");  
  63.             Emp e = new Emp();  
  64.             e.setId(UUIDUtils.get32UUID());  
  65.             e.setName("name" + i);  
  66.             e.setJob("job" + i);  
  67.             e.setHobbies("hobbies" + i);  
  68.             e.setGender(new Random().nextInt(1));  
  69.             e.setAge(new Random().nextInt(30));  
  70.             e.setBirthday(new Date());  
  71.             e.setHiredate(new Date());  
  72.             // if (i == 7) {  
  73.             // log.error("出错了,回滚!");  
  74.             // throw new Exception("出错了!");  
  75.             // }  
  76.             int rr = jdbcTemplate.update("insert into emp values(?,?,?,?,?,?,?,?)"new Object[] {  
  77.                     e.getId(),  
  78.                     e.getName(),  
  79.                     e.getAge(),  
  80.                     e.getGender(),  
  81.                     e.getBirthday(),  
  82.                     e.getHiredate(),  
  83.                     e.getJob(),  
  84.                     e.getHobbies()  
  85.             });  
  86.             if (rr == 1) {  
  87.                 r++;  
  88.             }  
  89.             // log.info("第" + (i + 1) + "条插入成功");  
  90.         }  
  91.         return r;  
  92.     }  
  93.   
  94.     /** 
  95.      * 方法描述: 通过id获取员工信息,有缓存 
  96.      * 初始作者: shenmengqi 
  97.      * 创建日期: 2016年3月18日-上午9:51:55 
  98.      * 开始版本: 2.0.0 
  99.      * ================================================= 
  100.      * 修改记录: 
  101.      * 修改作者 日期 修改内容 
  102.      * ================================================ 
  103.      */  
  104.     @Override  
  105.     @Cacheable(value = "empCache", key = "#id+'~cache'", condition = "#id=='1406'")  
  106.     public Emp getEmpById(String id) {  
  107.   
  108.         System.out.println("调用了getEmpById() 方法");  
  109.         return empMapper.selectEmpById(id);  
  110.     }  
  111.   
  112. }  

6、com.sdusz.framework.ssm.controller中添加EmpController.java类,EmpService使用@Resource进行注入,一般Controller层只是一个负责转发的层,所以,业务逻辑能在Service层处理就尽量在Service层处理,每一层必要的日志记录也是需要的。Controller遇到异常也不要捕获,向上抛出由统一的异常拦截器进行处理。

[java]  view plain  copy
 print ?
  1. package com.sdusz.framework.ssm.controller;  
  2. import javax.annotation.Resource;  
  3. import org.springframework.stereotype.Controller;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5. import org.springframework.web.bind.annotation.RequestParam;  
  6. import org.springframework.web.bind.annotation.ResponseBody;  
  7. import com.sdusz.framework.ssm.entity.Emp;  
  8. import com.sdusz.framework.ssm.service.EmpService;  
  9. /** 
  10.  * 文件名称: com.sdusz.framework.ssm.controller.EmpController.java 
  11.  * 初始作者: shenmengqi 
  12.  * 创建日期: 2016年3月18日 
  13.  * 功能说明: 测试类,员工信息控制器  
  14.  * ================================================= 
  15.  * 修改记录: 
  16.  * 修改作者 日期 修改内容 
  17.  * ================================================ 
  18.  * Copyright (c) 2010-2011 .All rights reserved. 
  19.  */  
  20. @Controller  
  21. @RequestMapping("emp")  
  22. public class EmpController {  
  23.   
  24.     /** 
  25.      * 员工信息service 
  26.      */  
  27.     @Resource  
  28.     private EmpService  empService;  
  29.   
  30.     /** 
  31.      * 方法描述: 批量添加员工信息 
  32.      * 初始作者: shenmengqi 
  33.      * 创建日期: 2016年3月18日-上午9:18:35 
  34.      * 开始版本: 2.0.0 
  35.      * ================================================= 
  36.      * 修改记录: 
  37.      * 修改作者 日期 修改内容 
  38.      * ================================================ 
  39.      * 
  40.      * @return int 
  41.      *         插入成功的记录数 
  42.      * @throws Exception 
  43.      *             异常 
  44.      */  
  45.     @RequestMapping("/addEmps")  
  46.     @ResponseBody  
  47.     public int addEmps() throws Exception {  
  48.   
  49.         return empService.batchAddEmp();  
  50.     }  
  51.   
  52.     /** 
  53.      * 方法描述: 通过id获取员工信息 
  54.      * 初始作者: shenmengqi 
  55.      * 创建日期: 2016年3月18日-上午9:20:10 
  56.      * 开始版本: 2.0.0 
  57.      * ================================================= 
  58.      * 修改记录: 
  59.      * 修改作者 日期 修改内容 
  60.      * ================================================ 
  61.      * 
  62.      * @param id 
  63.      *            员工id 
  64.      * @return 
  65.      *         Emp 员工实体 
  66.      */  
  67.     @RequestMapping("/getEmpById")  
  68.     @ResponseBody  
  69.     public Emp getEmpById(@RequestParam String id) {  
  70.   
  71.         return empService.getEmpById(id);  
  72.     }  
  73. }  

7、依次访问上面两个接口 
http://ip:port/工程名/interfaces/emp/addEmps 
先访问,如果批量插入成功返回影响的行数则表示jdbcTemplate可用 
修改service实现类代码,制造异常,再测试,看是否回滚成功 
http://ip:port/工程名/interfaces/emp/getEmpById?id=1406 
直接返回员工信息json对象,则表示成功

至此就完成了一个简单Spring+SpringMVC+MyBatis框架的搭建,其实在真正的企业级开发中,做了这些是远远不够的,接下来我还要在这个框架中融入其他的东西!






  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值