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



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.           
  3.         <spring.version>4.2.5.RELEASEspring.version>  
  4.           
  5.         <mybatis.version>3.3.1mybatis.version>  
  6.           
  7.         <springMybatis.version>1.2.2springMybatis.version>  
  8.           
  9.         <mysql.version>5.1.38mysql.version>  
  10.           
  11.         <druid.version>1.0.18druid.version>  
  12.           
  13.         <log4j.version>1.2.17log4j.version>  
  14.           
  15.         <fastjson.version>1.2.8fastjson.version>  
  16.           
  17.         <jacksonMapper.version>1.9.13jacksonMapper.version>  
  18.           
  19.     <commonsFileupload.version>1.3.1commonsFileupload.version>  
  20.           
  21.         <commonsio.version>2.4commonsio.version>  
  22.           
  23.         <commonscodec.version>1.10commonscodec.version>  
  24.           
  25.         <commonsLang.verison>2.6commonsLang.verison>  
  26.           
  27.         <jacksonCore.version>2.7.3jacksonCore.version>  
  28.           
  29.         <jacksonDataBind.version>2.7.3jacksonDataBind.version>  
  30.           
  31.         <aspectj.version>1.7.2aspectj.version>  
  32.           
  33.         <junit.version>4.11junit.version>  
  34. properties>  
  35.   
  36. <dependencies>  
  37.           
  38.         <dependency>  
  39.             <groupId>junitgroupId>  
  40.             <artifactId>junitartifactId>  
  41.             <version>${junit.version}version>  
  42.               
  43.             <scope>testscope>  
  44.         dependency>  
  45.           
  46.   
  47.           
  48.         <dependency>  
  49.             <groupId>org.springframeworkgroupId>  
  50.             <artifactId>spring-coreartifactId>  
  51.             <version>${spring.version}version>  
  52.         dependency>  
  53.         <dependency>  
  54.             <groupId>org.springframeworkgroupId>  
  55.             <artifactId>spring-webartifactId>  
  56.             <version>${spring.version}version>  
  57.         dependency>  
  58.         <dependency>  
  59.             <groupId>org.springframeworkgroupId>  
  60.             <artifactId>spring-oxmartifactId>  
  61.             <version>${spring.version}version>  
  62.         dependency>  
  63.         <dependency>  
  64.             <groupId>org.springframeworkgroupId>  
  65.             <artifactId>spring-txartifactId>  
  66.             <version>${spring.version}version>  
  67.         dependency>  
  68.         <dependency>  
  69.             <groupId>org.springframeworkgroupId>  
  70.             <artifactId>spring-jdbcartifactId>  
  71.             <version>${spring.version}version>  
  72.         dependency>  
  73.         <dependency>  
  74.             <groupId>org.springframeworkgroupId>  
  75.             <artifactId>spring-webmvcartifactId>  
  76.             <version>${spring.version}version>  
  77.         dependency>  
  78.         <dependency>  
  79.             <groupId>org.springframeworkgroupId>  
  80.             <artifactId>spring-aopartifactId>  
  81.             <version>${spring.version}version>  
  82.         dependency>  
  83.         <dependency>  
  84.             <groupId>org.springframeworkgroupId>  
  85.             <artifactId>spring-context-supportartifactId>  
  86.             <version>${spring.version}version>  
  87.         dependency>  
  88.         <dependency>  
  89.             <groupId>org.springframeworkgroupId>  
  90.             <artifactId>spring-testartifactId>  
  91.             <version>${spring.version}version>  
  92.         dependency>  
  93.           
  94.   
  95.           
  96.         <dependency>  
  97.             <groupId>org.aspectjgroupId>  
  98.             <artifactId>aspectjweaverartifactId>  
  99.             <version>${aspectj.version}version>  
  100.         dependency>  
  101.           
  102.   
  103.           
  104.         <dependency>  
  105.             <groupId>org.mybatisgroupId>  
  106.             <artifactId>mybatisartifactId>  
  107.             <version>${mybatis.version}version>  
  108.         dependency>  
  109.           
  110.   
  111.           
  112.         <dependency>  
  113.             <groupId>org.mybatisgroupId>  
  114.             <artifactId>mybatis-springartifactId>  
  115.             <version>${springMybatis.version}version>  
  116.         dependency>  
  117.           
  118.   
  119.           
  120.         <dependency>  
  121.             <groupId>mysqlgroupId>  
  122.             <artifactId>mysql-connector-javaartifactId>  
  123.             <version>${mysql.version}version>  
  124.         dependency>  
  125.           
  126.   
  127.           
  128.         <dependency>  
  129.             <groupId>com.alibabagroupId>  
  130.             <artifactId>druidartifactId>  
  131.             <version>${druid.version}version>  
  132.         dependency>  
  133.           
  134.   
  135.           
  136.         <dependency>  
  137.             <groupId>log4jgroupId>  
  138.             <artifactId>log4jartifactId>  
  139.             <version>${log4j.version}version>  
  140.         dependency>  
  141.           
  142.   
  143.           
  144.         <dependency>  
  145.             <groupId>com.alibabagroupId>  
  146.             <artifactId>fastjsonartifactId>  
  147.             <version>${fastjson.version}version>  
  148.         dependency>  
  149.           
  150.   
  151.           
  152.         <dependency>  
  153.             <groupId>org.codehaus.jacksongroupId>  
  154.             <artifactId>jackson-mapper-aslartifactId>  
  155.             <version>${jaksonMapper.version}version>  
  156.         dependency>  
  157.           
  158.   
  159.           
  160.         <dependency>  
  161.             <groupId>com.fasterxml.jackson.coregroupId>  
  162.             <artifactId>jackson-coreartifactId>  
  163.             <version>${jacksonCore.version}version>  
  164.         dependency>  
  165.         <dependency>  
  166.             <groupId>com.fasterxml.jackson.coregroupId>  
  167.             <artifactId>jackson-databindartifactId>  
  168.             <version>${jacksonDataBind.version}version>  
  169.         dependency>  
  170.           
  171.   
  172.           
  173.         <dependency>  
  174.             <groupId>commons-fileuploadgroupId>  
  175.             <artifactId>commons-fileuploadartifactId>  
  176.             <version>${commonsFileupload.version}version>  
  177.         dependency>  
  178.         <dependency>  
  179.             <groupId>commons-iogroupId>  
  180.             <artifactId>commons-ioartifactId>  
  181.             <version>${commonsio.version}version>  
  182.         dependency>  
  183.         <dependency>  
  184.             <groupId>commons-codecgroupId>  
  185.             <artifactId>commons-codecartifactId>  
  186.             <version>${commonscodec.version}version>  
  187.         dependency>  
  188.           
  189.   
  190.           
  191.         <dependency>  
  192.             <groupId>commons-langgroupId>  
  193.             <artifactId>commons-langartifactId>  
  194.             <version>${commonsLang.verison}version>  
  195.         dependency>  
  196.           
  197. dependencies>  

现在开始正式搭建,首先构建如下的包结构 
Maven+Spring+SpringMVC+MyBatis框架的搭建_第1张图片 
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文件夹下建立这两个文件 
Maven+Spring+SpringMVC+MyBatis框架的搭建_第2张图片 
spring-context.xml 就是spring容器上下文对应的配置文件,也是AOP,DI,IOC的核心文件。 
spring-mvc.xml主要是就是对应了dispatcherServlet的定义,包括数据到Controller层,以及从Controller返回时的Converter。 
spring-context.xml现在内容如下,现在可以什么bean和aop的定义都不写,但是一定要有这么一个结构,否则等下服务启动是会报错的,因为启动时会将配置文件中的之间定义的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.       
  13.     <mvc:annotation-driven>  
  14.         <mvc:message-converters>  
  15.                 
  16.             <bean id="mappingJacksonHttpMessageConverter"  class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">    
  17.                 <property name="supportedMediaTypes">    
  18.                     <list>    
  19.                        <value>application/json;charset=UTF-8value>                    
  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-8value>    
  27.                     list>    
  28.                 property>    
  29.             bean>  
  30.                 
  31.         mvc:message-converters>  
  32.     mvc:annotation-driven>      
  33.       
  34.   
  35.       
  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.       
  40.   
  41.       
  42.     <mvc:default-servlet-handler />  
  43.       
  44.   
  45.       
  46.     <aop:aspectj-autoproxy proxy-target-class="true" />  
  47.       
  48. beans>  

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

[xml]  view plain  copy
 print ?
  1.   
  2. <welcome-file-list>  
  3.     <welcome-file>index.htmlwelcome-file>  
  4. welcome-file-list>  
  5.   
  6.   
  7.   
  8. <context-param>  
  9.     <param-name>contextConfigLocationparam-name>  
  10.     <param-value>classpath:spring/spring-context.xmlparam-value>  
  11. context-param>  
  12.   
  13.   
  14.   
  15. <context-param>  
  16.     <param-name>log4jConfigLocationparam-name>  
  17.     <param-value>classpath:config/log4j.propertiesparam-value>  
  18. context-param>  
  19.   
  20.   
  21.   
  22. <context-param>  
  23.     <param-name>log4jRefreshIntervalparam-name>  
  24.     <param-value>600000param-value>  
  25. context-param>  
  26.   
  27.   
  28.   
  29. <context-param>  
  30.     <param-name>webAppRootKeyparam-name>  
  31.     <param-value>ssm.rootparam-value>  
  32. context-param>  
  33.   
  34.   
  35.   
  36. <filter>  
  37.     <filter-name>encodingFilterfilter-name>  
  38.     <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>  
  39.     <async-supported>trueasync-supported>  
  40.     <init-param>  
  41.         <param-name>encodingparam-name>  
  42.         <param-value>UTF-8param-value>  
  43.     init-param>  
  44.     <init-param>  
  45.         <param-name>forceEncodingparam-name>  
  46.         <param-value>trueparam-value>  
  47.     init-param>  
  48. filter>  
  49. <filter-mapping>  
  50.     <filter-name>encodingFilterfilter-name>  
  51.     <url-pattern>/*url-pattern>  
  52. filter-mapping>  
  53.   
  54.   
  55. <listener>  
  56.     <listener-class>org.springframework.web.util.Log4jConfigListenerlistener-class>  
  57. listener>  
  58.   
  59.   
  60.   
  61. <listener>  
  62.     <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>  
  63. listener>  
  64.   
  65.   
  66.   
  67. <listener>  
  68.     <listener-class>org.springframework.web.util.IntrospectorCleanupListenerlistener-class>  
  69. listener>  
  70.   
  71.   
  72. <servlet>  
  73.     <servlet-name>SpringMVCservlet-name>  
  74.     <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>  
  75.     <init-param>  
  76.         <param-name>contextConfigLocationparam-name>  
  77.         <param-value>classpath:spring/spring-mvc.xmlparam-value>  
  78.     init-param>  
  79.     <load-on-startup>2load-on-startup>  
  80.     <async-supported>trueasync-supported>  
  81. servlet>  
  82. <servlet-mapping>  
  83.     <servlet-name>SpringMVCservlet-name>  
  84.     <url-pattern>/interfaces/*url-pattern>  
  85. servlet-mapping>  
  86.   
  87.   
  88. <session-config>  
  89.     <session-timeout>30session-timeout>  
  90. session-config>  
  91.   

在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 返回的map对象 
  35.      */  
  36.     @RequestMapping("/m002")  
  37.     @ResponseBody  
  38.     public Map getJSON() {  
  39.   
  40.         Map data = new HashMap();  
  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 参数组装出的map对象 
  64.      */  
  65.     @RequestMapping("/{clientType}/{loginId}/{userType}/m003")  
  66.     @ResponseBody  
  67.     public Map testRestful(@PathVariable String clientType, @PathVariable String loginId,  
  68.             @PathVariable String userType) {  
  69.   
  70.         Map data = new HashMap();  
  71.         data.put("clientType", clientType);  
  72.         data.put("loginid", loginId);  
  73.         data.put("userType", userType);  
  74.         return data;  
  75.     }  
  76.         /** 
  77.      * 方法描述: 测试将model转为json传到前台
     
  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 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.   
  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.   

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

[xml]  view plain  copy
 print ?
  1.   
  2. <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  3.     <property name="locations">  
  4.         <list>  
  5.             <value>classpath:config/jdbc.propertiesvalue>  
  6.         list>  
  7.     property>  
  8.       
  9. bean>  
  10.   

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

[xml]  view plain  copy
 print ?
  1.   
  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.       

上面的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.   
  2.  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">    
  3.     <property name="dataSource" ref="dataSource" />    
  4.         
  5.     <property name="mapperLocations" value="classpath:mybatis/*.xml">property>    
  6.       
  7.     <property name="configLocation" value="classpath:config/mybatis-config.xml">property>  
  8.  bean>    
  9.   

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

[xml]  view plain  copy
 print ?
  1. xml version="1.0" encoding="UTF-8"?>  
  2. >  
  3. <configuration>  
  4.      <settings>  
  5.           
  6.         <setting name="cacheEnabled" value="false"/>  
  7.           
  8.           
  9.           
  10.         <setting name="aggressiveLazyLoading" value="true"/>  
  11.           
  12.         <setting name="multipleResultSetsEnabled" value="true"/>  
  13.           
  14.         <setting name="useColumnLabel" value="true"/>  
  15.           
  16.         <setting name="useGeneratedKeys" value="false"/>  
  17.           
  18.         <setting name="autoMappingBehavior" value="PARTIAL"/>  
  19.           
  20.         <setting name="defaultStatementTimeout" value="25000"/>  
  21.           
  22.         <setting name="safeRowBoundsEnabled" value="false"/>  
  23.           
  24.         <setting name="mapUnderscoreToCamelCase" value="false"/>  
  25.           
  26.         <setting name="localCacheScope" value="SESSION"/>  
  27.           
  28.         <setting name="jdbcTypeForNull" value="NULL"/>  
  29.           
  30.         <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>  
  31.     settings>   
  32. configuration>  

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

[xml]  view plain  copy
 print ?
  1.     
  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.   

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

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

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

[xml]  view plain  copy
 print ?
  1.   
  2.     <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  3.         <property name="dataSource" ref="dataSource" />  
  4.     bean>  
  5.       
  6.   
  7.       
  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.               
  22.             <tx:method name="batch*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>  
  23.         tx:attributes>  
  24.     tx:advice>  
  25.       
  26.   
  27.       
  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.       

下面进行测试

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 

你可能感兴趣的:(mybatis,ssm,Spring,spring,mvc)