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"> <!–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>
六、配置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()); } }