Spring的数据库操作和事务管理

一.概述

spring的数据库操作:spring是一个优秀的一站式框架,其中涵盖了很多持久化框架模板对象,如JDBC,hibernate,mybatis对象模板,极大地简化了数据库操作。

事务:表示逻辑上的一组操作,这组操作要么一起成功要么一起失败。最经典的就是银行转账业务,假设甲转一百块给乙,在转账过程中,可能发生各种异常,若此时没有事务,可能会发生甲的钱少了,而乙的钱没有增加的事件。

二.动态代理手写一个AOP的事务管理器(spring管理事务的机制)

假设现在在项目中不引入spring框架,我们来自己手写一个面向切面的事务管理机制。事务管理应该放在service,dao层只负责数据库的增删改查,假设我们现在有一系列service代码(如UserService,CustomerService,MoneyService),要是在每一个service单独实现事务管理,显然过于复杂,不符合编程中代码复用的思想。那么我们可以把这些重复的事务管理操作抽取到一个工厂类中,工厂负责生产Service,并根据是否有注解,区分这个Service是否要进行事务处理。我们可以用动态代理技术对Service进行代理,对需要进行事务处理的Service的方法进行增强。最终实现Service层的事务自动管理。

public <T extends Service> T getService(Class<T> clazz){//把泛型限制在Service的子类中
		try{
			//--把所有Service都写在配置文件中,根据配置文件创建具体的Service
			String infName = clazz.getSimpleName();
			String implName = prop.getProperty(infName);
			final T service = (T) Class.forName(implName).newInstance();
			//动态代理生成代理后的Service,实现事务管理自动化
			//--为了实现AOP,生成service代理,根据注解确定在Service方法执行之前和之后做一些操作,比如:事务管理/记录日志/细粒度权限控制....
			T proxyService =  (T) Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces()
				 , new InvocationHandler(){
				
					//根据注解控制事务
					public Object invoke(Object proxy, Method method,Object[] args) throws Throwable {
						
						if(method.isAnnotationPresent(Tran.class)){//如果有注解,则管理事务:
							try{
								TransactionManager.startTran();//--自定义事务管理器,开启事务
								
								Object obj = method.invoke(service, args);//--真正执行方法
								
								TransactionManager.commit();//--提交事务
								return obj;
							}catch (InvocationTargetException e) {
								TransactionManager.rollback();//--回滚事务
								throw new RuntimeException(e.getTargetException());
							} catch (Exception e) {
								TransactionManager.rollback();//--回滚事务
								throw new RuntimeException(e);
							}finally{
								TransactionManager.release();//--释放资源
							}
						}else{//如果没有注解,则不管理事务,直接执行方法
							return method.invoke(service, args);
						}
					}
				 
			 });
			 
			return proxyService;
			
		}catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}
	}
	
.spring中的事务操作解析

spring提供了很多主流的持久化框架模板,包括最基础的JDBC,ORM框架hibernate,mybatis等。具体模板类对应如下:

下面以JDBC模板为例,解析spring持久化模板类的使用。

1.导入必要的jar包

以mysql为例,故要导入mysql驱动包

spring中jdbc操作相关包

spring事务操作相关包

2.编写测试类:spring持久化模板使用非常简单,获得模板对象后直接就可以对数据库进行增删改查

@Test
// JDBC 模板的基本使用:
public void demo1(){
//注册数据库配置
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///spring_crc");
dataSource.setUsername("root");
dataSource.setPassword("123");

//获得模板类后就可以直接操作数据库
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update("insert into account values (null,?,?)", " crc
",10000d);
}
3.每一次使用都要配置数据库显然过于麻烦,故把数据库的配置交给spring管理,在主配置文件中配置如下bean,并使用c3p0代替原来的数据源

<bean id="dataSource"
class="
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值