栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

声明式事务管理例题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

声明式事务管理例题

在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 ( 可运行项目 ) 和自己的代码,来定位问题所在。采用这种方式,学习有效果,排错有效率,可以较为明显地提升学习速度,跨过学习路上的各个槛。

源码:

链接:https://pan.baidu.com/s/1Y0RpFa0RpL0vZ2pVDJmhYQ?pwd=qvek
提取码:qvek

 这是项目依赖的jar包 

基于XML方式的声明式事务 

 1.创建一个动态web项目命名为chapter05,在src目录下创建一个jdbc包,在包内创建一个Hero实体类

package jdbc;

public class Hero {
private int id;
private String name;
private float hp;
private int damage;
public int  getid() {
	return id;
}
public void setid(int id) {
	this.id=id;
}
public String getname() {
	return name;
}
public void setname(String name) {
	this.name=name;
}
public float gethp() {
	return hp;		
}
public void sethp(float hp) {
	this.hp=hp;
}
public int getdamage() {
	return damage;
}
public void setdamage(int damage) {
	this.damage=damage;
}
public String toString() {
	return "id: "+id+" name: "+name+" hp: "+hp+" damage: "+damage;
}
}

2.创建一个HeroDao接口,声明方法。

package jdbc;

import java.util.List;

public interface HeroDao {
public int addHero(Hero hero) ;
public int updateHero(Hero hero);	
public int deleteHero(int id) ;

public Hero findHeroById(int id) ;
public List findAllHero() ;	

}

3.创建一个HeroDaoImpl类来实现方法

package jdbc;

import java.util.List;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

public class HeroDaoImpl implements HeroDao{
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
	this.jdbcTemplate=jdbcTemplate;
}
	@Override
	public int addHero(Hero hero) {
		// TODO Auto-generated method stub
		String sql="insert into hero(name,hp,damage) value(?,?,?)";
		Object []objects=new Object[] {
				hero.getname(),
				hero.gethp(),
				hero.getdamage()
		};
		int num=this.jdbcTemplate.update(sql,objects);
		if (num>0) {
			System.out.println("添加成功");
		}else {
			System.out.println("添加失败");
		}
		return num;
	}

	@Override
	public int updateHero(Hero hero) {
		// TODO Auto-generated method stub
		String sql="update hero set name=?,hp=?,damage=? where id=?";
		Object []objects=new Object[] {
			hero.getname(),
			hero.gethp(),
			hero.getdamage(),
			hero.getid()
		};
		int num=this.jdbcTemplate.update(sql,objects);
		if (num>0) {
			System.out.println("更新成功");
		}else {
			System.out.println("更新失败");
		}
		return num;
	}

	@Override
	public int deleteHero(int id) {
		// TODO Auto-generated method stub
		String sql="delete from hero where id=?";
		int num=this.jdbcTemplate.update(sql,id);
		if (num>0) {
			System.out.println("删除"+num+"条数据");
		}else {
			System.out.println("删除失败");
		}
		return num;
	}
	@Override
	public Hero findHeroById(int id) {
		// TODO Auto-generated method stub
		String sql="select * from hero where id=?";
		int n=1/0;
		RowMapper rowMapper=new BeanPropertyRowMapper(Hero.class);
		return this.jdbcTemplate.queryForObject(sql, rowMapper,id);
	}
	@Override
	public List findAllHero() {
		// TODO Auto-generated method stub
		String sql="select * from hero";
		RowMapper rowMapper=new BeanPropertyRowMapper(Hero.class);
		return this.jdbcTemplate.query(sql,rowMapper);
	}

}

4.创建一个切面用来通知

package jdbc;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyAspect {
	//定义切入点表达式
	@Pointcut("execution(* annotation.*.*(..))")
	//使用一个返回值为void、方法体为空的方法来命名切入点
	public void myPointCut(){}
	//前置通知
	@Before("myPointCut()")
	public void myBefore(JoinPoint joinPoint){
		System.out.print("前置通知:模拟执行权限检查..,");
		System.out.print("目标类是:"+joinPoint.getTarget());
		System.out.println(",被植入增强处理的目标方法为:"+joinPoint.getSignature().getName());
	}
	//后置通知
	@AfterReturning(value="myPointCut()")
	public void myAfterReturning(JoinPoint joinPoint) {
		System.out.print("后置通知:模拟记录日志..,");
		System.out.println("被植入增强处理的目标方法为:" + joinPoint.getSignature().getName());
	}
	
	@Around("myPointCut()")
	public Object myAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
		//开始
		System.out.println("环绕开始:执行目标方法之前,模拟开启事务..,");
		//执行当前目标方法
		Object obj=proceedingJoinPoint.proceed();
		//结束
		System.out.println("环绕结束:执行目标方法之后,模拟关闭事务..,");
		return obj;
	}
	//异常通知
	@AfterThrowing(value="myPointCut()",throwing="e")
	public void myAfterThrowing(JoinPoint joinPoint,Throwable e){
		System.out.println("异常通知:出错了"+e.getMessage());
	}
	//最终通知
	@After("myPointCut()")
	public void myAfter(){
		System.out.println("最终通知:模拟方法结束后释放资源..");
	}
}

5.创建一个applicationContext.xml文件来配置声明式事务处理



	
	
		
		
		
		
		
		
		
		
	
	
	
		
		
	
	
	
		
		
	
	
	
		
	
	
	
		
			
		
	
	
	
	
	
	
	
	
		
		
			
			
			
				
				
				 
				
				
				
				
				
				
				
		
			

 6.创建一个类测试功能

package jdbc;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TransactionTest {
public static void main(String[] args) {
	ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
	HeroDao heroDao=(HeroDao) applicationContext.getBean("heroDao");
	Hero hero=new Hero();
	hero.setname("zyy");
	hero.sethp(100f);
	hero.setdamage(50);
	heroDao.addHero(hero);
}
}

 运行结果:

 

基于Annotation方式的声明式事务

 1.对HeroDaoImpl类进行修改,对一些方法进行注释

@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,readOnly = false)

 

package jdbc;

import java.util.List;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

public class HeroDaoImpl implements HeroDao{
private JdbcTemplate jdbcTemplate;
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
	this.jdbcTemplate=jdbcTemplate;
}
	@Override
	@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.DEFAULT,readOnly = false)
	public int addHero(Hero hero) {
		// TODO Auto-generated method stub
		String sql="insert into hero(name,hp,damage) value(?,?,?)";
		Object []objects=new Object[] {
				hero.getname(),
				hero.gethp(),
				hero.getdamage()
		};
		int num=this.jdbcTemplate.update(sql,objects);
		if (num>0) {
			System.out.println("添加成功");
		}else {
			System.out.println("添加失败");
		}
		return num;
	}

	@Override
	public int updateHero(Hero hero) {
		// TODO Auto-generated method stub
		String sql="update hero set name=?,hp=?,damage=? where id=?";
		Object []objects=new Object[] {
			hero.getname(),
			hero.gethp(),
			hero.getdamage(),
			hero.getid()
		};
		int num=this.jdbcTemplate.update(sql,objects);
		if (num>0) {
			System.out.println("更新成功");
		}else {
			System.out.println("更新失败");
		}
		return num;
	}

	@Override
	public int deleteHero(int id) {
		// TODO Auto-generated method stub
		String sql="delete from hero where id=?";
		int num=this.jdbcTemplate.update(sql,id);
		if (num>0) {
			System.out.println("删除"+num+"条数据");
		}else {
			System.out.println("删除失败");
		}
		return num;
	}
	@Override
	public Hero findHeroById(int id) {
		// TODO Auto-generated method stub
		String sql="select * from hero where id=?";
		int n=1/0;
		RowMapper rowMapper=new BeanPropertyRowMapper(Hero.class);
		return this.jdbcTemplate.queryForObject(sql, rowMapper,id);
	}
	@Override
	public List findAllHero() {
		// TODO Auto-generated method stub
		String sql="select * from hero";
		RowMapper rowMapper=new BeanPropertyRowMapper(Hero.class);
		return this.jdbcTemplate.query(sql,rowMapper);
	}

}

2.对applicationContext.xml文件进行修改



	
	
		
		
		
		
		
		
		
		
	
	
	
		
		
	
	
	
		
		
	
	
	
		
	
	
	

3.运行一遍测试类,运行结果与基于XML方式的声明式事务结果相同。

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1016291.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号