spring-05

代码:spring05-1

1.切面注解形式

步骤:

1.xml文件中开启切面注解

<!--开启切面注解  -->

<aop:aspectj-autoproxy/>

2.配置切面

@Aspect

public classMyAspect

3.配置切入点

@Pointcut(value="execution(*service..*(..))")

public voidpointcut(){

 

}

4.配置通知

@Before(value="pointcut()")/导切面包下的 另一个包是测试的    导入后测试先测这个

public voidbefore(){

System.out.println("我是前置通知");

}

2.切入点的写法

@Around(value="execution(*service.PersonServiceImpl.find())")

这样的写法只能在当前的通知中使用

 

@Pointcut(value="execution(*service..*(..))")

public voidpointcut(){

 

}//使用了切面注解执行顺序不由人控制了,先执行环绕通知,再执行前置通知

 

当使用方法时   这样能做到切入点的重用。

3.环绕通知同的joinPoint.proceed()方法的作用

作用:

执行下一个通知。如果没有下一个通知,才执行目标方法。

意义:

多个环绕通知在一个切入点上将会嵌套执行。

4.SpringJDBC整合(c3p0链接池)

<!--配置数据源  -->

<beanid="dataSource"class="com.mchange.v2.c3p0.ComboPooledDataSource">

<propertyname="driverClass"value="${c3p0.driver}"></property>

<propertyname="jdbcUrl" value="${c3p0.url}"></property>

<propertyname="user" value="${c3p0.user}"></property>

<propertyname="password"value="${c3p0.password}"></property>

</bean>

5、JDBCTemplate 模板(一般实际开发中不用)

Mybates更高级的数据库连接

<!--jdbc模板  -->

<bean id="jdbcTemplate"class="org.springframework.jdbc.core.JdbcTemplate">

<propertyname="dataSource" ref="dataSource"></property>

</bean>

 更新:

dao层代码

@Override

public voidupdateUser(User user) {

String sql ="update user set name=?,salary=?,sex=? where id=?";

jdbcTemplate.update(sql,user.getName(),user.getSalary(),user.getSex(),user.getId());

 

}

代码spring05-4

查询单个:

@Override

public UserfindOne(int id) {

String sql ="select * from user where id =?";

User user =jdbcTemplate.queryForObject(sql, userMapper,id);

System.out.println("执行查询操作");

return user;

}

查询所有:

Mapper

@Component

public classUserMapper implements RowMapper<User>{

 

@Override

public UsermapRow(ResultSet set, int index) throws SQLException {

User user = newUser();

user.setId(set.getInt("id"));

user.setName(set.getString("name"));

user.setSalary(set.getInt("salary"));

user.setSex(set.getString("sex"));

return user;

}

}



代码: spring05-5

分层

代码:spring05-6

在分层上添加简单业务(在查找find中添加切面缓存),但是没有事务

代码:spring05-7

6.声明式事务处理

步骤:

1.导入jar

修改配置文件的头


2.配置事务管理器

<!--1.配置事务管理器  -->

<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<propertyname="dataSource" ref="dataSource"></property>

</bean>

将来统一管理数据库中的事务,注入dataSource

3.配置事务通知

<!--配置事务通知  -->

<tx:advicetransaction-manager="transactionManager" id="txAdvice">

<tx:attributes>

<tx:methodname="add*" propagation="REQUIRED"/>

<tx:methodname="update*" propagation="REQUIRED"/>

<tx:methodname="del*" propagation="REQUIRED"/>

<tx:methodname="find*" propagation="SUPPORTS"read-only="true"/>//read-only="true"这样写底层会做优化性能会提高

<tx:methodname="*" propagation="SUPPORTS"read-only="true"/>

</tx:attributes>

</tx:advice>

	<!-- 配置事务通知
	tx:method name="add*" 用来匹配目标对象的方法名,只能匹配add开头的方法
	propagation="REQUIRED" 隔离级别  REQUIRED 必须添加事务
	SUPPORTS 支持的  事务维持原状  原来有事务则添加事务(一个事务)事务保持一致  如果之前没有事务  则不管
								 vice A{
								 	a() {
								 		add() 添加操作  添加事务
								 		service B.b(
								 			find();//保持原样添加事务
								 			update();//事务进行合并成为一个事务
								 		);
								 	}
								 }
								 REQUIRES_NEW 每次总是添加新的事务
	read-only="true" 加快底层查询操作的时间
	rollback-for="异常的全名" 当遇到某种异常时 事务回滚rollback-for="java.sql.SQLException"
	no-rollback-for="异常的全名" 当遇到某种异常时 事务不回滚  no-rollback-for="java.lang.RuntimeException"
	 -->
	<tx:advice transaction-manager="transactionManager" id="txAdvice">
		<tx:attributes >
			<tx:method name="add*" propagation="REQUIRED" rollback-for="java.sql.SQLException" no-rollback-for="java.lang.RuntimeException"/><!--REQUIRED必须的   必须添加事务-->
			<tx:method name="update*" propagation="REQUIRED"/>
			<tx:method name="del*" propagation="REQUIRED"/>
			<tx:method name="find*" propagation="SUPPORTS" read-only="true"/><!--  read-only="true"这样配置底层会处理效率会更高,可以提高性能 -->
			<tx:method name="*" propagation="SUPPORTS" read-only="true"/>
		</tx:attributes>
	</tx:advice>

4.aop的配置

<aop:config>

<aop:pointcutexpression="execution(* service..*(..))" id="pc"/>

<aop:advisoradvice-ref="txAdvice" pointcut-ref="pc"/>

</aop:config>

 

5.事务的回滚策略(在代码中的添加方法中演示)

1.当遇到RuntimeException时 spring默认事务回滚。(RuntimeException错误级别比较高,会让程序死掉


2.当遇到检查异常时,spring默认事务回滚。(检查时异常错误级别别叫低,程序员可以自己处理的)


3.如果你想自己来控制事务是否回滚可以用如下方法:

	rollback-for="异常的全名" 当遇到某种异常时 事务回滚rollback-for="java.sql.SQLException"
	no-rollback-for="异常的全名" 当遇到某种异常时 事务不回滚  no-rollback-for="java.lang.RuntimeException"

	<tx:method name="add*" propagation="REQUIRED" rollback-for="java.sql.SQLException" no-rollback-for="java.lang.RuntimeException"/><!--REQUIRED必须的   必须添加事务-->
这样后你就改变了spring自己的回滚方式,这样配置以后遇到检查时异常(sqlException)时回滚,遇到 Runtime Exception时不回滚

声明式事务处理的参数

<!--配置事务通知 

tx:methodname="add*"   用来匹配目标对象的方法名  只能匹配Add开头的方法

propagation="REQUIRED"  隔离级别

REQUIRED 必须添加事务

SUPPORTS 支持的    原来有事务则添加事务事务保持一致        如果之前没有事务则不管

REQUIRES_NEW 每次总是添加新的事务

read-only="true"加快底层查询操作用的时间

rollback-for="异常的全名" 当遇到某种异常时                        事务回滚

no-rollback-for="异常的全名当遇到某种异常时              事务不回滚

service A{

a(){

add() 添加操作   添加了事务

service B.b(

//find();  //保持原样添加事务

update(); 事务进行合并成一个事务

);

}

}        

-->

Spring声明式的事务处理的意义:

将来我们程序员自己无需手动的维护事务。都交给spring来完成。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值