整合 spring 4(包括mvc、context、orm) + mybatis 3 示例

来源:互联网 发布:淘宝服装图标 编辑:程序博客网 时间:2024/05/21 17:44
作者各必备工具的版本如下:
  1. MySQL:5.6.25-log MySQL Community Server (GPL) (下载地址)
  2. Tomcat:apache-tomcat-7.0.63 (下载链接)
  3. Java EE - Eclipse:Luna Service Release 1 v4.4.1 (下载链接)
  4. Spring:4.2.0.RELEASE (无须下载)
  5. MyBatis:3.3.0 (无须下载)
  6. JDK:1.7.0_67 (下载链接)

项目搭建

第三方包依赖 pom.xml:
[html] view plain copy
 print?
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  3.     <modelVersion>4.0.0</modelVersion>  
  4.     <groupId>bdp</groupId>  
  5.     <artifactId>bdp</artifactId>  
  6.     <version>1.0.0</version>  
  7.     <packaging>war</packaging>  
  8.     <name>bdp</name>  
  9.     <description>Basic Data Platform</description>  
  10.   
  11.     <properties>  
  12.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  13.         <spring.version>4.2.0.RELEASE</spring.version>  
  14.     </properties>  
  15.   
  16.     <dependencies>  
  17.   
  18.         <!-- spring mvc related.....start --> <!-- TODO: replace jackson with fastjson -->  
  19.         <dependency>  
  20.             <groupId>org.springframework</groupId>  
  21.             <artifactId>spring-context</artifactId>  
  22.             <version>${spring.version}</version>  
  23.         </dependency>  
  24.         <dependency>  
  25.             <groupId>org.springframework</groupId>  
  26.             <artifactId>spring-aop</artifactId>  
  27.             <version>${spring.version}</version>  
  28.         </dependency>  
  29.         <dependency>  
  30.             <groupId>org.springframework</groupId>  
  31.             <artifactId>spring-webmvc</artifactId>  
  32.             <version>${spring.version}</version>  
  33.         </dependency>  
  34.         <dependency>  
  35.             <groupId>org.springframework</groupId>  
  36.             <artifactId>spring-web</artifactId>  
  37.             <version>${spring.version}</version>  
  38.         </dependency>  
  39.         <dependency>  
  40.             <groupId>javax.servlet</groupId>  
  41.             <artifactId>jstl</artifactId>  
  42.             <version>1.2</version>  
  43.         </dependency>  
  44.         <dependency>  
  45.             <groupId>commons-logging</groupId>  
  46.             <artifactId>commons-logging</artifactId>  
  47.             <version>1.1.3</version>  
  48.         </dependency>  
  49.         <dependency>  
  50.             <groupId>org.codehaus.jackson</groupId>  
  51.             <artifactId>jackson-mapper-asl</artifactId>  
  52.             <version>1.9.13</version>  
  53.         </dependency>  
  54.         <dependency>  
  55.             <groupId>com.fasterxml.jackson.core</groupId>  
  56.             <artifactId>jackson-annotations</artifactId>  
  57.             <version>2.6.1</version>  
  58.         </dependency>  
  59.         <dependency>  
  60.             <groupId>com.fasterxml.jackson.core</groupId>  
  61.             <artifactId>jackson-core</artifactId>  
  62.             <version>2.6.1</version>  
  63.         </dependency>  
  64.         <dependency>  
  65.             <groupId>com.fasterxml.jackson.core</groupId>  
  66.             <artifactId>jackson-databind</artifactId>  
  67.             <version>2.6.1</version>  
  68.         </dependency>  
  69.         <!-- spring mvc related.....end -->  
  70.   
  71.         <!-- mybatis orm related.....start -->  
  72.         <dependency>  
  73.             <groupId>org.springframework</groupId>  
  74.             <artifactId>spring-orm</artifactId>  
  75.             <version>${spring.version}</version>  
  76.         </dependency>  
  77.         <dependency>  
  78.             <groupId>org.mybatis</groupId>  
  79.             <artifactId>mybatis-spring</artifactId>  
  80.             <version>1.2.3</version>  
  81.         </dependency>  
  82.         <dependency>  
  83.             <groupId>mysql</groupId>  
  84.             <artifactId>mysql-connector-java</artifactId>  
  85.             <version>5.1.36</version>  
  86.         </dependency>  
  87.         <dependency>  
  88.             <groupId>org.mybatis</groupId>  
  89.             <artifactId>mybatis</artifactId>  
  90.             <version>3.3.0</version>  
  91.         </dependency>  
  92.         <dependency>  
  93.             <groupId>c3p0</groupId>  
  94.             <artifactId>c3p0</artifactId>  
  95.             <version>0.9.1.2</version>  
  96.         </dependency>  
  97.         <!-- mybatis orm related.....end -->  
  98.   
  99.   
  100.         <!-- project log related.....start -->  
  101.         <dependency>  
  102.             <groupId>log4j</groupId>  
  103.             <artifactId>log4j</artifactId>  
  104.             <version>1.2.17</version>  
  105.         </dependency>  
  106.         <!-- project log related.....end -->  
  107.   
  108.     </dependencies>  
  109.   
  110.     <build>  
  111.         <plugins>  
  112.             <plugin>  
  113.                 <artifactId>maven-compiler-plugin</artifactId>  
  114.                 <version>3.1</version>  
  115.                 <configuration>  
  116.                     <source>1.7</source>  
  117.                     <target>1.7</target>  
  118.                 </configuration>  
  119.             </plugin>  
  120.             <plugin>  
  121.                 <artifactId>maven-war-plugin</artifactId>  
  122.                 <version>2.4</version>  
  123.                 <configuration>  
  124.                     <warSourceDirectory>WebContent</warSourceDirectory>  
  125.                     <failOnMissingWebXml>false</failOnMissingWebXml>  
  126.                 </configuration>  
  127.             </plugin>  
  128.         </plugins>  
  129.     </build>  
  130. </project>  

测试用表 CITY_CODE_CN:
[sql] view plain copy
 print?
  1. CREATE TABLE `CITY_CODE_CN` (  
  2.   `ID` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',  
  3.   `CITY_CODE` CHAR(4) NOT NULL COMMENT '城市代码》四位阿拉伯数字',  
  4.   `CITY_JB` TINYINT UNSIGNED NOT NULL COMMENT '城市级别》非空。1:省级;2:地级;3:县级',  
  5.   `PROVINCE_CODE` CHAR(4) NOT NULL COMMENT '所在省份代码》非空',  
  6.   `STATE` CHAR(1) NOT NULL DEFAULT '1' COMMENT '城市状态》非空。0:无效城市;1:有效城市',  
  7.   `CITY_NAME` VARCHAR(50) NOT NULL COMMENT '城市名称',  
  8.   `CITY` VARCHAR(50) NOT NULL COMMENT '所在地级市名称',  
  9.   `PROVINCE` VARCHAR(50) NOT NULL COMMENT '所在省份名称',  
  10.   PRIMARY KEY (`ID`)  
  11. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF8 COMMENT '全国城市表';  

注意存储引擎不可以是不支持事务的 MyISAM(InnoDB 和 MyISAM 的区别参考博客《MySql 存储引擎的选取》)。
表 CITY_CODE_CN 映射到的 xml 文件 com.defonds.bdp.city.mapper.CityMapper.xml:
[html] 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 namespace="com.defonds.bdp.city.mapper.CityMapper" >  
  4.      
  5.     <insert id="insertCity" parameterType="com.defonds.bdp.city.bean.City">  
  6.         insert into city_code_cn (city_code, city_jb, province_code, city_name, city, province)  
  7.         values ( #{cityCode,jdbcType=CHAR}, #{cityJb,jdbcType=INTEGER}, #{provinceCode,jdbcType=CHAR},  
  8.         #{cityName,jdbcType=VARCHAR}, #{city,jdbcType=VARCHAR}, #{province,jdbcType=VARCHAR} )  
  9.     </insert>  
  10. </mapper>  

表 CITY_CODE_CN 映射到的 java 文件 com.defonds.bdp.city.bean.City.java:
[java] view plain copy
 print?
  1. /** 
  2.  * File Name:City.java 
  3.  * 
  4.  * Copyright Defonds Corporation 2015  
  5.  * All Rights Reserved 
  6.  * 
  7.  */  
  8. package com.defonds.bdp.city.bean;  
  9.   
  10. import org.codehaus.jackson.map.annotate.JsonSerialize;  
  11.   
  12. import com.fasterxml.jackson.databind.PropertyNamingStrategy;  
  13. import com.fasterxml.jackson.databind.annotation.JsonNaming;  
  14.   
  15. /** 
  16.  *  
  17.  * Project Name:bdp 
  18.  * Type Name:City 
  19.  * Type Description: 
  20.  *      1. annotation @JsonSerialize, Entity serialized to json 
  21.  *      2. annotation @JsonNaming, convert Higher case to under score  
  22.  *          and Lower case, example: cityCode,  
  23.  *          after json naming convert, will be city_code 
  24.  * Author:Defonds 
  25.  * Create Date:2015-08-28 
  26.  * @version  
  27.  *  
  28.  */  
  29. @JsonSerialize  
  30. @JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class)    
  31. public class City {  
  32.     private String id;  
  33.     private String cityCode;  
  34.     private String provinceCode;  
  35.     private String cityName;  
  36.     private String cityJb;  
  37.     private String city;  
  38.     private String province;  
  39.     public String getId() {  
  40.         return id;  
  41.     }  
  42.     public void setId(String id) {  
  43.         this.id = id;  
  44.     }  
  45.     public String getCityCode() {  
  46.         return cityCode;  
  47.     }  
  48.     public void setCityCode(String cityCode) {  
  49.         this.cityCode = cityCode;  
  50.     }  
  51.     public String getCityName() {  
  52.         return cityName;  
  53.     }  
  54.     public void setCityName(String cityName) {  
  55.         this.cityName = cityName;  
  56.     }  
  57.     public String getCityJb() {  
  58.         return cityJb;  
  59.     }  
  60.     public void setCityJb(String cityJb) {  
  61.         this.cityJb = cityJb;  
  62.     }  
  63.     public String getCity() {  
  64.         return city;  
  65.     }  
  66.     public void setCity(String city) {  
  67.         this.city = city;  
  68.     }  
  69.     public String getProvince() {  
  70.         return province;  
  71.     }  
  72.     public void setProvince(String province) {  
  73.         this.province = province;  
  74.     }  
  75.     public String getProvinceCode() {  
  76.         return provinceCode;  
  77.     }  
  78.     public void setProvinceCode(String provinceCode) {  
  79.         this.provinceCode = provinceCode;  
  80.     }  
  81. }  

处理所有 MyBatis 的配置文件的配置文件 mybatis-config.xml:
[html] 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.         <setting name="mapUnderscoreToCamelCase" value="true"/>  
  6.     </settings>  
  7. </configuration>  

无须将每个小配置单独导入,mapUnderscoreToCamelCase 是把 db CITY_CODE_CN 的下划线字段和 java 实体 bean 的驼峰标识相互转化。
Spring 上下文配置文件 bdp-applicationContext.xml:
[html] view plain copy
 print?
  1. <beans xmlns="http://www.springframework.org/schema/beans"  
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  3.     xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:aop="http://www.springframework.org/schema/aop"   
  5.     xmlns:tx="http://www.springframework.org/schema/tx"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
  7.         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd  
  8.         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  
  9.         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">  
  10.           
  11.     <!-- mybatis related... start -->  
  12.     <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  13.         <property name="locations">  
  14.             <list>  
  15.                 <!-- 这里支持多种寻址方式:classpath和file -->  
  16.                 <value>classpath:jdbc.properties</value>  
  17.                 <!-- 推荐使用file的方式引入,这样可以将配置和代码分离 -->  
  18.             </list>  
  19.         </property>  
  20.     </bean>  
  21.     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource "  
  22.         destroy-method="close">  
  23.         <property name="driverClass" value="com.mysql.jdbc.Driver" />  
  24.         <property name="jdbcUrl" value="jdbc:mysql://${jdbc.host}:${jdbc.port}/${jdbc.database}?useUnicode=true&amp;characterEncoding=utf8" />  
  25.         <property name="user" value="${jdbc.username}" />  
  26.         <property name="password" value="${jdbc.password}" />  
  27.         <property name="acquireIncrement" value="1" />  
  28.         <property name="initialPoolSize" value="5" />  
  29.         <property name="maxPoolSize" value="20" />  
  30.         <property name="minPoolSize" value="5" />  
  31.         <property name="maxStatements" value="100" />  
  32.         <property name="testConnectionOnCheckout" value="true" />  
  33.     </bean>  
  34.     <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
  35.         <property name="dataSource" ref="dataSource" />  
  36.         <property name="configLocation" value="/WEB-INF/classes/mybatis-config.xml" />  
  37.     </bean>  
  38.     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  
  39.         <property name="basePackage" value="com.defonds.bdp.*.mapper"/>  
  40.     </bean>  
  41.     <!-- mybatis related... end -->  
  42.   
  43.     <!-- class annotation related... start -->  
  44.     <context:component-scan base-package="com.defonds.bdp.*.service" />  
  45.     <!-- class annotation related... end -->  
  46.     <context:annotation-config />  
  47.       
  48.     <!-- transaction config related... start -->  
  49.     <tx:annotation-driven transaction-manager="transactionManager" />  
  50.     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
  51.         <property name="dataSource" ref="dataSource" />  
  52.     </bean>  
  53.     <!-- transaction config related... end -->  
  54. </beans>  

Spring MVC 配置文件 bdpmvc-servlet.xml:
[html] 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:p="http://www.springframework.org/schema/p"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  6.    
  7. http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
  8. http://www.springframework.org/schema/context   
  9. http://www.springframework.org/schema/context/spring-context-4.0.xsd">  
  10.    
  11.     <!-- class annotation related... start -->  
  12.     <context:component-scan base-package="com.defonds.bdp.*.controller" />  
  13.     <!-- class annotation related... end -->  
  14.    
  15.     <!-- jsp page related... start -->  
  16.     <bean id="viewResolver"  
  17.         class="org.springframework.web.servlet.view.UrlBasedViewResolver">  
  18.         <property name="viewClass"  
  19.             value="org.springframework.web.servlet.view.JstlView" />  
  20.         <property name="prefix" value="/WEB-INF/jsp/" />  
  21.         <property name="suffix" value=".jsp" />  
  22.     </bean>  
  23.     <!-- jsp page related... end -->  
  24.       
  25.     <!-- rest json related... start -->  
  26.     <bean id="mappingJacksonHttpMessageConverter"  
  27.           class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">  
  28.         <property name="supportedMediaTypes">  
  29.             <list>  
  30.                 <value>application/json;charset=UTF-8</value>  
  31.             </list>  
  32.         </property>  
  33.     </bean>  
  34.     <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
  35.         <property name="messageConverters">  
  36.             <list>  
  37.                 <ref bean="mappingJacksonHttpMessageConverter"/>  
  38.             </list>  
  39.         </property>  
  40.     </bean>  
  41.     <!-- rest json related... end -->  
  42. </beans>  

将所有 Spring 配置文件注册到 web.xml:
[html] view plain copy
 print?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xmlns="http://java.sun.com/xml/ns/javaee"  
  4.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
  5.     id="WebApp_ID" version="3.0">  
  6.     <display-name>bdp</display-name>  
  7.     <welcome-file-list>  
  8.         <welcome-file>index.jsp</welcome-file>  
  9.     </welcome-file-list>  
  10.   
  11.     <context-param>  
  12.         <param-name>contextConfigLocation</param-name>  
  13.         <param-value>/WEB-INF/classes/*-applicationContext.xml</param-value>  
  14.     </context-param>  
  15.     <listener>  
  16.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  17.     </listener>  
  18.   
  19.     <servlet>  
  20.         <servlet-name>bdpmvc</servlet-name>  
  21.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  22.         <init-param>  
  23.             <param-name>contextConfigLocation</param-name>  
  24.             <param-value>/WEB-INF/classes/*-servlet.xml</param-value>  
  25.         </init-param>  
  26.         <load-on-startup>1</load-on-startup>  
  27.     </servlet>  
  28.     <servlet-mapping>  
  29.         <servlet-name>bdpmvc</servlet-name>  
  30.         <url-pattern>*.json</url-pattern>  
  31.         <url-pattern>*.html</url-pattern>  
  32.     </servlet-mapping>  
  33. </web-app>  

数据库连接配置文件 jdbc.properties:
[plain] view plain copy
 print?
  1. jdbc.host=192.168.1.30  
  2. jdbc.database=bdpdb  
  3. jdbc.port=3306  
  4. jdbc.username=bdpdev  
  5. jdbc.password=xqder798  

log4j 配置文件 log4j.properties:
[plain] view plain copy
 print?
  1. # Global logging configuration  
  2. log4j.rootLogger=WARN,stdout  
  3. log4j.logger.com.defonds=DEBUG  
  4.    
  5. log4j.rootLogger=WARN,stdout  
  6.    
  7. # Console output...  
  8. log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
  9. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
  10. log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c:%L - %m%n  

测试用 mapper 文件 com.defonds.bdp.city.mapper.CityMapper.java:
[java] view plain copy
 print?
  1. /** 
  2.  * File Name:CityMapper.java 
  3.  * 
  4.  * Copyright Defonds Corporation 2015  
  5.  * All Rights Reserved 
  6.  * 
  7.  */  
  8. package com.defonds.bdp.city.mapper;  
  9.   
  10. import com.defonds.bdp.city.bean.City;  
  11.   
  12. /** 
  13.  *  
  14.  * Project Name:bdp 
  15.  * Type Name:CityMapper 
  16.  * Type Description: 
  17.  * Author:Defonds 
  18.  * Create Date:2015-08-31 
  19.  * @version  
  20.  *  
  21.  */  
  22. public interface CityMapper {  
  23.     public void insertCity(City city);  
  24. }  

服务层处理类 com.defonds.bdp.city.service.CityService.java:
[java] view plain copy
 print?
  1. /** 
  2.  * File Name:CityService.java 
  3.  * 
  4.  * Copyright Defonds Corporation 2015  
  5.  * All Rights Reserved 
  6.  * 
  7.  */  
  8. package com.defonds.bdp.city.service;  
  9.   
  10. import org.apache.commons.logging.Log;  
  11. import org.apache.commons.logging.LogFactory;  
  12. import org.springframework.beans.factory.annotation.Autowired;  
  13. import org.springframework.stereotype.Service;  
  14. import org.springframework.transaction.annotation.Propagation;  
  15. import org.springframework.transaction.annotation.Transactional;  
  16.   
  17. import com.defonds.bdp.city.bean.City;  
  18. import com.defonds.bdp.city.mapper.CityMapper;  
  19.   
  20. /** 
  21.  *  
  22.  * Project Name:bdp 
  23.  * Type Name:CityService 
  24.  * Type Description: 
  25.  * Author:Defonds 
  26.  * Create Date:2015-08-31 
  27.  * @version  
  28.  *  
  29.  */  
  30. @Service  
  31. @Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)  
  32. public class CityService {   
  33.     private final Log logger = LogFactory.getLog(this.getClass());  
  34.     @Autowired  
  35.     private CityMapper cityMapper;  
  36.       
  37.     public void insertCity() {  
  38.         City city = new City();  
  39.         city.setCityCode("1100");  
  40.         city.setCityJb("1");   
  41.         city.setProvinceCode("1100");  
  42.         city.setCityName("天津市");  
  43.         city.setCity("天津市");  
  44.         city.setProvince("天津市");  
  45.         logger.debug("before insert the first city");  
  46.         cityMapper.insertCity(city);  
  47.         logger.debug("after insert the first city, and before insert the second city");  
  48.         cityMapper.insertCity(new City()); // this will throw an exception  
  49.         logger.debug("after insert the second city");  
  50.     }  
  51. }  

最后的是 mvc controller 文件 com.defonds.bdp.city.controller.CityController.java:
[java] view plain copy
 print?
  1. /** 
  2.  * File Name:CityController.java 
  3.  * 
  4.  * Copyright Defonds Corporation 2015  
  5.  * All Rights Reserved 
  6.  * 
  7.  */  
  8. package com.defonds.bdp.city.controller;  
  9.   
  10. import java.util.ArrayList;  
  11. import java.util.List;  
  12.   
  13. import org.apache.commons.logging.Log;  
  14. import org.apache.commons.logging.LogFactory;  
  15. import org.springframework.beans.factory.annotation.Autowired;  
  16. import org.springframework.stereotype.Controller;  
  17. import org.springframework.web.bind.annotation.RequestMapping;  
  18. import org.springframework.web.bind.annotation.ResponseBody;  
  19. import org.springframework.web.servlet.ModelAndView;  
  20.   
  21. import com.defonds.bdp.city.bean.City;  
  22. import com.defonds.bdp.city.service.CityService;  
  23.   
  24. /** 
  25.  *  
  26.  * Project Name:bdp 
  27.  * Type Name:CityController 
  28.  * Type Description: 
  29.  * Author:Defonds 
  30.  * Create Date:2015-08-27 
  31.  * @version  
  32.  *  
  33.  */  
  34. @Controller  
  35. @RequestMapping("/city")  
  36. public class CityController {  
  37.     private final Log logger = LogFactory.getLog(this.getClass());  
  38.       
  39.     @Autowired  
  40.     private CityService cityService;  
  41.       
  42.     @RequestMapping("/welcome")  
  43.     public ModelAndView helloWorld() {  
  44.    
  45.         String message = "<br><div style='text-align:center;'>"  
  46.                 + "<h3>********** Hello World, Spring MVC Tutorial</h3>This message is coming from CityController.java **********</div><br><br>";  
  47.         return new ModelAndView("welcome""message", message);  
  48.     }  
  49.       
  50.     /** 
  51.      * provinceCities(这里用一句话描述这个方法的作用) 
  52.      * TODO(这里描述这个方法适用条件 – 可选) 
  53.      * TODO(这里描述这个方法的执行流程 – 可选) 
  54.      * TODO(这里描述这个方法的使用方法 – 可选) 
  55.      * TODO(这里描述这个方法的注意事项 – 可选) 
  56.      * @param   name 
  57.      * @param  @return    设定文件 
  58.      * @return String    DOM对象 
  59.      * @Exception 异常对象 
  60.      * @since  CodingExample Ver(编码范例查看) 1.0.0 
  61.      */   
  62.     @RequestMapping("/province/cities")  
  63.     @ResponseBody  
  64.     public Object provinceCities() {  
  65.           
  66.         List<City> list = new ArrayList<City>();  
  67.         City city1 = new City();  
  68.         city1.setId("126");  
  69.         city1.setCity("济南市");  
  70.         city1.setCityCode("4510");  
  71.         city1.setCityJb("省级");  
  72.         city1.setCityName("济南市");  
  73.         city1.setProvince("山东省");  
  74.           
  75.         list.add(city1);  
  76.           
  77.         City city2 = new City();  
  78.         city2.setId("127");  
  79.         city2.setCity("济南市");  
  80.         city2.setCityCode("4510");  
  81.         city2.setCityJb("县级");  
  82.         city2.setCityName("商河县");  
  83.         city2.setProvince("山东省");  
  84.           
  85.         list.add(city2);  
  86.           
  87.         return list;  
  88.     }  
  89.       
  90.     @RequestMapping("/create")  
  91.     @ResponseBody  
  92.     public Integer create() {  
  93.         try {  
  94.             this.cityService.insertCity();  
  95.             return 1;  
  96.         } catch (Exception e) {  
  97.             logger.error(e);  
  98.         }  
  99.         return 0;  
  100.           
  101.     }  
  102. }  

我们来看一下我们的 dbp 项目结构:
dbp 项目结构.png

事务测试

访问事务测试页面如下:
访问事务测试页面.png
控制台打印日志:
2015-08-31 18:29:13 DEBUG com.defonds.bdp.city.service.CityService:45 - before insert the first city
2015-08-31 18:29:13 DEBUG com.defonds.bdp.city.mapper.CityMapper.insertCity:54 - ==>  Preparing: insert into city_code_cn (city_code, city_jb, province_code, city_name, city, province) values ( ?, ?, ?, ?, ?, ? ) 
2015-08-31 18:29:13 DEBUG com.defonds.bdp.city.mapper.CityMapper.insertCity:54 - ==> Parameters: 1100(String), 1(String), 1100(String), 天津市(String), 天津市(String), 天津市(String)
2015-08-31 18:29:13 DEBUG com.defonds.bdp.city.mapper.CityMapper.insertCity:54 - <==    Updates: 1
2015-08-31 18:29:13 DEBUG com.defonds.bdp.city.service.CityService:47 - after insert the first city, and before insert the second city
2015-08-31 18:29:13 DEBUG com.defonds.bdp.city.mapper.CityMapper.insertCity:54 - ==>  Preparing: insert into city_code_cn (city_code, city_jb, province_code, city_name, city, province) values ( ?, ?, ?, ?, ?, ? ) 
2015-08-31 18:29:13 DEBUG com.defonds.bdp.city.mapper.CityMapper.insertCity:54 - ==> Parameters: null, null, null, null, null, null
2015-08-31 18:29:13 ERROR com.defonds.bdp.city.controller.CityController:97 - org.springframework.dao.DataIntegrityViolationException: 
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'CITY_CODE' cannot be null
### The error may involve com.defonds.bdp.city.mapper.CityMapper.insertCity-Inline
### The error occurred while setting parameters
### SQL: insert into city_code_cn (city_code, city_jb, province_code, city_name, city, province)         values ( ?, ?, ?,         ?, ?, ? )
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'CITY_CODE' cannot be null
; SQL []; Column 'CITY_CODE' cannot be null; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'CITY_CODE' cannot be null

查看 db 的 CITY_CODE_CN 表,没有新记录插入,spring 4 + mybatis 3 成功。

源码下载

本文侧重讲 spring ioc、orm 和 mybatis 的事务集成,有评论问关于 spring mvc 的相关配置,请参考另一篇专门讲 spring mvc 搭建的博客《零基础搭建 spring mvc 4 项目(本文基于 Servlet 3.0)》,本文就是在该文基础上进行进一步添加了 service 和 dao 层的扩展而已。本文示例项目源码已共享到 CSDN 资源,有兴趣的朋友可以去下载下来参考:http://download.csdn.net/detail/defonds/9068147

参考资料

  • http://edwin.baculsoft.com/2015/01/a-simple-spring-4-and-mybatis-transaction-example/
  • http://zhaozhiming.github.io/blog/2014/11/15/spring4-and-mybatis/
0 0
原创粉丝点击