Spring IOC整合 dbUtil 实现增删改查及转账业务
一、引言
在现代企业级应用开发中,数据持久化和业务逻辑的管理至关重要。Spring框架的IOC(控制反转)特性使得管理对象的生命周期和依赖关系变得简单,而dbUtil是一个轻量级的数据库操作工具,可以有效简化对数据库的增删改查操作。本文将详细介绍如何在Spring中整合dbUtil实现基本的增删改查功能,并实现一个简单的转账业务逻辑。
二、环境准备
1. 项目结构
在本项目中,假设我们使用Maven作为构建工具,项目结构如下:
spring-dbutil-example
|-- pom.xml
|-- src
|-- main
|-- java
|-- com.example
|-- config
|-- AppConfig.java
|-- dao
|-- UserDao.java
|-- service
|-- UserService.java
|-- TransferService.java
|-- controller
|-- UserController.java
|-- resources
|-- application.properties
2. Maven依赖
在 pom.xml中添加以下依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.9</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.7</version>
</dependency>
</dependencies>
三、配置 Spring IOC
1. Spring 配置类
在 com.example.config包中创建 AppConfig.java,用于配置Spring的IOC容器。
package com.example.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/testdb");
dataSource.setUsername("root");
dataSource.setPassword("password");
return dataSource;
}
}
2. application.properties
在 src/main/resources/application.properties中添加数据库连接信息:
spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
四、实现增删改查功能
1. 数据访问对象 (DAO)
在 com.example.dao包中创建 UserDao.java,用于实现用户的增删改查功能。
package com.example.dao;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.List;
@Repository
public class UserDao {
private final QueryRunner queryRunner;
@Autowired
public UserDao(DataSource dataSource) {
this.queryRunner = new QueryRunner(dataSource);
}
public void createUser(User user) throws SQLException {
String sql = "INSERT INTO users (name, balance) VALUES (?, ?)";
queryRunner.update(sql, user.getName(), user.getBalance());
}
public User getUserById(int id) throws SQLException {
String sql = "SELECT * FROM users WHERE id = ?";
return queryRunner.query(sql, new BeanHandler<>(User.class), id);
}
public void updateUser(User user) throws SQLException {
String sql = "UPDATE users SET name = ?, balance = ? WHERE id = ?";
queryRunner.update(sql, user.getName(), user.getBalance(), user.getId());
}
public void deleteUser(int id) throws SQLException {
String sql = "DELETE FROM users WHERE id = ?";
queryRunner.update(sql, id);
}
}
2. 用户实体类
在 com.example.dao包中创建 User.java,用于定义用户实体。
package com.example.dao;
public class User {
private int id;
private String name;
private double balance;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
}
五、实现转账业务逻辑
1. 服务类
在 com.example.service包中创建 TransferService.java,用于实现转账逻辑。
package com.example.service;
import com.example.dao.User;
import com.example.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.sql.SQLException;
@Service
public class TransferService {
private final UserDao userDao;
@Autowired
public TransferService(UserDao userDao) {
this.userDao = userDao;
}
public void transfer(int fromUserId, int toUserId, double amount) throws SQLException {
User fromUser = userDao.getUserById(fromUserId);
User toUser = userDao.getUserById(toUserId);
if (fromUser.getBalance() < amount) {
throw new IllegalArgumentException("Insufficient funds");
}
fromUser.setBalance(fromUser.getBalance() - amount);
toUser.setBalance(toUser.getBalance() + amount);
userDao.updateUser(fromUser);
userDao.updateUser(toUser);
}
}
2. 用户控制器
在 com.example.controller包中创建 UserController.java,用于处理用户请求。
package com.example.controller;
import com.example.dao.User;
import com.example.service.TransferService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.sql.SQLException;
@RestController
@RequestMapping("/users")
public class UserController {
private final TransferService transferService;
@Autowired
public UserController(TransferService transferService) {
this.transferService = transferService;
}
@PostMapping("/transfer")
public String transfer(@RequestParam int fromUserId, @RequestParam int toUserId, @RequestParam double amount) {
try {
transferService.transfer(fromUserId, toUserId, amount);
return "Transfer successful";
} catch (SQLException e) {
return "Transfer failed: " + e.getMessage();
}
}
}
六、总结
通过以上步骤,我们完成了一个基于Spring IOC整合dbUtil的项目,涵盖了基本的增删改查操作及转账业务的实现。使用Spring的IOC容器可以有效管理对象的生命周期和依赖关系,而dbUtil简化了数据库操作,使得开发者能够专注于业务逻辑的实现。在实际项目中,可以根据具体需求进行进一步的优化和扩展。
七、思维导图
# SpringIOC整合dbUtil项目思维导图
- SpringIOC与dbUtil整合
- 项目结构
- Maven依赖
- Spring配置
- DataSource配置
- DAO层
- UserDao
- 增加用户
- 查询用户
- 更新用户
- 删除用户
- 实体类
- User
- 服务层
- TransferService
- 转账逻辑
- 控制层
- UserController
- 处理转账请求
通过上述思维导图,开发者可以清晰地理解项目的整体结构和逻辑关系,为进一步的扩展与维护提供便利。


