springboot項目進行事務控制之轉賬案例


1、引入依賴

<?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>com.zwhxpp</groupId>
    <artifactId>springboot_anno_tx</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.RELEASE</version>
        <relativePath/>
    </parent>

    <dependencies>
        <!-- SpringBoot 容器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- SpringBoot集成通用Mapper -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>2.0.4</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*Mapper.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
</project>

SpringBoot要求,所有的springboot工程要繼承SpringBoot的起步依賴spring-boot-starter-parent

SpringBoot要集成SpringMVC進行Controller的開發,所以項目要導入web功能的啟動依賴

使用通用Mapper,需要兩個依賴:mapper-spring-boot-starter和mysql-connector-java

注意:在使用IDEA開發時,如果打包時*Mapper.xml沒有自動復制到class輸出目錄的mapper類包下,則需要在pom文件中添加mybatis加載配置文件的配置!如下:

<build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*Mapper.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

否則報錯:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

2、編寫啟動類

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

3、編寫配置文件application.properties

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/eesy?characterEncoding=utf8&useoldAliasMetadataBehavior=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
mybatis.mapperLocations = classpath*:com/zwhxpp/dao/mappers/*Mapper.xml
mybatis.typeAliasesPackage = com.zwhxpp.domain

注意:要指定mapper映射文件的位置,否則報錯org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.zwhxpp.dao.AccountMapper.findAccountByName

4、編寫實體類

@Table(name = "account1")
public class Account implements Serializable {
 @Id @KeySql(useGeneratedKeys = true)//開啟主鍵自動回填
    private Integer id;
    private String name;
    private Float money;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Float getMoney() {
        return money;
    }

    public void setMoney(Float money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", money=" + money +
                '}';
    }
}

由於是直接與數據庫交互,所以要用到Common Mapper中的注解:@Table、@Id、@KeySQL,注意要指定表名,否則不知道要操作哪張表。

5、編寫controller

@Controller
public class AccountController {
    @Autowired
    private IAccountService accountService;
    @GetMapping("/test")
    public String test() {
        accountService.transfer("aaa","bbb",100f);
        return "OK";
    }
}

6、編寫service接口

public interface IAccountService {
    /**
     * 轉賬
     * @param sourceName    轉成賬戶名稱
     * @param targetName    轉入賬戶名稱
     * @param money         轉賬金額
     */
    void transfer(String sourceName, String targetName, Float money);
}

7、編寫service實現類

@Service("accountService")
@Transactional(propagation= Propagation.SUPPORTS,readOnly=true)//只讀型事務的配置
public class AccountServiceImpl implements IAccountService {
    @Autowired
    private AccountMapper accountMapper;
    //需要的是讀寫型事務配置
    @Transactional(propagation= Propagation.REQUIRED,readOnly=false)
    @Override
    public void transfer(String sourceName, String targetName, Float money) {
        System.out.println("transfer....");
        //2.1根據名稱查詢轉出賬戶
        Account source = accountMapper.findAccountByName(sourceName);
        //2.2根據名稱查詢轉入賬戶
        Account target = accountMapper.findAccountByName(targetName);
        //2.3轉出賬戶減錢
        source.setMoney(source.getMoney()-money);
        //2.4轉入賬戶加錢
        target.setMoney(target.getMoney()+money);
        //2.5更新轉出賬戶
        accountMapper.updateByPrimaryKey(source);

//            int i=1/0;

        //2.6更新轉入賬戶
        accountMapper.updateByPrimaryKey(target);
    }

}

8、編寫dao接口

@org.apache.ibatis.annotations.Mapper
public interface AccountMapper extends Mapper<Account> {
    /**
     * 根據名稱查詢賬戶
     * @param accountName
     * @return
     */
    Account findAccountByName(@Param(value = "accountName") String accountName);

}

如果在啟動類使用了@MapperScan注解,那么這里不用使用@Mapper注解

9、編寫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="com.zwhxpp.dao.AccountMapper">
    <select id="findAccountByName" parameterType="java.lang.String" resultType="com.zwhxpp.domain.Account">
        SELECT
        id,name,money
        FROM account1
        WHERE 1=1
        <if test="accountName != null">
            AND name = #{accountName}
        </if>
    </select>
</mapper>

10、創建數據庫eesy下的account1表

 11、訪問http://localhost:8080/test

結果如下:

 發現轉賬操作實現了事務控制。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM