2022/05/22
模拟转账
导入依赖
<!--Spring整合JDBC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--Spring操作事务-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
dao中主要做数据库最基本的操作,增删改查,其他的循环语句、如判断余额是否充足等都是service的
1.业务层实现类
public class AccountServiceImpl implements AccountService {
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
/**
* 转账
* @param out 付款人
* @param in 收款人
* @param Money 金额
*/
@Override
public void pay(String out, String in, Double Money) {
accountDao.outMoney(out,Money);
accountDao.inMoney(in, Money);
}
}
2.持久层实现类
public class AccountDaoImpl implements AccountDao {
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
/**
* 付款
* @param out 付款人
* @param money 金额
*/
@Override
public void outMoney(String out, Double money) {
jdbcTemplate.update("update account set money = money - ? where name = ?", money, out);
}
/**
* 收款
* @param in 收款人
* @param money 金额
*/
@Override
public void inMoney(String in, Double money) {
jdbcTemplate.update("update account set money = money + ? where name = ?", money, in);
}
}
3.配置文件
<!-- 加载数据库属性配置文件-->
<context:property-placeholder location="jdbc.properties"/>
<!-- 配置连接池对象-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 配置jdbc模板对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置dao-->
<bean id="accountDao" class="com.qcby.dao.impl.AccountDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
<!-- 配置service-->
<bean class="com.qcby.service.impl.AccountServiceImpl">
<property name="accountDao" ref="accountDao"/>
</bean>
4.测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class AccountTest {
@Autowired
private AccountService accountService;
@Test
public void run() {
accountService.pay("老王","小王", 200.00);
}
}
改进
以后可能会有很多的dao层,dao层有很多的实现类,有很多的表(如AccountDaoImpl、TeacherDaoImpl、StudentDaoImpl等),都会涉及数据库,都需要依赖注入jdbcTemplate模板,下述代码每个类中都要写
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
很繁琐,因此spring中提供了一个父类,即所有的dao层类都可以有一个父类,将JdbcTemplate相关属性放到这个父类身上,只在父类中写一遍,以后哪个子类想要使用此方法只需要继承调用父类的方法即可
继承JdbcDaoSupport
对象
继承此类的目的:是因为JdbcDaoSupport中包含jdbcTemplate以及相应的set、get方法,同时也提供了设置dataSource连接池的方法
即继承了之后就不用再放jdbcTemplate模板对象了
故持久层实现类改为
public class AccountDaoJdbcParentImpl extends JdbcDaoSupport implements AccountDao {
@Override
public void outMoney(String out, Double money) {
getJdbcTemplate().update("update account set money = money - ? where name = ?", money, out);
}
@Override
public void inMoney(String in, Double money) {
getJdbcTemplate().update("update account set money = money + ? where name = ?", money, in);
}
}
配置文件修改为
<!-- 加载数据库属性配置文件-->
<context:property-placeholder location="jdbc.properties"/>
<!-- 配置连接池对象-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="accountDaoJdbc" class="com.qcby.dao.impl.AccountDaoJdbcParentImpl">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean class="com.qcby.service.impl.AccountServiceImpl">
<property name="accountDao" ref="accountDaoJdbc"/>
</bean>
配置文件省略了jdbcTemplate相关配置,doa层实现类也省略了jdbcTemplate相关注入和set方法