这里列一个小的demo工程,直接利用Spring的jdbcTemplate访问Mysql数据库。
工程结构:
数据库中的tbl_student表结构如下:
数据实体类Student.java代码如下:
package com.mysrc.entity; import java.sql.Date; public class Student { private int id; private String name; private Date birth; private float score; public Student() { } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirth() { return birth; } public void setBirth(Date birth) { this.birth = birth; } public float getScore() { return score; } public void setScore(float score) { this.score = score; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", birth=" + birth + ", score=" + score + "]"; } }
数据访问类StudentDao.java代码如下:
package com.mysrc.dao; import java.util.List; import org.springframework.jdbc.core.JdbcTemplate; import com.mysrc.entity.Student; import com.mysrc.entity.StudentRowMapper; public class StudentDao { private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } public Student getStudentById(int id) { return jdbcTemplate.queryForObject( "select * from tbl_student where id = ?", new Object[] { id }, new StudentRowMapper()); } public List<Student> getAllStudent() { return jdbcTemplate.query("select * from tbl_student", new StudentRowMapper()); } public int insertStudent(Student student) { return jdbcTemplate.update( "insert into tbl_student(name,birth,score) values(?,?,?)", new Object[] { student.getName(), student.getBirth(), student.getScore() }); } public int deleteStudent(int id) { return jdbcTemplate.update("delete from tbl_student where id = ? ", new Object[] { id }); } public int updateStudent(Student student) { return jdbcTemplate.update( " update tbl_student set name=?,birth=?,score=? where id=? ", new Object[] { student.getName(), student.getBirth(), student.getScore(), student.getId() }); } }
服务类StudentService.java代码如下:
package com.mysrc.service; import java.sql.Date; import java.util.List; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.mysrc.dao.StudentDao; import com.mysrc.entity.Student; public class StudentService { private StudentDao dao; public void setDao(StudentDao dao) { this.dao = dao; } @Transactional(propagation = Propagation.NESTED, timeout = 1000, isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class, noRollbackFor = CustomRuntimeException.class) public void doComplexLogic() { // select List<Student> list = dao.getAllStudent(); for (Student student : list) { System.out.println(student); } // update Student student = list.get(0); student.setName("zhejiang"); dao.updateStudent(student); System.out.println("did update temporarily..."); // int a = 9 / 0; // 遇到异常,整个事务回滚 // 如果try catch捕获这个异常,那整个事务会顺利执行,不会回滚 int b = 2; if (b > 1) { throw new CustomRuntimeException(); // 事务不会回滚,也就是上面的update操作会提交 } // insert student = new Student(); student.setName("hello"); student.setBirth(new Date(354778)); student.setScore(78.9f); dao.insertStudent(student); System.out.println("did insert..."); // delete dao.deleteStudent(3); System.out.println("did delete..."); } class CustomRuntimeException extends RuntimeException { public CustomRuntimeException() { super(); } public CustomRuntimeException(String msg) { super(msg); } } }
doComplexLogic()方法模拟一个复杂的数据库操作过程,方法上加上了@Transactional,其中的各个注解的属性后面再详细研究。网上有人说@Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能,这个未验证。
Spring的上下文配置文件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:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd" xmlns:tx="http://www.springframework.org/schema/tx"> <bean id="basicDataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="url" value="jdbc:mysql://127.0.0.1:3306/mytestdb?characterEncoding=utf8" /> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="username" value="root" /> <property name="password" value="123456" /> <property name="maxActive" value="100" /> <property name="maxIdle" value="30" /> <property name="maxWait" value="1000" /> <property name="validationQuery" value="select 1" /> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <constructor-arg name="dataSource" ref="basicDataSource"> </constructor-arg> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager "> <property name="dataSource"> <ref bean="basicDataSource" /> </property> </bean> <bean id="studentDao" class="com.mysrc.dao.StudentDao"> <property name="jdbcTemplate"> <ref bean="jdbcTemplate" /> </property> </bean> <bean id="studentService" class="com.mysrc.service.StudentService"> <property name="dao"> <ref bean="studentDao" /> </property> </bean> <tx:annotation-driven transaction-manager="transactionManager" /> <!--这句话的作用是注册事务注解处理器 --> </beans>
测试类MyTester.java代码如下:
package com.mysrc.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.mysrc.service.StudentService; public class MyTester { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext( "applicationContext.xml"); StudentService studentService = (StudentService) context .getBean("studentService"); studentService.doComplexLogic(); } }
@Transactional 的所有可选属性如下
属性 | 类型 | 默认值 | 说明 |
propagation | Propagation枚举 | REQUIRED | 事务传播属性 |
isolation | isolation枚举 | DEFAULT | 事务隔离级别 |
readOnly | boolean | false | 是否只读 |
timeout | int | -1 | 超时(秒) |
rollbackFor | Class[] | {} | 需要回滚的异常类 |
rollbackForClassName | String[] | {} | 需要回滚的异常类名 |
noRollbackFor | Class[] | {} | 不需要回滚的异常类 |
noRollbackForClassName | String[] | {} | 不需要回滚的异常类名 |
整个eclipse工程代码文件在附件中。。
相关推荐
在"spring声明式事务管理配置方式"中,主要涉及到以下几个关键知识点: 1. **Spring事务管理器(Transaction Manager)**: - Spring支持多种事务管理器,如DataSourceTransactionManager(用于JDBC事务)和...
接下来,为了启用声明式事务管理,我们通常会在Spring的配置文件中添加`<tx:annotation-driven>`元素,这样Spring会自动扫描带有特定事务注解(如@Transactional)的方法,并根据注解的属性来管理事务。 ```xml ...
在这个"spring声明式事务处理demo"中,我们将探讨如何在MyEclipse环境下实现这一功能。 首先,我们要理解Spring事务管理的两种主要方式:编程式事务管理和声明式事务管理。编程式事务管理通常通过AOP(面向切面编程...
本文将深入探讨Spring声明式事务的实现机制、优缺点以及如何在实际项目中进行配置和使用。 1. **声明式事务管理概述** 声明式事务管理与编程式事务管理相对,后者需要开发者在代码中显式调用开始、提交、回滚等...
实验 "Spring 声明事务" ...通过这个实验,学生可以深入理解Spring声明式事务管理的工作原理,以及如何在实际项目中配置和使用。这将有助于他们在未来开发中更好地处理事务相关的复杂问题,确保应用程序的数据一致性。
在Spring框架中,声明式事务管理是实现事务处理...在博文"Spring使用XML配置声明式事务"中,作者详细讲解了每个步骤,并可能通过示例代码展示了如何实际应用这些配置,帮助读者更好地理解和掌握Spring声明式事务管理。
以下是关于Spring声明式事务配置管理的详细说明: 1. **事务管理器配置**: 在`/WEB-INF/applicationContext.xml`文件中,我们需要定义一个事务管理器Bean。通常,对于Hibernate,我们会使用`...
本篇将详细介绍如何在Spring 3和Hibernate 4中配置声明式事务管理,采用注解方式。 一、Spring的事务管理 Spring提供了两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理需要在代码中显式地调用...
Spring提供两种事务管理方式:编程式事务管理和声明式事务管理。编程式事务管理通过编写代码来控制事务的开始、提交、回滚等操作,灵活性高但侵入性强。相比之下,声明式事务管理则更加简洁,它通过配置或注解来...
总的来说,Spring 3和Hibernate 4结合使用声明式事务管理,使得我们无需在代码中显式调用事务开始、提交和回滚,而是通过注解和配置文件来声明事务的边界和行为。这种方式降低了代码的复杂度,提高了可维护性和可...
编程式事务管理需要开发者手动控制事务的开始、提交、回滚等操作,而声明式事务管理则通过配置或注解来定义事务边界,让Spring自动处理事务生命周期。 1. **注解驱动的事务管理** Spring提供了一些关键的注解,如`...
本文主要探讨Spring声明式事务管理的配置,这是Spring提供的一种简便的事务管理方式,允许开发者在不编写任何事务管理代码的情况下实现事务控制。这种方式极大地提高了代码的可维护性和可读性。 首先,我们要理解...
在Spring中,主要使用以下几种注解来实现声明式事务管理: 1. `@Transactional`:这是最常用的注解,用在方法上,表示该方法在一个事务上下文中执行。它包含了一些可选属性,如`propagation`(事务传播行为)、`...
Spring框架在事务管理方面提供了两种主要的实现方式:编程式事务管理和声明式事务管理。本篇文章将重点关注声明式事务管理中的注解驱动方式,也就是基于`@Transactional`注解的事务实现。这种方式使得代码更加简洁,...
本实例工程展示了如何在Spring 3和Hibernate 4中使用注解进行声明式事务管理,这是一种高效且易于维护的方法。接下来,我们将详细讨论相关知识点。 1. **Spring框架**:Spring是一个全面的后端开发框架,它提供了...
综上所述,Spring 2.x的声明式事务配置模板主要由`applicationContext.xml`中的事务管理器配置和注解驱动的事务管理两部分组成,结合`@Transactional`注解在业务逻辑中的使用,可以实现自动化、高效且易于维护的事务...
在实际项目中,Spring的声明式事务管理通常与Spring MVC或Spring Boot结合使用,提供更便捷的事务管理。通过上述步骤,我们可以轻松地在JavaEE环境中搭建Spring事务操作环境,并实现基本功能,从而确保应用程序的...
本篇文章将重点讨论如何在Spring框架中集成Hibernate,并探讨编程式事务管理和Spring AOP的声明式事务。 首先,让我们理解Spring与Hibernate的集成。为了整合这两个库,你需要在Spring配置文件中定义Hibernate的...