当前位置: 首页 > news >正文

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();}
}

关键点说明

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

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

相关文章:

  • SpringBoot入门实战(第七篇:项目接口-商品管理)
  • Ubuntu启动SMB(Samba)服务步骤
  • pytest心得体会
  • vue2+Vant 定制主题
  • 第二章:ForgeAgent Core
  • 极狐GitLab 的合并请求部件能干什么?
  • 【C语言】C语言中的字符函数和字符串函数全解析
  • COMSOL多孔结构传热模拟
  • VTK-8.2.0源码编译(Cmake+VS2022+Qt5.12.12)
  • 零跑B01上海车展全球首秀,定义纯电轿车新基准
  • 3D模型格式转换工具HOOPS Exchange 2025.3.0更新:iOS实现Rhino格式支持!
  • CS144 Lab3 实战记录:TCP 发送器实现
  • 奶茶店里面的数据结构
  • ProxySQL实现mysql8主从同步读写分离
  • Vue3祖先后代组件数据双向同步实现方法
  • TypeScript-知识点梳理
  • 阿里云 AI 搜索开放平台:RAG智能化工作流助力 AI 搜索
  • 【数据结构和算法】6. 哈希表
  • Hive中Map和Reduce阶段的分工
  • C++笔记-stack_queue(含deque,priority_queue,仿函数的讲解)
  • 《大风杀》上海首映,白客说拍这戏是从影以来的最大挑战
  • 网警查处编造传播“登顶泰山最高可得3万奖金”网络谣言者
  • 荆州市委书记汪元程:全市各级干部要做到慎微、慎初、慎独、慎友
  • 以“最美通缉犯”为噱头直播?光明网:违法犯罪不应成网红跳板
  • 鄂湘赣“中三角”,能否走向文旅C位?
  • 光明网评论员:手机“二次放号”,需要重新确认“你是你”