1.创建数据库表,添加记录
2.创建service,搭建dao,完成对象创建和注入关系
(1)service注入dao,在dao注入JdbcTemplate,在JdbcTemplate注入DataSource
package com.atguigu.spring5.service;
import com.atguigu.spring5.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
//注入dao
@Autowired
private UserDao userDao;
}
package com.atguigu.spring5.dao;
public interface UserDao {
}
package com.atguigu.spring5.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImpl implements UserDao{
@Autowired
private JdbcTemplate jdbcTemplate;
}
3.在dao创建两个方法:多钱和少钱的方法,在service创建方法(转账的方法)
package com.atguigu.spring5.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImpl implements UserDao{
@Autowired
private JdbcTemplate jdbcTemplate;
//lucy转账100给mary
//少钱
@Override
public void reduceMoey() {
String sql ="update t_account set money=money-? username=?";
jdbcTemplate.update(sql,100,"lucy");
}
//多钱
@Override
public void addMoney() {
String sql ="update t_account set money=money+? username=?";
jdbcTemplate.update(sql,100,"mary");
}
}
package com.atguigu.spring5.service;
import com.atguigu.spring5.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
//注入dao
@Autowired
private UserDao userDao;
//转账的方法
public void accountMoney(){
//lucy少100
userDao.reduceMoey();
//mary多100
userDao.addMoney();
}
}
测试类
package com.atguigu.spring5.test;
import com.atguigu.spring5.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestBook {
@Test
public void testAccount(){
ApplicationContext context =
new ClassPathXmlApplicationContext("bean1.xml");
UserService userService = context.getBean("userService",UserService.class);
userService.accountMoney();
}
}
4.上面代码,如果正常执行是没有问题的,但是如果代码执行过程中出现异常,有问题
(1)上面的问题如何解决呢?
*使用事务进行解决
(2)事务解决过程
编程式事务管理(不常用)
事务 *** 作(Spring事务管理介绍)
1.事务添加到javaEE三层结构里面Service层(业务逻辑层)
2.在Spring进行事务管理 *** 作
(1)有两种方式:编程式事务管理和声明式事务管理(使用)
3.使用声明式事务管理
(1)基于注解方式
(2)基于xml配置文件方式
4.在Spring进行声明式事务管理,底层使用AOP原理
5.Spring事务管理API
(1)提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类
事务 *** 作(注解方式实现声明式事务管理)
1.在spring配置文件配置事务管理器
2.在spring配置文件,开启事务注解
(1)在spring配置文件引入名称空间tx
(2)开启事务注解
3.在service类上面(获取service类里面方法上面)添加事务注解
(1)@Transactional 这个注解添加到类上面,也可以添加方法上面
(2)如果把这个注解添加类上面,这个类里面所有的方法都添加事务
(3)如果把这个注解添加方法上面,为这个方法添加事务
因为有异常就执行了事务回滚(账户里的前没有多也没有少)
事务 *** 作(声明式事务管理参数配置)
1.在service类上面添加注解@Transactional,在这个注解里面可以配置事务相关参数
2.propagation: 事务传播行为
(1)多事务方法直接进行调用,这个过程中事务是如何进行管理的
3.isolation:事务隔离级别
(1)事务有特性称为事务隔离性,多事务 *** 作之间不会产生影响。不考虑隔离性产生很多问题
(2)有三个读问题:脏读、不可重复读、虚(幻)读
(3)脏读:一个未提交事务读取到另一个未提交事务的数据
(4)不可重复读:一个未提交事务读取到另一个提交事务修改数据
(5)虚读:一个未提交事务读取到另一个提交事务添加数据
(6)解决:通过设置事务隔离级别,解决读问题
4.timeout:超时时间
(1)事务需要在一定时间内进行提交,如果不提交进行回滚
(2)默认值是-1,设置时间以秒单位进行计算
5.readOnly:是否只读
(1)读:查询 *** 作, 写:添加修改删除 *** 作
(2)readOnly默认值false,表示可以查询,可以添加修改删除 *** 作
(3)readOnly默认值true,设置true之后,只能查询
6.rollbackFor:回滚
(1)设置出现哪些异常进行事务回滚
7.noRolbackFor:不回滚
(1)设置出现哪些异常不进行事务回滚
事务 *** 作(XML声明式事务管理)
1.在spring配置文件中进行配置
第一步 配置事务管理器
第二步 配置通知
第三步 配置切入点和切面
package com.atguigu.spring5.service;
import com.atguigu.spring5.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
//@Transactional(readOnly = false,timeout = 10, propagation = Propagation.REQUIRED)
public class UserService {
//注入dao
@Autowired
private UserDao userDao;
//转账的方法
public void accountMoney(){
// try {
//第一步 开启事务
//第二步 进行业务 *** 作
//lucy少100
userDao.reduceMoey();
//模拟异常
int i = 10/0;
//mary多100
userDao.addMoney();
//第三步 没有发生异常,提交事务
// }catch (Exception e){
//第四步 出现异常 事务回滚
// }
}
}
测试类
package com.atguigu.spring5.test;
import com.atguigu.spring5.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestBook {
@Test
public void testAccount2(){
ApplicationContext context =
new ClassPathXmlApplicationContext("bean2.xml");
UserService userService = context.getBean("userService",UserService.class);
userService.accountMoney();
}
}
事务 *** 作(完全注解声明式事务管理)
1、创建配置类,使用配置类替代xml配置文件
package com.atguigu.spring5.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
@Configuration //配置类
@ComponentScan(basePackages = "com.atguigu") //组件扫描
@EnableTransactionManagement //开启事务
public class TxConfig {
//创建数据库连接池
@Bean
public DruidDataSource getDruidDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.alibaba.druid.pool.DruidDataSource");
dataSource.setUrl("jdbc:mysql:///userdb");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
//创建JdbcTemplate对象
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource){
//到ioc容器中根据类型找到dataSource
JdbcTemplate jdbcTemplate = new JdbcTemplate();
//注入dataSource
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
//创建事务管理器
@Bean
public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource){
DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
transactionManager.setDataSource(dataSource);
return transactionManager;
}
}
package com.atguigu.spring5.service;
import com.atguigu.spring5.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
@Transactional(readOnly = false,timeout = 10, propagation = Propagation.REQUIRED)
public class UserService {
//注入dao
@Autowired
private UserDao userDao;
//转账的方法
public void accountMoney(){
// try {
//第一步 开启事务
//第二步 进行业务 *** 作
//lucy少100
userDao.reduceMoey();
//模拟异常
int i = 10/0;
//mary多100
userDao.addMoney();
//第三步 没有发生异常,提交事务
// }catch (Exception e){
//第四步 出现异常 事务回滚
// }
}
}
测试类
package com.atguigu.spring5.test;
import com.atguigu.spring5.config.TxConfig;
import com.atguigu.spring5.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestBook {
@Test
public void testAccount2(){
ApplicationContext context =
new AnnotationConfigApplicationContext(TxConfig.class);
UserService userService = context.getBean("userService",UserService.class);
userService.accountMoney();
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)