Maven構建Spring+MyBatis+JTA(atomikos)框架

maven構建項目,詳見筆記「maven構建多模塊工程」html

開發工具:IntelliJ IDEAjava

JDK版本:1.8mysql

Maven版本:3.3.9web

項目結構:spring

SpringMybatisJtaModel/src/main/resources/mapper存放mybatis生成的mapper.xml文件sql

 

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

 

  一、pom文件添加springMVC、jta、mybatis等須要的jarexpress

<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>

二、建立applicationContext.xml文件apache

<?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>

三、建立mybatis-config.xml文件json

<?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>

四、建立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>

五、建立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">
        &lt;!&ndash;value只要兩個數據源不一樣就行,隨便取名&ndash;&gt;
        <property name="uniqueResourceName" value="mysql/sitestMain"/>
        <property name="xaDataSourceClassName" value="com.mysql.cj.jdbc.MysqlXADataSource"/>
        <property name="xaProperties">
            <props>
                &lt;!&ndash;<prop key="driverClassName">${jdbc.driverClassName1}</prop>&ndash;&gt;
                <prop key="url">${jdbc_url}</prop>
                <prop key="user">${jdbc_username}</prop>
                <prop key="password">${jdbc_password}</prop>
            </props>
        </property>
        &lt;!&ndash;<property name="pinGlobalTxToPhysicalConnection"  value="true"/>&ndash;&gt;
        <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">
        &lt;!&ndash; value只要兩個數據源不一樣就行,隨便取名 &ndash;&gt;
        <property name="uniqueResourceName" value="mysql/sitestLog"/>
        <property name="xaDataSourceClassName" value="com.mysql.cj.jdbc.MysqlXADataSource"/>
        <property name="xaProperties">
            <props>
                &lt;!&ndash;<prop key="driverClassName">${logjdbc_driverClassName}</prop>&ndash;&gt;
                <prop key="url">${logjdbc_url}</prop>
                <prop key="user">${logjdbc_username}</prop>
                <prop key="password">${logjdbc_password}</prop>
            </props>
        </property>
        &lt;!&ndash;<property name="pinGlobalTxToPhysicalConnection"  value="true"/>&ndash;&gt;
        <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">
        &lt;!&ndash; value只要兩個數據源不一樣就行,隨便取名 &ndash;&gt;
        <property name="uniqueResourceName" value="mysql/sitestReport"/>
        <property name="xaDataSourceClassName" value="com.mysql.cj.jdbc.MysqlXADataSource"/>
        <property name="xaProperties">
            <props>
                &lt;!&ndash;<prop key="driverClassName">${logjdbc_driverClassName}</prop>&ndash;&gt;
                <prop key="url">${reportjdbc_url}</prop>
                <prop key="user">${reportjdbc_username}</prop>
                <prop key="password">${reportjdbc_password}</prop>
            </props>
        </property>
        &lt;!&ndash;<property name="pinGlobalTxToPhysicalConnection"  value="true"/>&ndash;&gt;
        <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">
        &lt;!&ndash; value只要兩個數據源不一樣就行,隨便取名 &ndash;&gt;
        <property name="uniqueResourceName" value="mysql/sitestMeal"/>
        <property name="xaDataSourceClassName" value="com.mysql.cj.jdbc.MysqlXADataSource"/>
        <property name="xaProperties">
            <props>
                &lt;!&ndash;<prop key="driverClassName">${mealjdbc_driverClassName}</prop>&ndash;&gt;
                <prop key="url">${mealjdbc_url}</prop>
                <prop key="user">${mealjdbc_username}</prop>
                <prop key="password">${mealjdbc_password}</prop>
            </props>
        </property>
        &lt;!&ndash;<property name="pinGlobalTxToPhysicalConnection"  value="true"/>&ndash;&gt;
        <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>
        &lt;!&ndash; configLocation爲mybatis屬性 mapperLocations爲全部mapper&ndash;&gt;
        <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>
        &lt;!&ndash; configLocation爲mybatis屬性 mapperLocations爲全部mapper&ndash;&gt;
        <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>
        &lt;!&ndash; configLocation爲mybatis屬性 mapperLocations爲全部mapper&ndash;&gt;
        <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>
        &lt;!&ndash; configLocation爲mybatis屬性 mapperLocations爲全部mapper&ndash;&gt;
        <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>-->
            <!--&lt;!&ndash;<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"/>&ndash;&gt;-->
            <!--<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>

六、配置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.

七、配置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

八、配置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>

九、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;
   }


}

十、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);

}

十一、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");
   }
}

十二、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());
   }

}
相關文章
相關標籤/搜索