文章目录
一、实现步骤
1、准备数据库表
t_act:银行账户
2、在IDEA中创建一个模块,并引入依赖
- spring-context
- spring-jdbc
- mysql驱动
- mybatis
- mybatis-spring mybatis提供的与spring框架集成的依赖
- 德鲁伊连接池
- junit
为什么有了mybatis驱动还需要jdbc?
因为事务tx在jdbc包里
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.32</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.20</version>
</dependency>
</dependencies>
3、基于三层架构实现
创建所有的包
com.powernode.bank.pojo
com.powernode.bank.mapper
com.powernode.bank.service
com.powernode.bank.service.impl
4、编写pojo
Account:属性私有化,提供公开的setter getter toString
public class Account {
private String actno;
private double balance;
public Account(String actno, double balance) {
this.actno = actno;
this.balance = 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;
}
@Override
public String toString() {
return "Account{" +
"actno='" + actno + '\'' +
", balance=" + balance +
'}';
}
}
5、编写mapper接口
AccountMapper接口,定义方法
public interface AccountMapper {//该接口的实现类不需要写,是mybatis通过动态代理机制生成的实现类
//查询所有的账户
List<Account> seleteAllAccount();
//根据actno查询指定账户
Account selectByActno(String actno);
//增加账户
int insertAccount(Account account);
//删除账户
int deleteByActno(String actno);
//修改账户
int update(Account account);
}
6、编写mapper配置文件
在配置文件中配置命名空间,以及每一个方法对应的SQL
< mapper namespace=“com.powernode.bank.mapper.AccountMapper” >
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.powernode.bank.mapper.AccountMapper">
<select id="selectAllAccount" resultType="account">
select * from t_act
</select>
<select id="selectByActno" resultType="account">
select * from t_act
where actno=#{actno};
</select>
<insert id="insertAccount">
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>
</mapper>
7、编写service接口和service接口的实现类
AccountService
public interface AccountService {
//业务接口
int save(Account account);
int deleteByActno(String actno);
int modify(Account account);
Account getByActno(String actno);
List<Account> getAll();
void transfer(String fromActno,String toActno,double money);
}
AccountServiceImpl
注意一定要进行AccountServiceImpl Bean实例化:@Service(“accountService”)
以及一定要注入AccountMapper Bean注入: @Autowired
@Service("accountService")
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountMapper mapper;
@Override
public int save(Account account) {
int i = mapper.insertAccount(account);
return i;
}
@Override
public int deleteByActno(String actno) {
int i = mapper.deleteByActno(actno);
return i;
}
@Override
public int modify(Account account) {
mapper.update(account);
return 0;
}
@Override
public Account getByActno(String actno) {
return mapper.selectByActno(actno);
}
@Override
public List<Account> getAll() {
return mapper.seleteAllAccount();
}
@Override
public void transfer(String fromActno, String toActno, double money) {
Account fromAct = mapper.selectByActno(fromActno);
Account toAct = mapper.selectByActno(toActno);
if(fromAct.getBalance()<money){
throw new RuntimeException("余额不足");
}
fromAct.setBalance(fromAct.getBalance()-money);
toAct.setBalance(toAct.getBalance()+money);
int count = mapper.update(fromAct);
count += mapper.update(toAct);
if(count==2){
System.out.println("转账成功");
}else{
throw new RuntimeException("转账失败");
}
}
}
8、编写jdbc.properties配置文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/dududu?useSSL=false
jdbc.username=root
jdbc.password=123456
9、编写mybatis-config.xml配置文件
这个文件可以没有,大部分的配置可以转移到spring配置文件中
如果遇到mybatis相关的系统级配置,还是需要这个文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--设置日志输出语句,显示相应操作的sql语名-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
</configuration>
10、编写spring.xml配置文件【配置地狱】
1、组件扫描
2、引入外部的属性文件
3、数据源
4、SqlSessionFactoryBean配置
注入mybatis核心配置文件
指定别名包
注入数据源
5、Mapper扫描配置器(主要扫描mapper接口生成代理类)
扫描指定的包
6、事务管理器 DataSourceTransactionManager
注入数据源
7、启用事务注解【启用之后在业务实现类当中添加注解@Transactional 事务才会起作用】
注入事务管理器
<?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"/>-->
<!--在spring的核心配置文件中引入其他的子spring配置文件-->
<context:component-scan base-package="com.powernode.bank"></context:component-scan>
<context:property-placeholder location="jdbc.properties"></context:property-placeholder>
<!--数据源-->
<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>
11、编写测试程序,添加事务,进行测试
@Test
public void testSM(){
ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
AccountService accountService = ac.getBean("accountService",AccountService.class);
//accountService.transfer("act_001","act_002",2000);
accountService.save(new Account("act_005",20));
List<Account> AccountList = accountService.getAll();
AccountList.forEach(list->{
System.out.println("账号为:"+list.getActno()+",账户余额为:"+list.getBalance());
});
}