我用的mybatis是基于SqlSessionTemplate實(shí)現(xiàn)的,如下:
@Repository("daoSupport")
public class DaoSupport implements BaseDAO {
@Resource(name = "sqlSessionTemplate")
private SqlSessionTemplate sqlSessionTemplate;
/**
* 保存對(duì)象
* @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);
}
/**
* 修改對(duì)象
* @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文件里面寫對(duì)應(yīng)sql的Mapper,
我想在調(diào)用service層的方法操作數(shù)據(jù)庫時(shí),幾條sql語句同時(shí)commit,其中有一條失敗則全部不執(zhí)行,就和jdbc那樣先設(shè)置不自動(dòng)commit,然后在commit那種,要在哪里配置或調(diào)用啥方法實(shí)現(xiàn)?
小伙看你根骨奇佳,潛力無限,來學(xué)PHP伐。
Please use Baidu spring’s transaction management
The first one is to configure transaction management rules. You can search on Baidu on how to write it specifically. I can’t explain it in one or two sentences
<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>
The second way to use the annotation @Transactional
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--聲明使用注解式事務(wù)-->
<tx:annotation-driven transaction-manager="transactionManager"/>
Programmatic Transaction Management MyBatis SqlSession provides you
with specific methods to handle transactions programmatically. But
when using MyBatis-Spring your beans will be injected with a Spring
managed SqlSession or a Spring managed mapper. That means that Spring
will always handle your transactions.You cannot call SqlSession.commit(), SqlSession.rollback() or
SqlSession.close() over a Spring managed SqlSession. If you try to do
so, a UnsupportedOperationException exception will be thrown. Note
these methods are not exposed in injected mapper classes.Regardless of your JDBC connection's autocommit setting, any execution
of a SqlSession data method or any call to a mapper method outside a
Spring transaction will be automatically committed.If you want to control your transactions programmatically please refer
to chapter 10.6 of the Spring reference manual. This code shows how to
handle a transaction manually using the PlatformTransactionManager
described in section 10.6.2.
mybatis-spring
Spring does not seem to allow manual submission of transactions, the Spring container will automatically manage transactions!
//使用事務(wù)處理,訂單及貨物訂單必須同時(shí)插進(jìn)2個(gè)表里面
@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 的事務(wù)管理,使用前先配置如下:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--聲明使用注解式事務(wù)-->
<tx:annotation-driven transaction-manager="transactionManager"/>
只需要在service層方法中執(zhí)行多條mybatis的mapper并加上注解即可,發(fā)生異常則此方法的事務(wù)會(huì)回滾