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
      - 处理转账请求

通过上述思维导图,开发者可以清晰地理解项目的整体结构和逻辑关系,为进一步的扩展与维护提供便利。