Spring的事务处理的原理还是AOP的原理和标注来实现了声明式的事务处理。
如何编码
a:引入jar(不用引,因为它就是aop的实现,默认引入)
b:开启Spring的事务处理功能
Jdbc配置类上加标注 @EnableTransactionManagement 开启事务处理功能
c:配置事务管理器Bean
JdbcConfig类配置中加入事务管理器(TransactionManagement)
d:开始使用Spring声明式的事务
导入jar
<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>com.uek.objuct</groupId>
<artifactId>spring-app</artifactId>
<version>0.1</version>
<packaging>war</packaging>
<properties>
<project.bulid.sourceEncoding>UTF-8</project.bulid.sourceEncoding>
<failOnMissingWebXml>false</failOnMissingWebXml>
<!-- 自定义版本标记 -->
<spring.version>5.1.7.RELEASE</spring.version>
</properties>
<!-- 配置项目所需要的第三方的jar包 -->
<dependencies>
<!--Servlet api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/junit/junit Junit单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<!--Spring 框架 IOC 第一天要引入的 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring5 AOP -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.10</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java Mysql数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid Druid数据库连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.20</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring与Spring MVC 的整合 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--阿里的fastJSON处理工具 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>
<!-- 4.配置构建插件 -->
<build>
<plugins>
<!-- 编译插件 -->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<!-- Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/uservlet</path>
<!-- 实现热部署 不需要每次修改代码后都重启启动Tomcat -->
</configuration>
</plugin>
</plugins>
</build>
</project>
实体类
public class Account implements Serializable{
public static final long serialVersionUID = 1L;
private int id;
private String name;
private double balance;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public Account(){}
public Account(int id, String name, double balance) {
super();
this.id = id;
this.name = name;
this.balance = balance;
}
public Account(String name, double balance) {
super();
this.name = name;
this.balance = balance;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits(balance);
result = prime * result + (int) (temp ^ (temp >>> 32));
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Account other = (Account) obj;
if (Double.doubleToLongBits(balance) != Double.doubleToLongBits(other.balance))
return false;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "Account [id=" + id + ", name=" + name + ", balance=" + balance + "]";
}
}
jdbc.properties
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_chat?characterEncoding=utf8
jdbc.username=root
jdbc.password=
实现类
@Repository("accountDaoJdbcImpl") //做存储服务的Bean
public class AccountDaoJdbcImpl implements IAccountDao{
@Autowired
private DataSource ds;
@Autowired
private JdbcTemplate jdbcTemplate;
//查找数据
@Override
public List<Account> findAll() {
try {
Connection con =ds.getConnection();
String sql = "select * from account";
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(sql);
List<Account> acts = new ArrayList<>();
while(rs.next()){
Account act = new Account();
act.setId(rs.getInt(1));
act.setName(rs.getString(2));
act.setBalance(rs.getDouble(3));
acts.add(act);
}
return acts;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
//增加和更新数据
@Override
public void saveOrUpdate(Account act) {
if(act.getId()==0) {
jdbcTemplate.update(
"insert into account(name,balance) values(?,?)",
new Object[] {act.getName(),act.getBalance()}
);
}else {
jdbcTemplate.update(
"update account set name=?,balance=? where id=?",
new Object[] {act.getName(),act.getBalance(),act.getId()}
);
}
}
//删除数据
@Override
public void delete(Account act) {
jdbcTemplate.update(
"delete from account where id=?",
new Object[] {act.getId()}
);
}
}
业务实现类
@Service("accountServiceDaoImpl")
public class AccountServiceDaoImpl implements IAccountService{
@Autowired
private IAccountDao actDao;
@Override
@Transactional
public void tranfer() { //模拟里边有很多数据类
actDao.saveOrUpdate(new Account("张三丰",1.0));
int i = 3;
//if(i == 3) throw new RuntimeException("条件满足,所以报异常");
actDao.saveOrUpdate(new Account("yyy",1.0));
}
}
引用的配置
@Configuration
@Import({JdbcConfig.class})
@ComponentScan("包名")
public class AppConfig {
}
AccountDao接口
public interface IAccountDao {
//查找数据
List<Account> findAll();
//实现数据库的增改
void saveOrUpdate(Account act); //act.getID
//实现数据的删除
void delete(Account act);
}
验证
public interface IAccountService {
void tranfer(); //模拟转账
}
Jdbc的配置类
@Configuration
@PropertySource("classpath:jdbc.properties") //你的jdbc配置信息的位置
public class JdbcConfig {
//1.获取配置信息
@Value("${jdbc.driverClass}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Value("${pool.maxActive}")
private int maxActive;
//--2.要有数据库连接池对象
@Bean(name="dataSource")
public DataSource createDataSource(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(username);
ds.setPassword(password);
ds.setMaxActive(maxActive); //设置最大连接数
return ds;
}
//3.配置JDBCTemplate
@Bean(name="jdbcTemplate")
public JdbcTemplate createJdbcTemplate(DataSource ds){
return new JdbcTemplate(ds); //利用数据源构造jdbcTemplate
}
//-- 4. 配置事务管理器
@Bean(name="transactionManager")
public PlatformTransactionManager createTransactionManager(DataSource ds) {
return new DataSourceTransactionManager(ds);
}
}
AccountDao测试 测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes={AppConfig.class})
public class TestAccountService {
@Autowired
@Qualifier("accountServiceDaoImpl")
private IAccountService actService;
@Test
public void testTransaction(){
actService.tranfer();
}
}