@Test
public void testStart() throws IOException {
// 1.mybatis 主配置文件
String config = "mybatis-config.xml";
// 2.读取配置文件
InputStream in = Resources.getResourceAsStream(config);
// 3.创建 SqlSessionFactoryBuilder 对象,目的是获取 SqlSession
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 4.创建 SqlSessionFactory 对象
SqlSessionFactory factory = builder.build(in);
// 5.获取 SqlSession,SqlSession 能执行 sql 语句
SqlSession session = factory.openSession();
// 6.指定要执行的 sql 语句的标识 = SQL映射文件中的 namespace + "." + 标签的id
String sql = "com.bjpowernode.dao.StudentDao.selectStudents";
// 7.执行 SqlSession 的 selectList()
List<Student> studentList = session.selectList(sql);
// 8.循环输出查询结果
studentList.forEach( student -> System.out.println(student));
// 9.关闭 SqlSession,释放资源
session.close();
}
1、MyBatis 中使用到的对象
Resources 类
Resources
类,顾名思义就是资源,用于读取资源文件。其有很多方法通过加载并解析资源文件,返回不同类型的 IO 流对象。
SqlSessionFactoryBuilder 类
SqlSessionFactory
的创建 , 需要使用 SqlSessionFactoryBuilder
对象的 build()
方 法 。 由于 SqlSessionFactoryBuilder
对象在创建完工厂对象后,就完成了其历史使命,即可被销毁。所以,一般会将该 SqlSessionFactoryBuilder
对象创建为一个方法内的局部对象,方法结束,对象销毁。
SqlSessionFactory 接口
SqlSessionFactory
接口对象是一个重量级对象(系统开销大的对象),是线程安全的, 所以一个应用只需要一个该对象即可。 创建SqlSession
需要使用 SqlSessionFactory
接口的的 openSession()
方
openSession(true)
:创建一个有自动提交功能的SqlSession
openSession(false)
:创建一个非自动提交功能的SqlSession
,需手动提交openSession()
:同openSession(false)
SqlSession 接口
SqlSession
接口对象用于执行持久化操作。一个 SqlSession
对应着一次数据库会话,一次会话以 SqlSession
对象的创建开始,以 SqlSession
对象的关闭结束。SqlSession
接口对象是线程不安全的,所以每次数据库会话结束前,需要马上调用其 close()
方法,将其关闭。再次需要会话,再次创建。 SqlSession
在方法内部创建,使用完毕后关闭。
2、工具类
获取 SqlSession
对象的代码还是有些冗余的,可以创建一个工具类,快速获取此对象。
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;
public class MyBatisUtil {
//定义 SqlSessionFactory
private static SqlSessionFactory factory = null;
static {
//使用 静态块 创建一次 SqlSessionFactory
try{
String config = "mybatis-config.xml";
//读取配置文件
InputStream in = Resources.getResourceAsStream(config);
//创建 SqlSessionFactory 对象
factory = new SqlSessionFactoryBuilder().build(in);
}catch (Exception e){
factory = null;
e.printStackTrace();
}
}
/* 获取 SqlSession 对象 */
public static SqlSession getSqlSession(){
SqlSession session = null;
if( factory != null){
// session = factory.openSession(true);
session = factory.openSession();
}
return session;
}
}
使用方式:
@Test
public void testUtils() throws IOException {
SqlSession session = MyBatisUtil.getSqlSession();
List<Student> studentList = session.selectList("com.bjpowernode.dao.StudentDao.selectStudents");
studentList.forEach( student -> System.out.println(student));
session.close();
}