继续上一篇文章中所述项目的代码整理学习,前面提到直接使用springJDBC的进行数据层的操作,事务控制是必须要有的,那么这里整理一下之前使用的事务控制内容。
首先Spring的事务控制是很完善的,能够满足本人目前遇到的几乎所有项目,具体的内容就不展开论述了,因为太多了
。这里贴一张图,基本就可以理清Spring事务控制的最基本配置。本图来源于博客园
由于实际项目周期的问题以及个人习惯能注解就注解=。=,当然因为某种原因,这里并不是使用纯注解的方式进行事务配置,而是使用了tx拦截器的方式进行声明式事务配置(入乡随俗,充分利用Spring特色),其中运用到的aop面向切面编程后续文章中会专门对他的aspectj代理机制进行总结,这里就不对其展开代码编写试验了,当然这里的项目aspectjweaver的JAR包是肯定要添加的
。
首先由于是直接使用SpringJdbc因而使用DataSourceTransactionManager进行事务管理<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>其次自然需要开启tx标签注解事务
[code="java<!-- 开启注解事务 只对当前配置文件有效 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- 事务管理配置 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="create*" propagation="REQUIRED" />
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="remove*" propagation="REQUIRED" />
<tx:method name="cancel*" propagation="REQUIRED" />
<tx:method name="get*" propagation="REQUIRED" read-only="true" />
<tx:method name="query*" propagation="REQUIRED" read-only="true" />
<tx:method name="find*" propagation="REQUIRED" read-only="true" />
<tx:method name="load*" propagation="REQUIRED" read-only="true" />
<tx:method name="count*" propagation="REQUIRED" read-only="true" />
<tx:method name="list*" propagation="REQUIRED" read-only="true" />
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice>
最后开启Aop的监听与监听切面
<aop:aspectj-autoproxy expose-proxy="true" /><aop:config expose-proxy="true">
<!-- 只对业务逻辑层实施事务 -->
<aop:pointcut id="txPointcut"
expression="execution(* com.zh..service.impl.*ServiceImpl.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />
</aop:config>
这样配置就结束了。对于不想使用切面直接使用纯注解方式后续的文章总结中可以尝试使用。
接下去就可以展开编码测试了,在上文的基础上新建了Service类,并加入@service注解,使得调用的时候可以自动注入@Service("userService")
public class UserServiceImpl implements UserService{
@Autowired
private BaseDao baseDao;
public void saveUser(String sql) {
try {
baseDao.addBySql("insert into user (name,age)values('张三',13)", null);
baseDao.addBySql("insert into user (id,name,age)values(2,'张三',13)", null);
} catch (Exception e) {
System.out.println("代码错误新增事务回滚");
}
}
}
如果事务正常控制则因为第二条新增语句错误(因id为2的记录已存在,可自行修改)而catch到异常并且数据库中没有新增的记录(ps.数据库很简单,就死一张user表,有id,name,age三个字段,id为主键自增)。经测试,测试结果与预测一致。
ps:注意点:在dao层新增时,如果是以下情况则数据库直接新增前一条记录public void addBySql(String sql,final Object[] params) {
jdbcTemplate.execute(sql);
}
因而保存语句应该使用PreparedStatement,
jdbcTemplate.update(sql,
new PreparedStatementSetter() {
public void setValues(PreparedStatement ps)
throws SQLException {
ps.setInt(1, Integer.parseInt(params[0].toString()));
}
});
进入jdbcTemplate.execute()方法可以发现它是直接调用Statement.execute直接执行因为事实上数据库事务已经提交而调用update方法时是使用PreparedStatement进行预编译的。
测试代码见附件,以上内容如有错误 烦请斧正,希望能够在大家的指导下更进一步,谢谢。
下一篇博文将会对SpringJDBC的多数据源在本项目中的实际运用进行总结。
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0113/9844/5f9f26fd-9e49-3a43-92be-87bff0382da7-thumb.jpg)
- 大小: 53.6 KB
分享到:
相关推荐
在本篇博客“小码农的代码(三)----------SpringJDBC多数据源应用”中,博主探讨了如何在Spring框架中实现对多个数据库的数据源切换。SpringJDBC是Spring框架的一部分,它提供了对Java Database Connectivity (JDBC...
在"小码农的代码(一)——SpringJDBC的使用"这篇博文中,我们将探讨SpringJDBC如何帮助我们更好地管理和执行SQL语句。 首先,SpringJDBC提供了一个抽象层,它将传统的JDBC API封装起来,减少了手写模板代码的需求...
**二、SpringBoot集成Sharding-JDBC** 1. **依赖添加**:在`pom.xml`中引入SpringBoot和Sharding-JDBC的相关依赖,包括`spring-boot-starter-jdbc`和`sharding-jdbc-spring-boot-starter`。 2. **配置ShardingRule...
MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使你更好地将关注点集中在你的应用程序上。同时,MyBatis-Spring 是一个 MyBatis 与 Spring 框架的集成,它为 MyBatis 提供了 Spring...
3. **面向切面编程(Aspect-Oriented Programming,AOP)**:Spring的AOP模块支持声明式事务管理、日志记录、性能监控等跨功能关注点的实现。开发者可以定义切面,将这些关注点与业务逻辑分离。 4. **数据访问/集成...
ShardingJDBC具有良好的扩展性,可以与其他中间件如Mybatis、Spring JDBC等无缝集成。此外,它的插件化设计使得添加新的功能或优化现有功能变得简单。 **9. 监控与管理** ShardingJDBC提供了监控和管理工具,可以...
- **Spring框架**:IOC容器、AOP编程、事务管理等。 - **MyBatis**:映射文件、动态SQL、缓存机制。 - **Spring Boot/Spring Cloud**:快速构建微服务架构应用的方法。 #### 3. 实战项目经验积累 - **MVC模式**:...
- Spring整合了JDBC、ORM框架(Hibernate、JPA)、OXM,提供了事务管理支持。 19. **AOP** - AOP用于实现关注点分离,如日志记录、性能监控等。 - 通知类型包括前置、后置、环绕、异常和最终通知。 - 切面由...
9. **spring-jdbc-5.0.6.RELEASE.jar**:Spring JDBC模块简化了数据库操作,提供了一套抽象层,使得开发者无需直接处理JDBC API。它包括了事务管理、数据库连接池集成以及SQL语句的执行和结果映射。 10. **spring-...
这是一个基于Java SSM(Spring、SpringMVC、MyBatis)框架与前端Vue.js技术构建的毕业设计项目,主要用于小码创客教育的教学资源管理。该项目整合了后端服务与微信小程序,提供了一套完整的在线教学资源库解决方案。...
【Spring核心IOC以及DI】是Spring框架中的关键概念,它们是Spring实现控制反转(Inversion of Control,简称IOC)和依赖注入(Dependency Injection,简称DI)的基石。这两个概念是Spring框架的核心,使得应用程序的...
- JDBC的基本使用和事务管理 - Servlet和JSP的交互 - HTML/CSS/JavaScript前端技术 - 数据库设计与SQL查询 - MVC设计模式和三层架构 通过实践这个项目,你可以提升JavaEE应用开发能力,掌握SSM框架的整合,同时对...
总结起来,Spring Boot适配多数据源和多类型数据库主要涉及配置数据源、创建Bean、设置事务管理器以及在业务逻辑中选择合适的数据源。通过这种方式,我们可以在同一个应用中灵活地管理多个数据库,满足复杂的企业级...
2. **AOP(面向切面编程)**:Spring提供了对AOP的支持,允许开发者定义横切关注点,如日志、事务管理等,从而实现代码的模块化和解耦。 3. **Spring MVC**:Spring的Web MVC框架,用于构建RESTful Web服务,支持...
- **事务管理**:Spring Boot自动管理JPA的事务,可以方便地控制事务的边界。 - **懒加载和级联操作**:通过`@OneToMany`、`@ManyToOne`等注解实现关联关系,并可配置懒加载和级联操作策略。 - **实体关系映射**:...
DI使得对象之间的依赖关系得以解耦,AOP则允许程序员定义横切关注点,如日志、事务管理等,降低了代码的复杂性。 2. **Spring MVC**:是Spring框架的一个模块,用于构建Web应用程序。它提供了模型-视图-控制器...
1. 代码重复:在 JDBC 中,每个 SQL 查询都需要手动打开连接、创建 Statement、处理结果集等,导致大量重复代码。 2. 效率低下:频繁的手动管理数据库连接可能导致资源浪费,尤其是在高并发场景下。 3. SQL 动态性差...
- **事务管理**: 支持细粒度的事务控制。 - **异常处理**: 提供了一套机制来处理程序中可能出现的各种异常。 - **AOP(面向切面编程)**: 通过AOP支持可以将横切关注点(如日志记录、安全控制等)从业务逻辑中分离出来...
Spring提供了声明式事务管理,只需在Service层的方法上添加@Transactional注解,即可实现事务控制。 单元测试也是开发中不可或缺的部分。Spring的Test框架可以帮助我们对单个Bean或一组Bean进行隔离测试,确保代码...