day54 JavaWeb框架阶段——Spring04( Spring JdbcTemplate基本使用,声明式事务控制,基于 XML 的声明式事务控制,基于注解的声明式事务控制)

1. Spring JdbcTemplate基本使用

今日源码:
链接:https://pan.baidu.com/s/1-oaHcjKMrQHLj6jm–rljg
提取码:0o97


1.1 JdbcTemplate概述

  • 它是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装。spring框架为我们提供了很多的操作模板类。例如:操作关系型数据的JdbcTemplate和HibernateTemplate,操作nosql数据库的RedisTemplate,操作消息队列的JmsTemplate等等。

1.2 JdbcTemplate开发步骤

① 导入spring-jdbc和spring-tx坐标
② 创建数据库表和实体
③ 创建JdbcTemplate对象
④ 执行数据库操作

1.3 JdbcTemplate快速入门

① 导入坐标

<!--导入spring的jdbc坐标-->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-jdbc</artifactId>
	<version>5.0.5.RELEASE</version>
</dependency>

<!--导入spring的tx坐标-->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-tx</artifactId>
	<version>5.0.5.RELEASE</version>
</dependency>

② 创建accout表和Accout实体

在这里插入图片描述

public class Account {
private String name;
private double money;
//省略get和set方法
}

③ 创建JdbcTemplate对象
④ 执行数据库操作

//1、创建数据源对象
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test");
dataSource.setUser("root");
dataSource.setPassword("root");
//2、创建JdbcTemplate对象
JdbcTemplate jdbcTemplate = new JdbcTemplate();
//3、设置数据源给JdbcTemplate
jdbcTemplate.setDataSource(dataSource);
//4、执行操作
jdbcTemplate.update("insert into account values(?,?)","tom",5000);

1.4 Spring产生JdbcTemplate对象

  • 我们可以将JdbcTemplate的创建权交给Spring,将数据源DataSource的创建权也交给Spring,在Spring容器内部将
    数据源DataSource注入到JdbcTemplate模版对象中,配置如下:
<!--数据源DataSource-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
	<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
	<property name="jdbcUrl" value="jdbc:mysql:///test"></property>
	<property name="user" value="root"></property>
	<property name="password" value="root"></property>
</bean>
<!--JdbcTemplate-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
	<property name="dataSource" ref="dataSource"></property>
</bean>
  • 从容器中获得JdbcTemplate进行添加操作
@Test
public void testSpringJdbcTemplate() throws PropertyVetoException {
	ApplicationContext applicationContext = new
	ClassPathXmlApplicationContext("applicationContext.xml");
	JdbcTemplate jdbcTemplate = applicationContext.getBean(JdbcTemplate.class);
	jdbcTemplate.update("insert into account values(?,?)","lucy",5000);
}

1.5 JdbcTemplate的常用操作

  • 修改操作
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class JdbcTemplateCRUDTest {
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
//测试修改操作
public void testUpdate(){
	jdbcTemplate.update("update account set money=? where
name=?",1000,"tom");
}
}
  • 删除和查询全部操作
@Test
public void testDelete(){
	jdbcTemplate.update("delete from account where name=?","tom");
}
@Test
public void testQueryAll(){
	List<Account> accounts = jdbcTemplate.query("select * from account", new
	BeanPropertyRowMapper<Account>(Account.class));
	for (Account account : accounts) {
	System.out.println(account.getName());
	}
}
  • 查询单个数据操作操作
@Test
//测试查询单个对象操作
public void testQueryOne(){
	Account account = jdbcTemplate.queryForObject("select * from account where
	name=?", new BeanPropertyRowMapper<Account>(Account.class), "tom");
	System.out.println(account.getName());
}
@Test
//测试查询单个简单数据操作(聚合查询)
public void testQueryCount(){
	Long aLong = jdbcTemplate.queryForObject("select count(*) from account",Long.class);
	System.out.println(aLong);
}

1.6 知识要点

① 导入spring-jdbc和spring-tx坐标
② 创建数据库表和实体
③ 创建JdbcTemplate对象

  • JdbcTemplate jdbcTemplate = new JdbcTemplate();
  • jdbcTemplate.setDataSource(dataSource);

④ 执行数据库操作

  • 更新操作:
    • jdbcTemplate.update (sql,params)
  • 查询操作:
    • jdbcTemplate.query (sql,Mapper,params)
    • jdbcTemplate.queryForObject(sql,Mapper,params)

2. 编程式事务控制相关对象

2.1 PlatformTransactionManager

  • PlatformTransactionManager 接口是 spring 的事务管理器,它里面提供了我们常用的操作事务的方法。
方法 说明
TransactionStatus
getTransaction(TransactionDefination defination)
获取事务的状态信息
void commit(TransactionStatus status) 提交事务
void rollback(TransactionStatus status) 回滚事务

注意:
PlatformTransactionManager 是接口类型,不同的 Dao 层技术则有不同的实现类,例如:

  • Dao 层技术是jdbc或 mybatis 时:
    • org.springframework.jdbc.datasource.DataSourceTransactionManager
  • Dao 层技术是hibernate时:
    • org.springframework.orm.hibernate5.HibernateTransactionManager

2.2 TransactionDefinition

  • TransactionDefinition 是事务的定义信息对象,里面有如下方法:

在这里插入图片描述

2.2.1. 事务隔离级别

设置隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读和虚读。
⚫ ISOLATION_DEFAULT
⚫ ISOLATION_READ_UNCOMMITTED
⚫ ISOLATION_READ_COMMITTED
⚫ ISOLATION_REPEATABLE_READ
⚫ ISOLATION_SERIALIZABLE

2.2.2. 事务传播行为

属性名 说明
REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)
SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)
MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常
REQUERS_NEW 新建事务,如果当前在事务中,把当前事务挂起。
NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
NEVER 以非事务方式运行,如果当前存在事务,抛出异常
NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行 REQUIRED 类似的操作
超时时间 默认值是-1,没有超时限制。如果有,以秒为单位进行设置
是否只读 建议查询时设置为只读

2.3 TransactionStatus

  • TransactionStatus 接口提供的是事务具体的运行状态,方法介绍如下。

在这里插入图片描述

2.4 知识要点

  • 编程式事务控制三大对象
    • PlatformTransactionManager
    • TransactionDefinition
    • TransactionStatus

3. 基于 XML 的声明式事务控制

3.1 什么是声明式事务控制

Spring 的声明式事务顾名思义就是采用声明的方式来处理事务。这里所说的声明,就是指在配置文件中声明
,用在 Spring 配置文件中声明式的处理事务来代替代码式的处理事务。

声明式事务处理的作用
  • 事务管理不侵入开发的组件。具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可
  • 在不需要事务管理的时候,只要在设定文件上修改一下,即可移去事务管理服务,无需改变代码重新编译,这样维护起来极其方便
    注意:Spring 声明式事务控制底层就是AOP。

3.2 声明式事务控制的实现

声明式事务控制明确事项:

  • 谁是切点?
  • 谁是通知?
  • 配置切面?

① 引入tx命名空间
在这里插入图片描述
② 配置事务增强

<!--平台事务管理器-->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource"></property>
</bean>
<!--事务增强配置-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
	<tx:attributes>
		<tx:method name="*"/>
	</tx:attributes>
</tx:advice>

③ 配置事务 AOP 织入

<!--事务的aop增强-->
<aop:config>
	<aop:pointcut id="myPointcut" expression="execution(* com.itheima.service.impl.*.*(..))"/>
	<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"></aop:advisor>
</aop:config>

④ 测试事务控制转账业务代码

@Override
public void transfer(String outMan, String inMan, double money) {
accountDao.out(outMan,money);
int i = 1/0;
accountDao.in(inMan,money);
}

3.3 切点方法的事务参数的配置

<!--事务增强配置-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
	<tx:attributes>
		<tx:method name="*"/>
	</tx:attributes>
</tx:advice>

其中,<tx:method> 代表切点方法的事务参数的配置,例如:

<tx:method name="transfer" isolation="REPEATABLE_READ" propagation="REQUIRED" timeout="-1"
read-only="false"/>

⚫ name:切点方法名称
⚫ isolation:事务的隔离级别
⚫ propogation:事务的传播行为
⚫ timeout:超时时间
⚫ read-only:是否只读

3.4 知识要点

声明式事务控制的配置要点
⚫ 平台事务管理器配置
⚫ 事务通知的配置
⚫ 事务aop织入的配置

4. 基于注解的声明式事务控制

4.1 使用注解配置声明式事务控制

  1. 编写 AccoutDao
@Repository("accountDao")
public class AccountDaoImpl implements AccountDao {
	@Autowired
	private JdbcTemplate jdbcTemplate;
	public void out(String outMan, double money) {
		jdbcTemplate.update("update account set money=money-? where name=?",money,outMan);
}
public void in(String inMan, double money) {
	jdbcTemplate.update("update account set money=money+? where name=?",money,inMan);
	}
}

  1. 编写 applicationContext.xml 配置文件
<!—之前省略datsSource、jdbcTemplate、平台事务管理器的配置-->
<!--组件扫描-->
<context:component-scan base-package="com.itheima"/>
<!--事务的注解驱动-->
<tx:annotation-driven/>

4.2 注解配置声明式事务控制解析

① 使用 @Transactional 在需要进行事务控制的类或是方法上修饰,注解可用的属性同 xml 配置方式,例如隔离
级别、传播行为等。
② 注解使用在类上,那么该类下的所有方法都使用同一套注解参数配置。
③ 使用在方法上,不同的方法可以采用不同的事务参数配置。
④ Xml配置文件中要开启事务的注解驱动<tx:annotation-driven />

4.3 知识要点

注解声明式事务控制的配置要点
⚫ 平台事务管理器配置(xml方式)
⚫ 事务通知的配置(@Transactional注解配置)
⚫ 事务注解驱动的配置 <tx:annotation-driven/>



[点开我的主页系统的学习java]

发布了100 篇原创文章 · 获赞 6 · 访问量 4060

猜你喜欢

转载自blog.csdn.net/qq_38454176/article/details/104464864