本例演示转账操作
- 准备数据库表t_act(账户表)
- 创建maven模块,引入依赖
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>6.1.8</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.16</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>3.0.3</version><!--Mybatis-spring如果使用2.*版本会报错.--></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.17</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.1.7</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.7</version></dependency></dependencies>
- pojo实体类
package com.powernode.bank.pojo;public class Account {private String actno;private Double balance;/*public Account() {}*/public String getActno() {return actno;}public void setActno(String actno) {this.actno = actno;}public Double getBalance() {return balance;}public void setBalance(Double balance) {this.balance = balance;}public Account(String actno, Double balance) {this.actno = actno;this.balance = balance;}@Overridepublic String toString() {return "Account{" +"actno='" + actno + '\'' +", balance=" + balance +'}';}
}
- 编写mapper接口
package com.powernode.bank.mapper;import com.powernode.bank.pojo.Account;import java.util.List;public interface AccountMapper {//这就是Daoint insert(Account account);int deleteByActno(String actno);int update(Account account);Account selectByActno(String actno);List<Account> selectAll();
}
- 编写Mapper配置文件,该配置文件需要和Mapper接口在同一个目录或在resource目录下创建和Mapper接口相同目录结构
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.powernode.bank.mapper.AccountMapper"><insert id="insert">insert into t_act values(#{actno}, #{balance})</insert><delete id="deleteByActno">delete from t_act where actno = #{actno}</delete><update id="update">update t_act set balance = #{balance} where actno = #{actno}</update><select id="selectByActno" resultType="com.powernode.bank.pojo.Account">select * from t_act where actno = #{actno}</select><select id="selectAll" resultType="com.powernode.bank.pojo.Account">select * from t_act</select>
</mapper>
- 编写service接口和service接口实现类
package com.powernode.bank.service;import com.powernode.bank.pojo.Account;import java.util.List;public interface AccountService {//开户int save(Account act);//销户int deleteByActno(String actno);//修改账户int modify(Account account);//查询账户Account getByActno(String actno);//获取所有账户List<Account> getAll();//转账void transfer(String fromActno, String toActno, double money);
}
package com.powernode.bank.service.impl;import com.powernode.bank.mapper.AccountMapper;
import com.powernode.bank.pojo.Account;
import com.powernode.bank.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import java.util.List;@Transactional
@Service
public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountMapper accountMapper;@Overridepublic int save(Account act) {return accountMapper.insert(act);}@Overridepublic int deleteByActno(String actno) {return accountMapper.deleteByActno(actno);}@Overridepublic int modify(Account account) {return accountMapper.update(account);}@Overridepublic Account getByActno(String actno) {return accountMapper.selectByActno(actno);}@Overridepublic List<Account> getAll() {return accountMapper.selectAll();}@Overridepublic void transfer(String fromActno, String toActno, double money) {Account fromAccount = accountMapper.selectByActno(fromActno);if (fromAccount.getBalance()< money){throw new RuntimeException("余额不足");};Account toAct = accountMapper.selectByActno(toActno);fromAccount.setBalance(fromAccount.getBalance()-money);toAct.setBalance(toAct.getBalance()+money);int count = accountMapper.update(fromAccount);count += accountMapper.update(toAct);if (count != 2){throw new RuntimeException("转账失败");}}
}
- 编写jdbc.properties配置文件
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.1.41:3306/test
jdbc.username=root
jdbc.password=*********
- 编写mybatis-config.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><setting name="logImpl" value="STDOUT_LOGGING"/></settings>
</configuration>
- 编写spring.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!--组件扫描--><context:component-scan base-package="com.powernode.bank"/><!--引入外部数据源--><context:property-placeholder location="jdbc.properties"/><!--数据源--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></bean><!--SqlSessionFactoryBean--><bean class="org.mybatis.spring.SqlSessionFactoryBean"><!--注入数据源--><property name="dataSource" ref="dataSource"/><!--指定mybatis核心配置文件--><property name="configLocation" value="mybatis-config.xml"/><!--指定别名--><property name="typeAliasesPackage" value="com.powernode.bank.pojo"/></bean><!--Mapper扫描配置器,主要扫描Mapper接口,生成代理类--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.powernode.bank.mapper"/></bean><!--事务管理器--><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!--启用事务注解--><tx:annotation-driven transaction-manager="txManager"/>
</beans>
- 测试
public class SMTest {@Testpublic void testSM(){ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring.xml");AccountService accountServiceImpl = classPathXmlApplicationContext.getBean("accountServiceImpl", AccountService.class);try{accountServiceImpl.transfer("act-001","act-002", 10000);System.out.println("转账成功");}catch(Exception e){e.printStackTrace();}}