[Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction
1.Spring中的数据库支持
把具有相同功能的代码模板抽取到一个工具类中。
2.关于jdbc template的应用
jdbcTemplate模板操作类,把访问jdbc的模板抽取到template中,使用模板类,可以不用管有关连接管理,关闭等细节,只关注核心业务代码,外围事情交给 Spring的模板去处理。
3.Spring框架关于对数据库的支持
A、统一的事务平台trasaction Management
B、提供Dao support,support封装了有关template.
public class SpringJdbcTemplateBestSupport extends JdbcDaoSupport implements IpersonDao {
public void save(Person p) {
//使用spring的jdbc Mapping工具,简化jdbc的调用
String sql = "insert into person(name,age) values('" + p.getName() + "'," + p.getAge() + ")";
System.out.println("save:" + sql);
getJdbcTemplate().update(sql);
}
}
C、提供对jdbc Mapping工具,简化了jdbc的调用 。
@SuppressWarnings({ "rawtypes", "unchecked" })
public List<Person> loadAll() {
return getJdbcTemplate().query("select * from person", new RowMapper() {
public Person mapRow(ResultSet rs, int rowNum) throws SQLException {
Person person = new Person();
person.setId(rs.getLong("id"));
person.setAge(rs.getInt("age"));
person.setName(rs.getString("name"));
return person;
}
});
}
D、把数据访问异常统一 封装起来。DataAccessException
E、整合其它ormapping框架
四、事务处理
1.事务概述
atomic(原子性):要么发生,要么都不发生
consistent(一致性):数据应该不被破坏 两个人同时访问数据库,其中一个人对数据库进行了操作,另一个人看到的数据应当保持刚开始的状态,不受到影响。
isolate(隔离性):用户间操作不相混淆
Durable(持久性):永久保存,例如保存到数据库等
jdbc事务的调用
Connection conn;
conn.setAutoCommit(false);
操作1.。
操作2.。
conn.commit();
hiberante
session.save(...);
tx.commit();
基于Spring操作事务的应用方式,编程式事务/声明式事务
2.Spring中的事务管理API
1)PlatformTransactionManager 事务管理器接口
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
2)TransactionStatus 事务状态
isNewTransaction() 是否是新事务
hasSavepoint() 保存点,oracle
void flush();刷新
3.声明式事务管理使用----基于xml
把事务控件有关的操作在配置文件中进行说明,代码中不要任何事务控制的代码
Spring中事务的传播:REQUIRED(需要事务,对会引起数据更新的方法)/SUPPORTSA(支持事务,对于查询类的就
去)
<!-- 配置事务 -->
<!-- 配置一个事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="mydataSource"></property>
</bean>
<!-- 配置事务通知 -->
<tx:advice id="transferServieAdvice" transaction-manager="transactionManager">
<!-- 事务属性 -->
<tx:attributes>
<tx:method name="transferMoney" propagation="REQUIRED" />
<tx:method name="saveMoney" propagation="REQUIRED" />
<tx:method name="takeMoney" propagation="REQUIRES_NEW" />
<!-- 查询类的方法用下面的配置 ,不用强制开事务,则可以提升性能 -->
<tx:method name="*" propagation="SUPPORTS" read-only="true" />
<!-- <tx:method name="*" propagation="REQUIRED" />
--> </tx:attributes>
</tx:advice>
<aop:config>
<!-- 增强,对哪一些切一点(pointcut)进行什么样(advice-ref)的事务增强。 -->
<aop:advisor advice-ref="transferServieAdvice" pointcut="execution(* com.amos..*
(..))" />
</aop:config>
4.声明式事务管理使用----基于注解
1)在配置文件 中告诉spring通过注解去扫描业务Bean的事务配置信息。
<!-- 配置事务 -->
<!-- 配置一个事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="mydataSource"></property>
</bean>
<!-- 表示事务的配置均在注解中 -->
<tx:annotation-driven/>
2)、写业务Bean时,在需要开启事务的Bean上或者方法使用@Transactional标签来指定事务配置的特性。
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void saveMoney(String name, Double money) {
......
}
@Transactional(propagation=Propagation.SUPPORTS)
public void takeMoney(String name, Double money) {
......
}
事务是定义在业务层!hibernate中把事务写在持久层会导致许多问题。
代码实现可参考https://github.com/amosli/lspring_jdbc.git
相关文章
- spring学习笔记(20)数据库事务并发与锁详解
- 【Spring Boot】Spring Boot之两种引入spring boot maven依赖的方式
- Spring Boot [使用 Druid 数据库连接池]
- [Spring Data JPA] Derived Query Methods
- spring boot:配置druid数据库连接池(开启sql防火墙/使用log4j2做异步日志/spring boot 2.3.2)
- 深入理解Spring Redis的使用 (九)、通过Redis 实现 分布式锁 的 BUG,以及和数据库加锁的性能测试
- spring boot单元测试之五:用mybatis+H2数据库测试sql(spring boot 2.4.3)
- Spring初始化Bean的过程
- Java Spring AOP研究之Joint Point
- Atitit db query op shourt code lib list 数据库查询最佳实践 JdbcTemplate spring v2 u77 .docx Atitit db query o
- Atitit Spring事务配置不起作用可能出现的问题: .是否是数据库引擎设置不对造成的【笔者就遇到了这个问题,由于笔者使用的是mysql数据,但是在创建表的时候引擎默认(mysql中引擎默认为
- Atitit spring注解事务的demo与代码说明 目录 1.1. Spring框架中,要如何实现事务?有一个注解,@EnableTransactionManagement1 1.2. 事务管理
- Atitit spring单元测试 注解 获取服务名 Spring文件单独放在一个文件夹,去掉dubbo配置,方便测试 里面包含的mybatis 找不到,只好设置成相对于class绝对路径可以了
- 为什么Spring Boot推荐使用logback-spring.xml来替代logback.xml来配置logback日志的问题分析
- 【项目实战】Spring Boot集成JavaMailSender发送邮件
- 掌握Spring Cloud Gateway:构建高性能API网关的原理和实践
- 【spring】Spring Data --Spring Data JPA
- Spring中构造方法、@PostConstruct、@Autowired、@Value的加载顺序
- Spring Boot 之spring.factories
- 学习Spring Boot:(十五)使用Lombok来优雅的编码
- spring为类的静态属性实现注入
- 1.3使用marven Spring项目快速搭建
- 009-Spring Boot 事件监听、监听器配置与方式、spring、Spring boot内置事件
- Spring Boot JPA 连接数据库
- 如何选择Spring cloud和 Spring Boot对应的版本
- 使用Java Spring消费MySQL中的数据库存储过程
- Spring Cloud Alibaba-Sentinel-使用熔断器仪表盘监控
- 【java】Spring Boot --深入SpringBoot注解原理及使用