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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/aophttp://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 方法注入 JdbcTemplatepublic void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}@Overridepublic void insertUser(User user) {String sql = "INSERT INTO users (name, email) VALUES (?, ?)";jdbcTemplate.update(sql, user.getName(), user.getEmail());}@Overridepublic List<User> findAllUsers() {String sql = "SELECT * FROM users";return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));}@Overridepublic 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 方法注入 UserDaopublic 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();}
}
关键点说明
- 依赖注入:通过
<property>
标签在 XML 中完成依赖注入,替代@Autowired
。 - 事务管理:通过
<tx:advice>
和<aop:config>
配置声明式事务,替代@Transactional
。 - 配置集中化:所有配置集中在
applicationContext.xml
中,无需注解。 - 兼容性:此方式适用于不支持注解的老旧项目或需要严格分离配置的场景。
通过以上步骤,即可在不使用任何注解的情况下实现 Spring JDBC 的完整功能。