项目搭建
1 介绍
通过Spring事务整合Mybatis,使用注解或xml的形式,完成转账操作。
2 项目目录
3 新建Maven项目导入依赖 – pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.tj</groupId>
<artifactId>play-ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<!--设置war包打包形式-->
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
<scope>runtime</scope>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
<!-- MyBatis 相关 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- Spring 集成 MyBatis 的依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<!-- Spring 相关 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<!-- 测试相关 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.8.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- web 项目共用 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<!-- 页面标签 -->
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId>
<version>1.2.5</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>8080</port> <!-- 端口 -->
<path>/</path> <!-- 上下路径 -->
<uriEncoding>UTF-8</uriEncoding> <!-- 针对 GET 方式乱码处理 -->
</configuration>
</plugin>
</plugins>
</build>
</project>
4 web.xml
main 目录下新建 webapp/WEB-INF/web.xml
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
</web-app>
5 配置插件
6 数据库表
# 账号表创建
CREATE TABLE `account` (
`id` bigint(15) NOT NULL AUTO_INCREMENT,
`balance` decimal(8,2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
7 实体类
@Data
public class Account {
private Long id;
/*余额*/
private BigDecimal balance;
}
8 resources目录 – 3个文件
// db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///play_ssm
jdbc.username=root
jdbc.password=root
// log4j.properties
log4j.rootLogger=error, stdout
log4j.logger.cn.tj=TRACE
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
// spring-core.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
">
<!--加载外部的数据库配置信息文件-->
<context:property-placeholder location="classpath:db.properties"></context:property-placeholder>
<!--配置数据库连接-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--创建SqlSessionFactoryBean对象 mybatis-spring依赖带的-->
<!--将对象交给Spring后 不必再手动加载mybatis-config配置文件-->
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--数据源配置-->
<property name="dataSource" ref="dataSource"></property>
<!--配置实体类扫描包路径-->
<property name="typeAliasesPackage" value="cn.tj.ssm.pojo"></property>
<!--加载mapper映射文件路径:只要满足接口和映射文件在相同目录下即可省略-->
<!--<property name="mapperLocations" value="classpath:cn/tj/ssm/mapper/*Mapper.xml"></property>-->
<!--mybatis核心配置文件扫描:后期如果需要配置一些mybatis的插件可以配置-->
<!--<property name="configLocation" value="classpath:mybatis-config.xml"></property>-->
</bean>
<!--mapperFactoryBean对象配置 返回Mapper接口对象 注入使用时名字要一致-->
<!-- <bean id="accountMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">-->
<!--通过sqlSessionFactory将Mybatis的操作关联起来-->
<!-- <property name="sqlSessionFactory" ref="sessionFactory"></property>-->
<!--源码中MapperFactoryBean是泛型 通过mapperInterface设置Bean返回的类型-->
<!--<property name="mapperInterface" value="cn.tj.ssm.mapper.AccountMapper"></property>-->
<!--</bean>-->
<!--配置mapper扫描-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--mapper所在目录(接口和映射路径)扫描-->
<property name="basePackage" value="cn.tj.ssm.mapper"></property>
</bean>
<!--service-->
<!-- <bean id="accountService" class="cn.tj.ssm.service.impl.AccountServiceImpl"></bean>-->
<!--开启spring注解扫描-->
<context:component-scan base-package="cn.tj.ssm"></context:component-scan>
<!--事务管理器对象-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置事务增强:给转账业务设置事务管理-->
<!-- <tx:advice id="txAdvice" transaction-manager="transactionManager">-->
<!-- <tx:attributes>-->
<!-- <!–需要增强的目标方法名–>-->
<!-- <tx:method name="transfer" />-->
<!-- <!–查询的方法不需要事务–>-->
<!--<!– <tx:method name="get*" read-only="true"/>–>-->
<!--<!– <tx:method name="list*" read-only="true"/>–>-->
<!--<!– <tx:method name="query*" read-only="true"/>–>-->
<!--<!– <tx:method name="count*" read-only="true"/>–>-->
<!-- <!–除了查询以为的方法全部使用事务管理–>-->
<!--<!– <tx:method name="*"/>–>-->
<!-- </tx:attributes>-->
<!-- </tx:advice>-->
<!--使用aop思想将事务添加到目标切面-->
<!-- <aop:config>-->
<!-- <!–切入点–>-->
<!-- <aop:pointcut id="pc" expression="execution(* cn.tj.ssm.service.impl.*ServiceImpl.*(..))"/>-->
<!-- <!–设置切入点和增强的关联–>-->
<!-- <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"></aop:advisor>-->
<!-- </aop:config>-->
<!--开启事务扫描 搭配事务管理器即可 aop与tx可省略-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
</beans>
9 resources目录映射文件 – AccountMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.tj.ssm.mapper.AccountMapper">
<!--转出-->
<update id="subtractBalance">
update account set balance =balance-#{balance} where id=#{id};
</update>
<!--转入-->
<update id="addBalance">
update account set balance =balance+#{balance} where id =#{id}
</update>
</mapper>
10 持久化层Mapper接口 – AccountMapper
public interface AccountMapper {
/*转出*/
public int subtractBalance(@Param("balance") BigDecimal balance, @Param("id")Long id);
/*转入*/
public int addBalance(@Param("balance") BigDecimal balance, @Param("id")Long id);
}
11 业务逻辑层接口实现类
// 接口
public interface AccountService {
/*实现转账操作*/
public void transfer(BigDecimal balance,Long inId,Long outId);
}
// 实现类
@Service
public class AccountServiceImpl implements AccountService {
// 注入持久对象
@Autowired
private AccountMapper accountMapper;
/*转账的业务 事务注解需要开启*/
@Override
@Transactional
public void transfer(BigDecimal balance, Long inId, Long outId) {
/*转出操作*/
accountMapper.subtractBalance(balance,outId);
int num=10/0;
/*转入操作*/
accountMapper.addBalance(balance,inId);
}
}