Spring JDBC 的开发步骤(非注解方式)

以下是使用 非注解方式(纯 XML 配置)实现 Spring JDBC 的完整示例:


1. 项目依赖(不变)

<!-- pom.xml -->
<dependencies>
    <!-- Spring JDBC -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.3.23</version>
    </dependency>
    
    <!-- 数据库驱动(MySQL) -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
    
    <!-- 连接池(HikariCP) -->
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>4.0.3</version>
    </dependency>
</dependencies>

2. XML 配置文件(applicationContext.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:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!-- 1. 数据源配置 -->
    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/testdb"/>
        <property name="username" value="root"/>
        <property name="password" value="password"/>
        <property name="maximumPoolSize" value="10"/>
    </bean>

    <!-- 2. JdbcTemplate 配置 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 3. DAO 层配置 -->
    <bean id="userDao" class="com.example.dao.UserDaoImpl">
        <property name="jdbcTemplate" ref="jdbcTemplate"/>
    </bean>

    <!-- 4. 事务管理器配置 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 5. 启用事务注解(可选,如果不用注解可删除) -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

4. DAO 接口及实现类(无注解)

UserDao 接口
package com.example.dao;

import com.example.model.User;
import java.util.List;

public interface UserDao {
    void insertUser(User user);
    List<User> findAllUsers();
    User findUserById(int id);
}
UserDaoImpl 实现类
package com.example.dao;

import com.example.model.User;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;

public class UserDaoImpl implements UserDao {

    private JdbcTemplate jdbcTemplate;

    // 通过 Setter 方法注入 JdbcTemplate
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public void insertUser(User user) {
        String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
        jdbcTemplate.update(sql, user.getName(), user.getEmail());
    }

    @Override
    public List<User> findAllUsers() {
        String sql = "SELECT * FROM users";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
    }

    @Override
    public User findUserById(int id) {
        String sql = "SELECT * FROM users WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new Object[]{id}, 
            new BeanPropertyRowMapper<>(User.class));
    }
}

5. 事务管理(XML 配置)

通过 AOP 配置事务

applicationContext.xml 中添加以下配置:

<!-- 定义事务通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="insert*" propagation="REQUIRED" rollback-for="Exception"/>
        <tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>
        <tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception"/>
        <tx:method name="find*" read-only="true"/>
    </tx:attributes>
</tx:advice>

<!-- 定义 AOP 切面 -->
<aop:config>
    <aop:pointcut id="userServiceMethods" expression="execution(* com.example.service.*.*(..))"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="userServiceMethods"/>
</aop:config>

6. Service 层(无注解)

UserService 类
package com.example.service;

import com.example.dao.UserDao;
import com.example.model.User;
import java.util.List;

public class UserService {

    private UserDao userDao;

    // 通过 Setter 方法注入 UserDao
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void createUser(User user) {
        userDao.insertUser(user);
        // 其他业务逻辑(事务会自动回滚)
    }

    public List<User> getAllUsers() {
        return userDao.findAllUsers();
    }
}

7. 测试类(无注解)

import com.example.model.User;
import com.example.service.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        // 加载 XML 配置文件
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        
        // 获取 Service 实例
        UserService userService = context.getBean(UserService.class);
        
        // 测试插入用户
        User user = new User();
        user.setName("Alice");
        user.setEmail("alice@example.com");
        userService.createUser(user);
        
        // 测试查询
        System.out.println(userService.getAllUsers());
        
        context.close();
    }
}

关键点说明

  1. 依赖注入:通过 <property> 标签在 XML 中完成依赖注入,替代 @Autowired
  2. 事务管理:通过 <tx:advice><aop:config> 配置声明式事务,替代 @Transactional
  3. 配置集中化:所有配置集中在 applicationContext.xml 中,无需注解。
  4. 兼容性:此方式适用于不支持注解的老旧项目或需要严格分离配置的场景。

通过以上步骤,即可在不使用任何注解的情况下实现 Spring JDBC 的完整功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值