Spring框架(2) 整合JDBC实现CRUD实战

Spring框架(2) 整合JDBC实现CRUD实战 一、Spring整合JDBC实现用户的CRUD1. 环境准备JDK版本推荐使用JDK 8及以上版本开发工具IntelliJ IDEA或Eclipse数据库MySQL 5.7/8.0或其他关系型数据库依赖管理Maven或Gradle2. 添加必要依赖在pom.xml中添加以下核心依赖!-- Spring核心依赖 -- dependency groupIdorg.springframework/groupId artifactIdspring-context/artifactId version5.3.18/version /dependency !-- Spring JDBC支持 -- dependency groupIdorg.springframework/groupId artifactIdspring-jdbc/artifactId version5.3.18/version /dependency !-- 数据库驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.28/version /dependency !-- 连接池 -- dependency groupIdcom.zaxxer/groupId artifactIdHikariCP/artifactId version4.0.3/version /dependency3. 数据库配置创建数据库配置文件db.propertiesjdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/user_db?useSSLfalseserverTimezoneUTC jdbc.usernameroot jdbc.password1234564. Spring配置类创建Java配置类AppConfig.javaConfiguration PropertySource(classpath:db.properties) ComponentScan(com.example.dao) public class AppConfig { Value(${jdbc.driver}) private String driver; Value(${jdbc.url}) private String url; Value(${jdbc.username}) private String username; Value(${jdbc.password}) private String password; Bean public DataSource dataSource() { HikariDataSource dataSource new HikariDataSource(); dataSource.setDriverClassName(driver); dataSource.setJdbcUrl(url); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; } Bean public JdbcTemplate jdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } }5. 创建用户实体类public class User { private Integer id; private String username; private String password; private String email; private Date createTime; // 构造方法、getter和setter省略 }6. 实现DAO层创建UserDao接口及其实现类public interface UserDao { void save(User user); void update(User user); void delete(Integer id); User findById(Integer id); ListUser findAll(); } Repository public class UserDaoImpl implements UserDao { Autowired private JdbcTemplate jdbcTemplate; Override public void save(User user) { String sql INSERT INTO user(username, password, email, create_time) VALUES(?,?,?,?); jdbcTemplate.update(sql, user.getUsername(), user.getPassword(), user.getEmail(), new Timestamp(user.getCreateTime().getTime())); } Override public void update(User user) { String sql UPDATE user SET username?, password?, email? WHERE id?; jdbcTemplate.update(sql, user.getUsername(), user.getPassword(), user.getEmail(), user.getId()); } Override public void delete(Integer id) { String sql DELETE FROM user WHERE id?; jdbcTemplate.update(sql, id); } Override public User findById(Integer id) { String sql SELECT * FROM user WHERE id?; return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper(User.class), id); } Override public ListUser findAll() { String sql SELECT * FROM user; return jdbcTemplate.query(sql, new BeanPropertyRowMapper(User.class)); } }7. 测试CRUD操作创建测试类验证功能public class UserDaoTest { public static void main(String[] args) { ApplicationContext ctx new AnnotationConfigApplicationContext(AppConfig.class); UserDao userDao ctx.getBean(UserDao.class); // 创建用户 User user new User(); user.setUsername(testuser); user.setPassword(123456); user.setEmail(testexample.com); user.setCreateTime(new Date()); userDao.save(user); // 查询用户 User foundUser userDao.findById(user.getId()); System.out.println(Found user: foundUser); // 更新用户 foundUser.setEmail(updatedexample.com); userDao.update(foundUser); // 查询所有用户 ListUser users userDao.findAll(); System.out.println(All users: users); // 删除用户 userDao.delete(foundUser.getId()); } }8. 扩展功能可以进一步扩展以下功能分页查询批量操作事务管理使用NamedParameterJdbcTemplate替代JdbcTemplate9. 常见问题解决SQL异常处理建议使用Spring的DataAccessException体系处理数据库异常连接泄露确保正确关闭资源可以使用try-with-resources语句性能优化考虑使用批处理操作提高大批量数据操作的性能二、Spring常用注解核心容器注解Component通用组件注解标识该类为Spring组件示例Component public class UserService {...}Controller标识该类为Spring MVC控制器特点会自动将返回值转换为HTTP响应Service标识业务逻辑层组件应用场景服务层类通常使用此注解Repository标识数据访问层组件特点会将数据访问异常转换为Spring统一异常体系依赖注入注解Autowired自动装配依赖对象注入方式默认按类型可使用Qualifier指定名称示例Autowired private UserDao userDao;Qualifier配合Autowired使用指定具体的bean名称ResourceJSR-250规范中的依赖注入注解与Autowired区别默认按名称装配配置相关注解Configuration标识该类为配置类作用替代XML配置文件Bean声明方法返回一个bean示例Bean public DataSource dataSource() { return new DriverManagerDataSource(); }ComponentScan自动扫描组件参数可指定扫描包路径示例ComponentScan(com.example)AOP相关注解Aspect标识切面类Before前置通知示例Before(execution(* com.example.service.*.*(..)))After后置通知Around环绕通知特点可以控制目标方法是否执行事务管理注解Transactional声明事务参数可配置隔离级别、传播行为等应用场景服务层方法通常需要添加此注解Web相关注解RequestMapping映射请求路径可指定HTTP方法GET/POST/PUT/DELETE等RequestParam绑定请求参数PathVariable绑定URL模板变量示例GetMapping(/users/{id})测试相关注解2. 基础配置步骤2.1 启用注解扫描在Spring配置文件中添加组件扫描配置context:component-scan base-packagecom.example/或者使用Java配置类方式Configuration ComponentScan(com.example) public class AppConfig { // 其他配置 }2.2 示例代码实现2.2.1 定义DAO层Repository(userDao) public class UserDaoImpl implements UserDao { Override public void save() { System.out.println(保存用户数据...); } }2.2.2 定义Service层Service(userService) public class UserServiceImpl implements UserService { Autowired Qualifier(userDao) // 当有多个实现时指定具体bean private UserDao userDao; Override public void save() { userDao.save(); } }2.2.3 定义Controller层Controller public class UserController { Autowired private UserService userService; public void saveUser() { userService.save(); } }3. 高级应用场景3.1 生命周期注解Service public class LifecycleService { PostConstruct public void init() { System.out.println(初始化方法被调用); } PreDestroy public void destroy() { System.out.println(销毁方法被调用); } }3.2 条件装配Configuration public class AppConfig { Bean Conditional(WindowsCondition.class) public UserService windowsUserService() { return new WindowsUserServiceImpl(); } Bean Conditional(LinuxCondition.class) public UserService linuxUserService() { return new LinuxUserServiceImpl(); } }3.3 自动装配策略Service public class OrderService { // 1. 按类型自动装配 Autowired private OrderRepository orderRepository; // 2. 构造器注入 Autowired public OrderService(OrderRepository orderRepository) { this.orderRepository orderRepository; } // 3. Setter方法注入 private PaymentService paymentService; Autowired public void setPaymentService(PaymentService paymentService) { this.paymentService paymentService; } }4. 最佳实践建议5. 常见问题解决典型配置类示例Configuration ComponentScan(com.example) PropertySource(classpath:app.properties) public class AppConfig { Bean Lazy public UserService userService() { return new UserServiceImpl(); } Bean Profile(prod) public DataSource prodDataSource() { // 生产环境数据源配置 } }SpringBootTestSpring Boot测试注解三、Spring基于注解的IoC案例1. 注解驱动开发简介Spring框架从2.5版本开始引入基于注解的配置方式相比XML配置更加简洁高效。常用的核心注解包括Component标识一个类为Spring组件Controller标识表现层组件Service标识业务逻辑层组件Repository标识数据访问层组件Autowired自动装配依赖对象分层清晰严格区分Controller、Service、Repository的使用场景命名规范为组件指定有意义的名称如Service(userService)依赖注入优先使用构造器注入其次Setter注入最后字段注入异常处理结合ExceptionHandler实现统一异常处理测试支持使用SpringBootTest进行集成测试多个候选bean问题使用Qualifier指定具体bean使用Primary标记首选bean循环依赖问题重构代码消除循环依赖使用Lazy延迟初始化注解不生效检查组件扫描路径是否正确确认是否启用了注解驱动context:annotation-config/TestJUnit测试方法注解四、Spring 的纯注解配置配置类注解Configuration标识当前类是一个配置类替代传统的XML配置文件ComponentScan指定Spring扫描的包路径替代context:component-scan 示例ComponentScan(com.example.service)PropertySource加载properties配置文件 示例PropertySource(classpath:jdbc.properties)Bean定义注解Bean在方法上使用将返回值注册为Bean替代bean标签 示例Bean public DataSource dataSource() { return new DruidDataSource(); }Scope指定Bean的作用域 示例Scope(prototype)依赖注入注解Autowired自动装配默认按类型注入Qualifier配合Autowired使用指定Bean名称Value注入普通类型值 示例Value(${jdbc.url})条件注解Conditional根据条件决定是否创建BeanProfile指定环境配置 示例Profile(dev)其他常用注解Import导入其他配置类Lazy延迟初始化Primary指定首选BeanMockBean模拟依赖bean注以上注解在不同Spring版本中可能有所变化使用时需注意版本兼容性。四、Spring 的纯注解配置配置类注解Configuration标识当前类是一个配置类替代传统的XML配置文件ComponentScan指定Spring扫描的包路径替代context:component-scan 示例ComponentScan(com.example.service)PropertySource加载properties配置文件 示例PropertySource(classpath:jdbc.properties)Bean定义注解Bean在方法上使用将返回值注册为Bean替代bean标签 示例Bean public DataSource dataSource() { return new DruidDataSource(); }Scope指定Bean的作用域 示例Scope(prototype)依赖注入注解Autowired自动装配默认按类型注入Qualifier配合Autowired使用指定Bean名称Value注入普通类型值 示例Value(${jdbc.url})条件注解Conditional根据条件决定是否创建BeanProfile指定环境配置 示例Profile(dev)其他常用注解Import导入其他配置类Lazy延迟初始化Primary指定首选Bean典型配置类示例Configuration ComponentScan(com.example) PropertySource(classpath:app.properties) public class AppConfig { Bean Lazy public UserService userService() { return new UserServiceImpl(); } Bean Profile(prod) public DataSource prodDataSource() { // 生产环境数据源配置 } }