MyBatis有两个核心对象:SqlSessionFactory、SqlSession
-
SqlSessionFactory是MyBatis的核心对象,主要用于加载配置文件,初始化MyBatis,并创建SqlSession的作用。所以需要保证SqlSessionFactory在应用中全局唯一
-
SqlSession是MyBatis操作数据库的核心对象。SqlSession实在原始JDBC的基础上进行扩展,简化了与数据库的交互工作。并且SqlSession对象提供了数据表的CRUD对应的API方法。
-
SqlSession可以形象的看作是一个扩展过的JDBC的Connection扩展对象,它在原有的Connection对象的基础上封装了大量额外的实用方法
MyBatisUtils工具类
package com.cd.blog.config;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
/**
* @Author: 落叶无痕
* @Date: 2020/5/15 16:45
*/
public class MyBatisUtils {
/*MyBatisUtils工具类,目的是创建全局唯一的SqlSessionFactory对象*/
//static属于类不属于对象,且全局唯一
private static SqlSessionFactory sqlSessionFactory = null;
//利用静态块在初始化类时初始化SqlSessionFactory
static {
InputStream input = null;
try {
// 使用字节流方式加载classpath下的mybatis-config.xml核心配置文件
input = Resources.getResourceAsStream("mybatis-config.xml");
// 初始化SqlSessionFactory对象,并解析mybatis-config.xml文件
sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
} catch (IOException e) {
e.printStackTrace();
//初始化错误时,抛出ExceptionInInitializerError异常通知调用者
throw new ExceptionInInitializerError(e);
}
}
// 创建SqlSession对象(SqlSession是JDBC的扩展类,专门用于与数据库交互)
public static SqlSession openSession(){
//sqlSession默认会自动commit提交事务,设置为false代表关闭自动提交,改为手动提交
return sqlSessionFactory.openSession(false);
}
// 释放一个有效的SqlSession对象
public static void closeSession(SqlSession sqlSession){
if(sqlSession != null){
sqlSession.close();
}
}
}
测试
package com.cd.blog.config;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
/**
* @Author: 落叶无痕
* @Date: 2020/5/15 17:14
*/
public class TestMyBatisUtils {
@Test
public void demo(){
SqlSession sqlSession = null;
try{
sqlSession = MyBatisUtils.openSession();
Teacher teacher=new Teacher();
// 增
teacher.setName("wang");
sqlSession.insert("add",teacher);
// 改
teacher.setId(3);
teacher.setName("chen");
sqlSession.insert("update",teacher);
// 删
teacher.setId(3);
sqlSession.insert("delete",teacher);
//查
System.out.println("查");
getAll(sqlSession);
sqlSession.commit(); // 提交事务
}catch (Exception e){
throw e;
}finally {
MyBatisUtils.closeSession(sqlSession);
}
}
private static void getAll(SqlSession sqlSession){
List<Teacher> ts=sqlSession.selectList("getAll");
for (Teacher t:ts){
System.out.print(t.getId()+" , ");
System.out.println(t.getName());
}
}
}