3.3.6 MyBatis事務管理
六、MyBatis事務管理
1. 事務(Transaction)
(1) 事務是數據庫操作的最小單元, 有 ACID 的特性. 應該保證一個事務的的 SQL 語句要麽同時成功, 要麽都不成功.
(2) MyBatis 中配置了事務管理器, type 屬性設置為 JDBC.表示 MyBatis 采用和原生 JDBC 相同的事務管理機制.
(3) 在 MyBatis 執行的開始時, 將自動提交功能關閉了 . 所以,在執行 DML 操作時, 需要手動提交事務.
2. 簡單提取工具類
package com.bjsxt.util;
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MyBatisUtil {
private static SqlSessionFactory factory =
static {
try {
InputStream is =
Resources. getResourceAsStream("mybatis-cfg.xml");
factory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSession() {
SqlSession session = null;
if (factory != null) {
// true表示開啟自動提交
// session = factory.openSession(true);
session = factory.openSession();
}
return session;
}
}
3. 新增(insert)
mapper 文件中 , 通過<insert>定義新增語句. 註意, 由於DML 操 作 的 返 回 值 都 是 int 類 型 , 所 以 , 不 需 要 定 義resultType 屬性.
<!-- 新增 -->
<insert id="insUser" parameterType="user">
insert into t_user values (default, #{username}, #{password})
</insert>
@Test
public void testIns() {
SqlSession session = MyBatisUtil. getSession();
User user = new User();
user.setUsername(" 小明");
user.setPassword("123");
int num = session. insert("com.bjsxt.mapper.UserMapper.insUser",
user);
if(num > 0) {
// 提交事務
session.commit();
System. out.println("SUCCESS!");
} else {
// 回滾事務
session.rollback();
System. out.println("FAILED!");
}
// 關閉資源
session.close();
}
3.3.6 MyBatis事務管理