达内12 note unit 09 01
1.spring事务管理
2.spring提供了对事务管理支持
spring采用aop机制完成事务控制
可以实现在不修改原有组件代码情况下实现事务控制功能。
spring提供了两种事务管理方式:
a。编程式事务管理(编写java代码)
TransactionTemplate
b.声明式事务管理(编写配置,大家都用这种)
xml版本配置
注解版本配置
--配置DataSourceTransactionManager
--开启事务注解配置<tx:annotation>
--在目标组件方法前添加@Transactional
注解版本例子:
例如UserServiceImpl中的regist注册方法需要事务:
第一步,我们现在applicationContext.xml中配置事务管理组件
<!-- 配置事务管理组件 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dbcp"></property>
</bean>
<!-- 开启事务注解标记@Transactional -->
<!-- 当调用带@Transactional 标记的方法时,将txManager事务管理功能切入到方法-->
<tx:annotation-driven transaction-manager="txManager"/>
第二步,在所有service类上,加上@Transactional注解
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco; min-height: 16.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco; color: #3933ff }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco; color: #777777 }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco; color: #4e9072 }
p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco; color: #931a68 }
p.p7 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco; color: #7e504f }
span.s1 { color: #931a68 }
span.s2 { color: #777777 }
span.s3 { color: #000000 }
span.s4 { color: #0326cc }
span.s5 { color: #4e9072 }
span.s6 { color: #7e504f }
span.s7 { color: #91afcb }
span.s8 { color: #3933ff }
span.s9 { text-decoration: underline; color: #4e9072 }
span.Apple-tab-span { white-space: pre }
package org.alexhe.note.service;
import javax.annotation.Resource;
import org.alexhe.note.dao.IUserDao;
import org.alexhe.note.entity.NoteResult;
import org.alexhe.note.entity.User;
import org.alexhe.note.util.NoteUtil;
import org.springframework.stereotype.Service;
@Service("userService")
@Transactional//这里加入事务注解
public class UserServiceImpl implements IUserService{
@Resource
private IUserDao userDao;//注入
@Override
public NoteResult checkLogin(String name, String pwd) throws Exception {
// TODO Auto-generated method stub
NoteResult result=new NoteResult();
User user=userDao.findByName(name);
if(user==null){
result.setStatus(1);
result.setMsg("用户名不存在");
return result;
}
String md5_pwd=NoteUtil.md5(pwd);
if(!user.getCn_user_password().equals(md5_pwd)){
result.setStatus(2);
result.setMsg("密码不正确");
return result;
}
result.setStatus(0);
result.setMsg("用户名和密码正确");
result.setData(user.getCn_user_id());//返回userid
return result;
}
@Override
public NoteResult regist(String name, String password, String nickname) throws Exception {
NoteResult result=new NoteResult();
//检测用户名是否被占用
User has_user=userDao.findByName(name);
if(has_user!=null){
result.setStatus(1);
result.setMsg("用户名已被占用");
return result;
}
//注册
User user=new User();
user.setCn_user_name(name);
user.setCn_user_desc(nickname);
String md5_pwd=NoteUtil.md5(password);
user.setCn_user_password(md5_pwd);//设置加密的密码
String userId=NoteUtil.createId();
user.setCn_user_id(userId);//设置userid
//调用userDao保存
userDao.save(user);
result.setStatus(0);
result.setMsg("注册成功");
return result;
}
}
xml版本配置例子:(配置比注解版复杂)
第一步,我们现在applicationContext.xml中配置事务管理组件,记得xml里加入aop的头
<!-- 配置事务管理组件 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dbcp"></property>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes><!-- 哪些方法用事务,就写在里面 -->
<tx:method name="regist"/>
<tx:method name="checkLogin"/>
<tx:method name="add*"/> <!-- 以add开头的所有方法 -->
<!-- <tx:method name="*"/> <!-- 所有方法都加注释 -->
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="target" expression="within(org.alexhe.note.service..*)"/> <!-- expression代表哪个组件,作用在哪些组件上,这里代表service包及其下面的所有组件-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="target"/>
</aop:config>