maven构建项目,详见笔记“maven构建多模块工程”
开发工具:IntelliJ IDEA
JDK版本:1.8
Maven版本:3.3.9
项目结构:
SpringMybatisJtaModel/src/main/resources/mapper存放mybatis生成的mapper.xml文件
jdbc.properties文件内容
- #jdbc_driverClassName=com.mysql.cj.jdbc.Driver
- #jdbc_driverClassName=com.mysql.jdbc.Driver
- #jdbc_url=jdbc:mysql://chaomeiman.peterren.net:3306/catering?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8
- #jdbc_username=root
- #jdbc_password=P@ssw0rd
- #-------------user-----------------#
- userjdbc_driverClassName=com.mysql.cj.jdbc.MysqlXADataSource
- userjdbc_url=jdbc:mysql://192.168.1.10:3308/yxs_user_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&pinGlobalTxToPhysicalConnection=true&nullNamePatternMatchesAll=true
- userjdbc_username=root
- #userjdbc_password=P@ssw0rd
- userjdbc_password=walletroot
- #-------------主数据源-------------#
- jdbc_driverClassName=com.mysql.cj.jdbc.MysqlXADataSource
- jdbc_url=jdbc:mysql://192.168.1.10:3308/yxs_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&pinGlobalTxToPhysicalConnection=true&nullNamePatternMatchesAll=true
- jdbc_username=root
- #jdbc_password=P@ssw0rd
- jdbc_password=walletroot
- #-------------log-------------#
- logjdbc_driverClassName=com.mysql.jdbc.Driver
- logjdbc_url=jdbc:mysql://192.168.1.10:3308/yxs_log_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&pinGlobalTxToPhysicalConnection=true&nullNamePatternMatchesAll=true
- logjdbc_username=root
- #logjdbc_password=P@ssw0rd
- logjdbc_password=walletroot
- #-------------report-------------#
- reportjdbc_driverClassName=com.mysql.jdbc.Driver
- reportjdbc_url=jdbc:mysql://192.168.1.10:3308/yxs_report_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&pinGlobalTxToPhysicalConnection=true&nullNamePatternMatchesAll=true
- reportjdbc_username=root
- #reportjdbc_password=P@ssw0rd
- reportjdbc_password=walletroot
-
- # 菜单数据库
- meal_dataSourceClassName=com.mysql.cj.jdbc.MysqlXADataSource
- mealjdbc_driverClassName=com.mysql.cj.jdbc.Driver
- mealjdbc_url=jdbc:mysql://192.168.1.10:3308/yxs_meal_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&pinGlobalTxToPhysicalConnection=true&nullNamePatternMatchesAll=true
- mealjdbc_username=root
- mealjdbc_password=walletroot
-
-
- jdbc_properties=file:\\\\D:\\ideaWork\\Catering\\src\\main\resources\\conf\\jdbc.properties
- UseSSL=true
- RequireSSL=true
- VerifyServerCertificate=true
- Logger="com.mysql.jdbc.log.StandardLogger"
- ClientCertificateKeyStoreType="JKS"
- ClientCertificateKeyStoreUrl=KEYSTORE_PATH
- ClientCertificateKeyStorePassword=KEYSTORE_PASSWORD
- TrustCertificateKeyStoreType="JKS"
- TrustCertificateKeyStoreUrl=TRUSTORE_PATH
- TrustCertificateKeyStorePassword=TRUSTORE_PASSWORD
1、pom文件添加springMVC、jta、mybatis等需要的jar
- <dependencies>
- <!-- junit测试包 -->
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- </dependency>
- <!-- spring核心包 -->
- <!-- springframe start -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-web</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-oxm</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-tx</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-jdbc</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-aop</artifactId>
- </dependency>
- <dependency>
- <groupId>org.aspectj</groupId>
- <artifactId>aspectjweaver</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context-support</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.codehaus.jackson</groupId>
- <artifactId>jackson-mapper-asl</artifactId>
- </dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-core</artifactId>
- </dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- </dependency>
-
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-annotations</artifactId>
- </dependency>
- <!-- springframe end -->
-
- <!--jta包-->
- <dependency>
- <groupId>javax.transaction</groupId>
- <artifactId>jta</artifactId>
- <version>1.1</version>
- </dependency>
-
- <!--atomikos包-->
- <!--atomikos start-->
- <dependency>
- <groupId>com.atomikos</groupId>
- <artifactId>atomikos-util</artifactId>
- <version>${atomikos.version}</version>
- </dependency>
- <dependency>
- <groupId>com.atomikos</groupId>
- <artifactId>transactions</artifactId>
- <version>${atomikos.version}</version>
- </dependency>
- <dependency>
- <groupId>com.atomikos</groupId>
- <artifactId>transactions-jta</artifactId>
- <version>${atomikos.version}</version>
- </dependency>
- <dependency>
- <groupId>com.atomikos</groupId>
- <artifactId>transactions-jdbc</artifactId>
- <version>${atomikos.version}</version>
- </dependency>
- <dependency>
- <groupId>com.atomikos</groupId>
- <artifactId>transactions-api</artifactId>
- <version>${atomikos.version}</version>
- </dependency>
- <!--atomikos end-->
-
- <!-- mybatis核心包 -->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>${mybatis.version}</version>
- </dependency>
-
- <!-- mybatis/spring包 -->
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis-spring</artifactId>
- <version>${mybatis-spring.version}</version>
- </dependency>
-
- <!-- mysql驱动包 -->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>${mysql.connector.version}</version>
- </dependency>
-
- <!--http-->
- <dependency>
- <groupId>org.apache.httpcomponents</groupId>
- <artifactId>httpclient</artifactId>
- </dependency>
-
- <dependency>
- <groupId>commons-codec</groupId>
- <artifactId>commons-codec</artifactId>
- <version>1.10</version>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
- <scope>provided</scope>
- <version>3.0.1</version>
- </dependency>
-
- <!-- 日志文件管理包 -->
- <!-- log start -->
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- </dependency>
- <!-- log end -->
- </dependencies>
2、创建applicationContext.xml文件
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-4.3.xsd
- http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-4.3.xsd" default-autowire="byName">
-
- <!-- 1.扫描注解-->
- <context:component-scan base-package="controller"></context:component-scan>
- <context:component-scan base-package="mapper.*"></context:component-scan>
- <context:component-scan base-package="model.*"></context:component-scan>
- <context:component-scan base-package="service.impl"></context:component-scan>
- <!--2.注解驱动-->
- <mvc:annotation-driven></mvc:annotation-driven>
-
- </beans>
3、创建mybatis-config.xml文件
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
-
- <settings>
- <!-- Globally enables or disables any caches configured in any mapper under this configuration -->
- <setting name="cacheEnabled" value="true"/>
- <!-- Sets the number of seconds the driver will wait for a response from the database -->
- <setting name="defaultStatementTimeout" value="3000"/>
- <!-- Enables automatic mapping from classic database column names A_COLUMN to camel case classic Java property names aColumn -->
- <setting name="mapUnderscoreToCamelCase" value="true"/>
- <!-- Allows JDBC support for generated keys. A compatible driver is required.
- This setting forces generated keys to be used if set to true,
- as some drivers deny compatibility but still work -->
- <setting name="useGeneratedKeys" value="true"/>
- <!--解决,查询返回结果含null,没有对应字段值问题-->
- <setting name="callSettersOnNulls" value="true"/>
- </settings>
-
- <!-- Continue going here -->
- <typeAliases>
- <package name="model.user.*"/>
- </typeAliases>
- </configuration>
4、创建spring-mvc.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns:p="http://www.springframework.org/schema/p"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns="http://www.springframework.org/schema/beans"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
-
- <!-- 对模型视图添加前后缀 -->
- <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
- p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>
-
- <bean id="jacksonMessageChangerString"
- class="org.springframework.http.converter.StringHttpMessageConverter">
- <property name="supportedMediaTypes">
- <list>
- <value>text/plain;charset=UTF-8</value>
- </list>
- </property>
- </bean>
- <bean id="jacksonMessageChanger"
- class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
- <property name="supportedMediaTypes">
- <list>
- <value>text/html;charset=UTF-8</value>
- <value>text/plain;charset=UTF-8</value>
- <value>text/json;charset=UTF-8</value>
- <value>application/json;charset=UTF-8</value>
- </list>
- </property>
- </bean>
- <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
- <property name="messageConverters">
- <list>
- <ref bean="jacksonMessageChanger"/>
- <ref bean="jacksonMessageChangerString"/>
- </list>
- </property>
- </bean>
- </beans>
-
- 5、创建spring-mybatis.xml
-
-
-
- <?xml version="1.0" encoding="GBK"?>
- <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xmlns:util="http://www.springframework.org/schema/util"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns="http://www.springframework.org/schema/beans"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
- http://www.springframework.org/schema/util
- http://www.springframework.org/schema/util/spring-util-4.3.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
-
- <!-- 引入jdbc配置文件 -->
- <bean
- class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/>
- <property name="ignoreResourceNotFound" value="true"/>
- <property name="locations">
- <list>
- <!-- standard config -->
- <value>classpath:conf/jdbc.properties</value>
- </list>
- </property>
- </bean>
- <!-- 配置数据源 -->
- <!-- 主数据库 -->
- <!--<bean id="dataSourceMain" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init"
- destroy-method="close">
- <!–value只要两个数据源不同就行,随便取名–>
- <property name="uniqueResourceName" value="mysql/sitestMain"/>
- <property name="xaDataSourceClassName" value="com.mysql.cj.jdbc.MysqlXADataSource"/>
- <property name="xaProperties">
- <props>
- <!–<prop key="driverClassName">${jdbc.driverClassName1}</prop>–>
- <prop key="url">${jdbc_url}</prop>
- <prop key="user">${jdbc_username}</prop>
- <prop key="password">${jdbc_password}</prop>
- </props>
- </property>
- <!–<property name="pinGlobalTxToPhysicalConnection" value="true"/>–>
- <property name="maxLifetime" value="0"/>
- <property name="minPoolSize" value="1"/>
- <property name="maxPoolSize" value="10"/>
- <property name="poolSize" value="1"/>
- </bean>-->
-
- <!-- 用户数据库 -->
- <bean id="dataSourceUser" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init"
- destroy-method="close">
- <!-- value只要两个数据源不同就行,随便取名 -->
- <property name="uniqueResourceName" value="mysql/sitestUser"/>
- <property name="xaDataSourceClassName" value="com.mysql.cj.jdbc.MysqlXADataSource"/>
- <property name="xaProperties">
- <props>
- <!--<prop key="driverClassName">${userjdbc_driverClassName}</prop>-->
- <prop key="url">${userjdbc_url}</prop>
- <prop key="user">${userjdbc_username}</prop>
- <prop key="password">${userjdbc_password}</prop>
- </props>
- </property>
- <!--<property name="pinGlobalTxToPhysicalConnection" value="true"/>-->
- <property name="maxLifetime" value="0"/>
- <property name="minPoolSize" value="1"/>
- <property name="maxPoolSize" value="10"/>
- <property name="poolSize" value="1"/>
-
- </bean>
-
- <!-- log数据库 -->
- <!--<bean id="dataSourceLog" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init"
- destroy-method="close">
- <!– value只要两个数据源不同就行,随便取名 –>
- <property name="uniqueResourceName" value="mysql/sitestLog"/>
- <property name="xaDataSourceClassName" value="com.mysql.cj.jdbc.MysqlXADataSource"/>
- <property name="xaProperties">
- <props>
- <!–<prop key="driverClassName">${logjdbc_driverClassName}</prop>–>
- <prop key="url">${logjdbc_url}</prop>
- <prop key="user">${logjdbc_username}</prop>
- <prop key="password">${logjdbc_password}</prop>
- </props>
- </property>
- <!–<property name="pinGlobalTxToPhysicalConnection" value="true"/>–>
- <property name="maxLifetime" value="0"/>
- <property name="minPoolSize" value="1"/>
- <property name="maxPoolSize" value="10"/>
- <property name="poolSize" value="1"/>
- </bean>-->
-
- <!-- report数据库 -->
- <!--<bean id="dataSourceReport" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init"
- destroy-method="close">
- <!– value只要两个数据源不同就行,随便取名 –>
- <property name="uniqueResourceName" value="mysql/sitestReport"/>
- <property name="xaDataSourceClassName" value="com.mysql.cj.jdbc.MysqlXADataSource"/>
- <property name="xaProperties">
- <props>
- <!–<prop key="driverClassName">${logjdbc_driverClassName}</prop>–>
- <prop key="url">${reportjdbc_url}</prop>
- <prop key="user">${reportjdbc_username}</prop>
- <prop key="password">${reportjdbc_password}</prop>
- </props>
- </property>
- <!–<property name="pinGlobalTxToPhysicalConnection" value="true"/>–>
- <property name="maxLifetime" value="0"/>
- <property name="minPoolSize" value="1"/>
- <property name="maxPoolSize" value="10"/>
- <property name="poolSize" value="1"/>
- </bean>-->
- <!-- meal数据库 -->
- <!--<bean id="dataSourceMeal" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init"
- destroy-method="close">
- <!– value只要两个数据源不同就行,随便取名 –>
- <property name="uniqueResourceName" value="mysql/sitestMeal"/>
- <property name="xaDataSourceClassName" value="com.mysql.cj.jdbc.MysqlXADataSource"/>
- <property name="xaProperties">
- <props>
- <!–<prop key="driverClassName">${mealjdbc_driverClassName}</prop>–>
- <prop key="url">${mealjdbc_url}</prop>
- <prop key="user">${mealjdbc_username}</prop>
- <prop key="password">${mealjdbc_password}</prop>
- </props>
- </property>
- <!–<property name="pinGlobalTxToPhysicalConnection" value="true"/>–>
- <property name="maxLifetime" value="0"/>
- <property name="minPoolSize" value="1"/>
- <property name="maxPoolSize" value="10"/>
- <property name="poolSize" value="1"/>
- </bean>-->
-
- <!-- 配置SqlSessionFactoryBean -->
- <!-- <bean id="sqlSessionFactoryMain"
- class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="transactionFactory">
- <bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory"/>
- </property>
- <!– configLocation为mybatis属性 mapperLocations为所有mapper–>
- <property name="configLocation" value="classpath:conf/mybatis-config.xml"></property>
- <property name="mapperLocations" value="classpath:mapper/main/*.xml"></property>
- <property name="dataSource" ref="dataSourceMain"/>
- </bean>-->
-
- <bean id="sqlSessionFactoryUser"
- class="org.mybatis.spring.SqlSessionFactoryBean">
-
- <property name="transactionFactory">
- <bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory"/>
- </property>
- <!-- configLocation为mybatis属性 mapperLocations为所有mapper-->
- <property name="configLocation" value="classpath:conf/mybatis-config.xml"></property>
- <property name="mapperLocations" value="classpath:mapper/user/*.xml"></property>
- <property name="dataSource" ref="dataSourceUser"/>
- </bean>
- <!--<bean id="sqlSessionFactoryLog"
- class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="transactionFactory">
- <bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory"/>
- </property>
- <!– configLocation为mybatis属性 mapperLocations为所有mapper–>
- <property name="configLocation" value="classpath:conf/mybatis-config.xml"></property>
- <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
- <property name="dataSource" ref="dataSourceLog"/>
- </bean>
- <bean id="sqlSessionFactoryReport"
- class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="transactionFactory">
- <bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory"/>
- </property>
- <!– configLocation为mybatis属性 mapperLocations为所有mapper–>
- <property name="configLocation" value="classpath:conf/mybatis-config.xml"></property>
- <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
- <property name="dataSource" ref="dataSourceReport"/>
- </bean>
- <bean id="sqlSessionFactoryMeal"
- class="org.mybatis.spring.SqlSessionFactoryBean">
- <property name="transactionFactory">
- <bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory"/>
- </property>
- <!– configLocation为mybatis属性 mapperLocations为所有mapper–>
- <property name="configLocation" value="classpath:conf/mybatis-config.xml"></property>
- <property name="mapperLocations" value="classpath:mapper/*.xml"></property>
- <property name="dataSource" ref="dataSourceMeal"/>
- </bean>-->
- <!-- configLocation为mybatis属性 mapperLocations为所有mapper-->
-
- <!-- spring与mybatis整合配置,扫描所有dao -->
- <!--<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
- p:basePackage="mapper"
- p:sqlSessionFactoryBeanName="sqlSessionFactoryMain"/>-->
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
- p:basePackage="mapper"
- p:sqlSessionFactoryBeanName="sqlSessionFactoryUser"/>
- <!--<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
- p:basePackage="mapper"
- p:sqlSessionFactoryBeanName="sqlSessionFactoryLog"/>
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
- p:basePackage="mapper"
- p:sqlSessionFactoryBeanName="sqlSessionFactoryReport"/>
- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
- p:basePackage="mapper"
- p:sqlSessionFactoryBeanName="sqlSessionFactoryMeal"/>-->
-
-
- <!-- JTA事务管理器 -->
- <bean id="userTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp"
- init-method="init" destroy-method="shutdownForce" >
- <constructor-arg>
- <!-- IMPORTANT: specify all Atomikos properties here -->
- <props>
- <prop key="com.atomikos.icatch.no_file">true</prop>
- <prop key="com.atomikos.icatch.service">com.atomikos.icatch.standalone.UserTransactionServiceFactory
- </prop>
- <prop key="com.atomikos.icatch.output_dir">target/</prop>
- <prop key="com.atomikos.icatch.log_base_dir">target/</prop>
- </props>
- </constructor-arg>
- </bean>
- <bean id="atomikosTransactionManager"
- class="com.atomikos.icatch.jta.UserTransactionManager"
- init-method="init" destroy-method="close"
- depends-on="userTransactionService">
- <!-- IMPORTANT: disable startup because the userTransactionService above does this -->
- <property name="startupTransactionService" value="false"/>
- <!-- 当调用close时, 我们应该强制交易终止还是不终止? -->
- <property name="forceShutdown" value="false"/>
- </bean>
- <bean id="atomikosUserTransaction"
- class="com.atomikos.icatch.jta.UserTransactionImp"
- depends-on="userTransactionService">
- <property name="transactionTimeout" value="300"/>
- </bean>
- <!--设置Atomikos的系统参数并-->
- <bean id="setMyAtomikosSystemProps"
- class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
- <property name="targetObject">
- <!-- System.getProperties() -->
- <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
- <property name="targetClass" value="java.lang.System"/>
- <property name="targetMethod" value="getProperties"/>
- </bean>
- </property>
- <property name="targetMethod" value="putAll"/>
- <property name="arguments">
- <!-- The new Properties -->
- <util:properties>
- <prop key="com.atomikos.icatch.file">classpath:conf/transactions.properties
- </prop>
- <prop key="com.atomikos.icatch.hide_init_file_path">true</prop>
- </util:properties>
- </property>
- </bean>
- <!--声明JTA的事务管理机制-->
- <bean id="jtaTransactionManager"
- class="org.springframework.transaction.jta.JtaTransactionManager"
- depends-on="userTransactionService">
- <property name="transactionManager" ref="atomikosTransactionManager"/>
- <property name="userTransaction" ref="atomikosUserTransaction"/>
- <!-- 必须设置,否则程序出现异常 JtaTransactionManager does not support custom isolation levels by default -->
- <property name="allowCustomIsolationLevels" value="true"/>
- </bean>
- <!--声明atomikos的事务代理-->
- <bean id="atomikosTransactionProxy"
- class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
- abstract="true">
- <property name="transactionManager">
- <ref bean="jtaTransactionManager"/>
- </property>
- <property name="transactionAttributes">
- <props>
- <prop key="*">PROPAGATION_REQUIRED,-Exception</prop>
- </props>
- </property>
- </bean>
-
- <!--支持 @AspectJ 标记-->
- <!--<aop:aspectj-autoproxy />-->
- <!-- 以AspectJ方式 定义 AOP -->
- <!--<aop:config proxy-target-class="true">-->
- <!--<aop:advisor pointcut="execution(* service.impl.*.*(..))" advice-ref="txAdvice" order="5"/>-->
- <!--</aop:config>-->
- <!-- 配置事务传播特性:如果存在一个事务,则支持当前事务。如果没有事务则开启:REQUIRED -->
- <!--<tx:advice id="txAdvice" transaction-manager="jtaTransactionManager">-->
- <!--<tx:attributes>-->
- <!--<!–<tx:method name="add*" propagation="REQUIRED" rollback-for="Exception"/>-->
- <!--<tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>-->
- <!--<tx:method name="insert*" propagation="REQUIRED" rollback-for="Exception"/>-->
- <!--<tx:method name="create*" propagation="REQUIRED" rollback-for="Exception"/>-->
- <!--<tx:method name="del*" propagation="REQUIRED" rollback-for="Exception"/>-->
- <!--<tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>-->
- <!--<tx:method name="modify*" propagation="REQUIRED" rollback-for="Exception"/>–>-->
- <!--<tx:method name="*" propagation="REQUIRED" rollback-for="Exception"/>-->
- <!--</tx:attributes>-->
- <!--</tx:advice>-->
-
- <!--将atomikosTransactionProxy作用于service上-->
- <bean id="userService" parent="atomikosTransactionProxy">
- <property name="target">
- <bean class="service.impl.UserServiceImpl">
- </bean>
- </property>
- </bean>
-
-
- </beans>
6、配置jta事物日志文件transactions.properties
- # SAMPLE PROPERTIES FILE FOR THE TRANSACTION SERVICE
- # THIS FILE ILLUSTRATES THE DIFFERENT SETTINGS FOR THE TRANSACTION MANAGER
- # UNCOMMENT THE ASSIGNMENTS TO OVERRIDE DEFAULT VALUES;
- # Required: factory implementation class of the transaction core.
- # NOTE: there is no default for this, so it MUST be specified!
- #
- com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
- # Set base name of file where messages are output
- # (also known as the 'console file').
- #
- com.atomikos.icatch.console_file_name=tm.out
- # Size limit (in bytes) for the console file;
- # negative means unlimited.
- #
- # com.atomikos.icatch.console_file_limit=-1
- # For size-limited console files, this option
- # specifies a number of rotating files to
- # maintain.
- #
- # com.atomikos.icatch.console_file_count=1
- # Set the number of log writes between checkpoints
- #
- # com.atomikos.icatch.checkpoint_interval=500
- # Set output directory where console file and other files are to be put
- # make sure this directory exists!
- #
- # com.atomikos.icatch.output_dir = ./
- # Set directory of log files; make sure this directory exists!
- #
- # com.atomikos.icatch.log_base_dir = ./
- # Set base name of log file
- # this name will be used as the first part of
- # the system-generated log file name
- #
- com.atomikos.icatch.log_base_name=tmlog
- # Set the max number of active local transactions
- # or -1 for unlimited.
- #
- # com.atomikos.icatch.max_actives = 50
- # Set the default timeout (in milliseconds) for local transactions
- #
- # com.atomikos.icatch.default_jta_timeout = 10000
- # Set the max timeout (in milliseconds) for local transactions
- #
- # com.atomikos.icatch.max_timeout = 300000
- # The globally unique name of this transaction manager process
- # override this value with a globally unique name
- #
- com.atomikos.icatch.tm_unique_name=tm
- # Do we want to use parallel subtransactions? JTA's default
- # is NO for J2EE compatibility
- #
- # com.atomikos.icatch.serial_jta_transactions=true
- # If you want to do explicit resource registration then
- # you need to set this value to false.
- #
- # com.atomikos.icatch.automatic_resource_registration=true
- # Set this to WARN, INFO or DEBUG to control the granularity
- # of output to the console file.
- #
- com.atomikos.icatch.console_log_level=INFO
- # Do you want transaction logging to be enabled or not?
- # If set to false, then no logging overhead will be done
- # at the risk of losing data after restart or crash.
- #
- # com.atomikos.icatch.enable_logging=true
- # Should two-phase commit be done in (multi-)threaded mode or not?
- # Set this to false if you want commits to be ordered according
- # to the order in which resources are added to the transaction.
- #
- # NOTE: threads are reused on JDK 1.5 or higher.
- # For JDK 1.4, thread reuse is enabled as soon as the
- # concurrent backport is in the classpath - see
- # http://mirrors.ibiblio.org/pub/mirrors/maven2/backport-util-concurrent/backport-util-concurrent/
- #
- # com.atomikos.icatch.threaded_2pc=false
- # Should shutdown of the VM trigger shutdown of the transaction core too?
- #
- # com.atomikos.icatch.force_shutdown_on_vm_exit=false
- com.atomikos.icatch.serial_jta_transactions=false.
7、配置log4j日志文件
- # Set root logger level to WARN and append to stdout
- log4j.rootLogger=WARN, stdout, error
- #WARN\u4E3Alog\u8F93\u51FA\u7EA7\u522B\uFF0Cstdout\uFF0Cerror\u4E3A\u8BE5log\u7684\u522B\u540D\uFF0C\u4E0B\u9762\u5C06\u7528\u5230
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- # Pattern to output the caller's file name and line number.
- log4j.appender.stdout.layout.ConversionPattern=%d %5p (%c:%L) - %m%n
- # Print only messages of level ERROR or above in the package noModule.
- log4j.logger.noModule=FATAL
- # OpenSymphony Stuff
- log4j.logger.com.opensymphony=INFO
- log4j.logger.com.opensymphony.webwork=DEBUG
- # Spring Stuff
- log4j.logger.org.springframework=INFO
- #log4j.logger.com.ibatis=DEBUG
- #log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
- #log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
- #log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
- #log4j.logger.java.sql.Connection=DEBUG
- #log4j.logger.java.sql.Statement=DEBUG
- #log4j.logger.java.sql.PreparedStatement=DEBUG
- #################################
- # \u9519\u8BEF\u4FE1\u606F #
- #################################
- log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
- log4j.appender.error.File=D:/WorkSpace/LovingCar/logs/errors.log
- log4j.appender.error.layout=org.apache.log4j.PatternLayout
- log4j.appender.error.layout.ConversionPattern=[%d]-%-5p (%F:%L)|%m%n
- log4j.appender.error.DatePattern='.'yyyy-MM-dd
- log4j.appender.error.Threshold=ERROR
- ###################################
- # CONSOLE #
- #################################
- log4j.appender.console=org.apache.log4j.ConsoleAppender
- log4j.appender.console.layout=org.apache.log4j.PatternLayout
- log4j.appender.console.layout.ConversionPattern=(%F:%L)|%m%n
- log4j.appender.errorcsle=org.apache.log4j.ConsoleAppender
- log4j.appender.errorcsle.layout=org.apache.log4j.PatternLayout
- log4j.appender.errorcsle.layout.ConversionPattern=%-5p (%F:%L)|%m%n
- log4j.appender.errorcsle.Threshold=ERROR
- ##################################
- # \u4E1A\u52A1\u7CFB\u7EDF #
- #################################
- log4j.logger.cn.vesung=DEBUG, logic
- log4j.appender.logic=org.apache.log4j.DailyRollingFileAppender
- log4j.appender.logic.File=D:/WorkSpace/LovingCar/logs/logic.log
- log4j.appender.logic.layout=org.apache.log4j.PatternLayout
- log4j.appender.logic.layout.ConversionPattern=[%d]-%-5p (%F:%L)|%m%n
- log4j.appender.logic.DatePattern='.'yyyy-MM-dd
8、配置web.xml文件
- <?xml version="1.0" encoding="UTF-8"?>
- <!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
- <!--
- - This is the Cocoon web-app configurations file
- -
- - $Id$
- -->
- <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- version="2.4"
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
- <display-name>Catering</display-name>
- <context-param>
- <param-name>log4jConfigLocation</param-name>
- <param-value>classpath:conf/log4j.properties</param-value>
- </context-param>
-
- <context-param>
- <param-name>log4jRefreshInterval</param-name>
- <param-value>60000</param-value>
- </context-param>
- <!-- Servlet Context Listener ======================================= -->
- <listener>
- <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
- </listener>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <!-- 读取spring配置文件 -->
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:conf/applicationContext.xml
- classpath:conf/spring-mybatis.xml
- </param-value>
- </context-param>
- <!-- Servlet Filters ================================================ -->
- <!-- Spring字符集过滤器 -->
- <filter>
- <filter-name>SpringEncodingFilter</filter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>UTF-8</param-value>
- </init-param>
- <init-param>
- <param-name>forceEncoding</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>SpringEncodingFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
-
-
- <!-- Servlet Configuration ========================================== -->
- <!-- springMVC核心配置 -->
- <servlet>
- <servlet-name>spring</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:conf/spring-mvc.xml,classpath:conf/applicationContext.xml</param-value>
- </init-param>
- <load-on-startup>2</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>spring</servlet-name>
- <url-pattern>/</url-pattern>
- </servlet-mapping>
- </web-app>
9、controller
- package controller;
-
- import model.user.UserVerificationCode;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.springframework.web.bind.annotation.ResponseBody;
- import service.UserService;
-
- /**
- * Author:LiHongMei
- * Date:2017/1/9 15:00
- */
- @Controller
- @RequestMapping("/user")
- public class UserController {
-
- @Autowired
- private UserService userService;
-
- @RequestMapping(value = "/getCodes", method = RequestMethod.GET, headers = "Accept=application/json",
- produces = "application/json;charset=UTF-8;")
- @ResponseBody
- public UserVerificationCode getCodes(){
- UserVerificationCode userVerificationCode = userService.getCode();
- return userVerificationCode;
- }
-
-
- }
10、mapper
- package mapper.user;
-
- import model.user.UserVerificationCode;
-
- public interface UserVerificationCodeMapper {
- int deleteByPrimaryKey(String uuid);
-
- int insert(UserVerificationCode record);
-
- int insertSelective(UserVerificationCode record);
-
- UserVerificationCode selectByPrimaryKey(String uuid);
-
- int updateByPrimaryKeySelective(UserVerificationCode record);
-
- int updateByPrimaryKey(UserVerificationCode record);
-
- }
11、service
- package service.impl;
-
- import mapper.user.UserVerificationCodeMapper;
- import model.user.UserVerificationCode;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import service.UserService;
-
- /**
- * Author:LiHongMei
- * Date:2017/1/9 15:05
- */
- @Service("userService")
- public class UserServiceImpl implements UserService {
-
- @Autowired
- private UserVerificationCodeMapper userVerificationCodeMapper;
-
- @Override
- public UserVerificationCode getCode() {
- return userVerificationCodeMapper.selectByPrimaryKey("1");
- }
- }
12、test
- package controller.test;
-
- import controller.UserController;
- import model.user.UserVerificationCode;
- import org.junit.Before;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.mock.web.MockHttpServletRequest;
- import org.springframework.mock.web.MockHttpServletResponse;
- import org.springframework.test.context.ContextConfiguration;
- import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-
- /**
- * Author:LiHongMei
- * Date:2017/1/9 15:14
- */
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration(locations = {"classpath:conf/applicationContext.xml", "classpath:conf/spring-mvc.xml",
- "classpath:conf/mybatis-config.xml", "classpath:conf/spring-mybatis.xml"})
- public class UserControllerTest {
-
- // 模拟request,response
- private MockHttpServletRequest request;
-
- private MockHttpServletResponse response;
-
- // 执行测试方法之前初始化模拟request,response
- @Before
- public void setUp() {
- request = new MockHttpServletRequest();
- request.setCharacterEncoding("UTF-8");
- response = new MockHttpServletResponse();
- }
-
- @Autowired
- private UserController userController;
-
- @Test
- public void getCodes() throws Exception {
- UserVerificationCode userVerificationCode = userController.getCodes();
- System.out.println(userVerificationCode.toString());
- }
-
- }