<insert id="insertOrder" parameterType="Integer"> insert into orders(user_id, total) select user_id, sum(total) from cart where user_id = #{userId} insert into order_detail(order_id, book_id, num, total) select o.order_id, c.book_id, c.num, c.total from cart c join orders o on c.user_id = o.user_id where c.user_id = #{userId} </insert> ssm项目中的mapper如何先执行第一条insert语句后,再执行第二条
时间: 2024-03-14 08:46:37 浏览: 13
在 Mybatis 中,可以使用 `useGeneratedKeys` 属性来获取自动生成的主键值,但是它只适用于单条插入语句。对于多条插入语句,Mybatis 并没有提供类似的机制来获取自动生成的主键。
如果要先执行第一条插入语句,再执行第二条插入语句,可以使用 Mybatis 的 `SqlSession` 对象的 `commit()` 方法来手动提交事务。例如:
```
try {
sqlSession.insert("insertOrder", userId);
sqlSession.insert("insertOrderDetail", userId);
sqlSession.commit(); // 手动提交事务
} catch (Exception e) {
sqlSession.rollback(); // 出现异常时回滚事务
throw e;
}
```
在这个例子中,先执行第一条插入语句 `insertOrder`,再执行第二条插入语句 `insertOrderDetail`,最后通过 `commit()` 方法手动提交事务。如果在执行过程中出现异常,会将事务回滚到最初的状态。
需要注意的是,如果要使用手动提交事务的方式,需要将 Mybatis 的事务管理模式设置为 `MANUAL`,可以在 Mybatis 的配置文件中添加以下配置:
```
<configuration>
<settings>
<setting name="defaultExecutorType" value="REUSE"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="defaultStatementTimeout" value="25000"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="logImpl" value="SLF4J"/>
<setting name="executorType" value="MANUAL"/> <!-- 手动提交事务 -->
</settings>
<mappers>
<!-- mapper 配置 -->
</mappers>
</configuration>
```
在这个例子中,将 `executorType` 属性设置为 `MANUAL`,表示使用手动提交事务的方式。