Spring事务的注解方式(检查异常,注解失效的解决方案)

本文详细介绍了如何在SpringBoot项目中整合MyBatis框架,实现与MySQL数据库的交互。从配置Maven依赖到编写Controller、Service和Dao层代码,再到事务处理,全面解析转账功能的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目的4大模块
导入Mybatis和mysql的依赖
我使用的eclipse


```java
<properties>
	<maven-jar-plugin.version>3.0.0</maven-jar-plugin.version>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		
				
	<!-- springboot整合mybatis -->
     <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.2.0</version>
        </dependency>
        
        <!-- mysql 5.1.14 版本 -->
    	<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.14</version>
		</dependency>

```java
application.properties属性文件中配置  数据库的信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/firstonedataku
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

//javaBean,日志
mybatis.type-aliases-package=com.example.demo.model
logging.level.com.example.demo.dao=debug

**Controller层**
package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.demo.service.AccountServicelmpt;

@RestController
@RequestMapping("/account")
public class AccountController {
	
	@Autowired  //自动装配
	private AccountServicelmpt service;//可以来切换绑定的不同的Service

	@RequestMapping("/operator")
	public String operatorAccount()
	{
		System.out.println("AccountController  is  operatorAccount  start....  ");
		
		//李欣借钱给谢一凡
		try
		{
			this.service.operatorAccount(1, 2, 50,"啦啦");
			return  "转账成功";
		}
		catch(Exception e)//自己来写一个try{}catch(){}来捕获异常,转账可能会失败
		{
			return "转账失败";
		}
		
		
	}

}

**Service层**

```java
**接口**
package com.example.demo.service;

public interface IAccountService {
	public void operatorAccount(int outa,int ina,Integer money,String name);

}

**接口的实现类**
```java
package com.example.demo.service;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.example.demo.dao.IAccountDao;

@Service//可以来切换绑定的不同的Service,作用是承上启下
public class AccountServicelmpt implements IAccountService {

	@Autowired
	private IAccountDao dao;
	
	
	/**
	 * @Transactional()这个注解无效的情况: 1、private修饰的方法,一定一定一定要是public方法
	 *                                 2、出现了检查异常,会失效
	 *                                 3.数据库的引擎不支持事务也会失效
	 *              出现了检查异常     解决办法:   1,@Transactional(rollbackFor=Exception.class) 
	 *                         2,throw new RuntimeException();
	 *     
	 *                           
	 * **/
	
	@Transactional(rollbackFor=Exception.class) //事务性的   rollbackFor=的意思是回滚的异常的类型是Exception类型的包含了所有的异常,exception是父类型
	@Override
	public void operatorAccount(int outa,int ina,Integer money,String name) {
		System.out.println("开始操作两个用户之间转账的事务...............");
		
		//出现了非检查异常的时候,Transactional注解是有效的
		//调用数据库中转出帐的方法
		//this.dao.out(outa, money);
		// 手动制造了一个异常 非检查异常
        //int i = Integer.parseInt(name);
        //调用数据库中转入帐的方法
        //this.dao.in(ina, money);
		
		
		//出现了检查异常,Transactional注解会失效,但是可以解决
		
		//设置一个检查异常
		try {
			this.dao.out(outa, money);
			FileInputStream fin=new FileInputStream("a.txt");//检查异常
			this.dao.in(ina, money);//出现异常了,要抛出异常,让这几个操作回滚
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new RuntimeException();//要抛出这个异常
		}
		
		
		
	}
	
}

``

Dao层

package com.example.demo.dao;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Update;

@Mapper  //这个接口在编译时会生成相应的实现类
public interface IAccountDao {
    //转出
	@Update("UPDATE t_accout SET balance=balance-#{money} WHERE id=#{id}")
	public void out(int id,Integer money);//Integer????如果返回字段值为null,int类型会报错,Integer不会报错。因为int类型声明的是变量,而null是对象所以会报错。
	
	//转入
	@Update("UPDATE t_accout SET balance=balance+#{money} WHERE id=#{id}")
	public void in(int id,Integer money);//Integer????int类型的默认值为0,Integer类型的默认值为null。
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值