Maison > Questions et réponses > le corps du texte
我用的mybatis是基于SqlSessionTemplate实现的,如下:
@Repository("daoSupport")
public class DaoSupport implements BaseDAO {
@Resource(name = "sqlSessionTemplate")
private SqlSessionTemplate sqlSessionTemplate;
/**
* 保存对象
* @param str
* @param obj
* @return
* @throws Exception
*/
public Object save(String str, Object obj){
return sqlSessionTemplate.insert(str, obj);
}
/**
* 批量更新
* @param str
* @param obj
* @return
* @throws Exception
*/
public Object batchSave(String str, List objs){
return sqlSessionTemplate.insert(str, objs);
}
/**
* 修改对象
* @param str
* @param obj
* @return
* @throws Exception
*/
public Object update(String str, Object obj){
Integer count=sqlSessionTemplate.update(str, obj);
@Service
public class OrderInfoService {
@Resource(name = "daoSupport")
private DaoSupport dao;
@SuppressWarnings("unchecked")
public List<PageData> getPerson() {
List<PageData> a =(List<PageData>)dao.findAllList(
"OrderInfoMapper.getOrderInfo");
return a;
}
public void save(PageData pd){
dao.save("OrderInfoMapper.saveOrderInfo", pd);
}
public void update(PageData pd){
dao.update("OrderInfoMapper.updateOrder", pd);
}
@SuppressWarnings("unchecked")
public List<PageData> list(PageData pd){
return (List<PageData>)dao.findForList("OrderInfoMapper.getOrderInfo", pd);
}
在xml文件里面写对应sql的Mapper,
我想在调用service层的方法操作数据库时,几条sql语句同时commit,其中有一条失败则全部不执行,就和jdbc那样先设置不自动commit,然后在commit那种,要在哪里配置或调用啥方法实现?
大家讲道理2017-04-18 10:53:03
Demandez à Baidu Spring la gestion des transactions
La première consiste à configurer les règles de gestion des transactions. Vous pouvez vous référer à Baidu pour savoir comment l'écrire spécifiquement. Je ne peux pas l'expliquer en une ou deux phrases
. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<aop:config>
<aop:pointcut id="interceptorPointCuts" expression="execution(* com.web..*.services..*Impl.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
<tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
<tx:method name="insert*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>
<tx:method name="delete*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>for="java.lang.Exception"/> -->
</tx:attributes>
</tx:advice>
Le deuxième type utilise l'annotation @Transactional
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--声明使用注解式事务-->
<tx:annotation-driven transaction-manager="transactionManager"/>
高洛峰2017-04-18 10:53:03
mybatis-printempsGestion programmatique des transactions MyBatis SqlSession vous fournit
des méthodes spécifiques pour gérer les transactions par programmation. Mais
lors de l'utilisation de MyBatis-Spring, vos beans seront injectés avec une SqlSession gérée par Spring
ou un mappeur géré par Spring. Cela signifie que Spring
se chargera toujours de vos transactions.Vous ne pouvez pas appeler SqlSession.commit(), SqlSession.rollback() ou
Quel que soit le paramètre de validation automatique de votre connexion JDBC, toute exécution
SqlSession.close() sur une SqlSession gérée par Spring. Si vous essayez de le faire, une exception UnsupportedOperationException sera levée. Remarque
ces méthodes ne sont pas exposées dans les classes de mappeur injectées.
d'une méthode de données SqlSession ou tout appel à une méthode de mappage en dehors d'une
Si vous souhaitez contrôler vos transactions par programmation, veuillez vous référer
transaction Spring sera automatiquement validée.
au chapitre 10.6 du manuel de référence Spring. Ce code montre comment
gérer une transaction manuellement à l'aide du PlatformTransactionManager
décrit dans la section 10.6.2.
高洛峰2017-04-18 10:53:03
Spring ne semble pas permettre la soumission manuelle des transactions, le conteneur Spring gérera automatiquement les transactions !
阿神2017-04-18 10:53:03
//使用事务处理,订单及货物订单必须同时插进2个表里面
@Transactional(rollbackFor=Exception.class)
public void save(PageData pd,Map<String,Integer> map,String uuid,int Uid){
dao.save("OrderInfoMapper.saveOrderInfo", pd);
OrderGood orderGood=new OrderGood();
for(String gid:map.keySet()){
Goods good=goodService.findOne(gid);
orderGood.setGname(good.getGname());
//Integer a=map.get(gid);
orderGood.setOgamount(map.get(gid));
orderGood.setGid(Integer.parseInt(gid));
orderGood.setOgtotalprize(map.get(gid)*good.getGprice());
orderGood.setUid(Uid);
orderGood.setOid(uuid);
dao.save("OrderInfoMapper.saveOrderGood", orderGood);
}
}
使用@Transactional 注解则成功解决问题,此注解是spring 的事务管理,使用前先配置如下:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--声明使用注解式事务-->
<tx:annotation-driven transaction-manager="transactionManager"/>
只需要在service层方法中执行多条mybatis的mapper并加上注解即可,发生异常则此方法的事务会回滚