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
結果如下:
發現轉賬操作實現了事務控制。