以下是使用 非注解方式(纯 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();
}
}
关键点说明
- 依赖注入:通过
<property>
标签在 XML 中完成依赖注入,替代@Autowired
。 - 事务管理:通过
<tx:advice>
和<aop:config>
配置声明式事务,替代@Transactional
。 - 配置集中化:所有配置集中在
applicationContext.xml
中,无需注解。 - 兼容性:此方式适用于不支持注解的老旧项目或需要严格分离配置的场景。
通过以上步骤,即可在不使用任何注解的情况下实现 Spring JDBC 的完整功能。