六、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 = null;
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();
}