1.0 MyBatis 对象分析
(1) Resources 类
Resources 类,顾名思义就是资源,用于读取资源文件。其有很多方法通过加载并解析资源文件,返回不同类型的 IO 流对象。
(2) SqlSessionFactoryBuilder 类
SqlSessionFactory 的 创 建 , 需 要 使 用 SqlSessionFactoryBuilder 对 象 的 build() 方 法 。 由 于SqlSessionFactoryBuilder 对象在创建完工厂对象后,就完成了其历史使命,即可被销毁。所以,一般会将该 SqlSessionFactoryBuilder 对象创建为一个方法内的局部对象,方法结束,对象销毁。
(3) SqlSessionFactory 接口
SqlSessionFactory 接口对象是一个重量级对象(系统开销大的对象),是线程安全的,所以一个应用只需要一个该对象即可。创建 SqlSession 需要使用 SqlSessionFactory 接口的的 openSession()方法。
➢ openSession(true):创建一个有自动提交功能的 SqlSession
➢ openSession(false):创建一个非自动提交功能的 SqlSession,需手动提交
➢ openSession():同 openSession(false)
(4) SqlSession 接口
SqlSession 接口对象用于执行持久化操作。一个 SqlSession 对应着一次数据库会话,一次会话以SqlSession 对象的创建开始,以 SqlSession 对象的关闭结束。
SqlSession 接口定义了操作数据的方法 例如 selectOne() ,selectList() ,insert(),update(), delete(), commit(), rollback()
SqlSession 接口对象是线程不安全的,所以每次数据库会话结束前,需要马上调用其 close()方法,将其关闭。再次需要会话,再次创建。 SqlSession 在方法内部创建,使用完毕后关闭。
1.1创建工具类,简化代码
(1) 创建 MyBatisUtils 类
在zep文件夹下新建utils文件夹,并在utils文件夹下创建MyBatisUtils 工具类
package com.zep.utils;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 MybatisUtils {private static SqlSessionFactory factory = null;/*静态代码块:执行优先级高于非静态的初始化块,它会在类初始化的时候执行一次,执行完成便销毁*///使用 静态块 创建一次 SqlSessionFactorystatic {String config = "mybatis.xml"; //需要和你的项目中的文件名一样try {//读取配置文件InputStream in = Resources.getResourceAsStream(config);//创建SqlSessionFactory对象,使用SqlSessionFactoryBuilderfactory = new SqlSessionFactoryBuilder().build(in);} catch (IOException e) {e.printStackTrace();}}// 获取SqlSession对象的方法public static SqlSession getSqlSession() {SqlSession sqlSession = null;if (factory != null) {sqlSession = factory.openSession(); // 非自动提交事务}return sqlSession;}
}
(2) 使用 MyBatisUtil 类
通过MybatisUtils.getSqlSession()直接获取sqlSession对象
SqlSession sqlSession = MybatisUtils.getSqlSession()
package com.zep;import com.zep.domain.Student;
import com.zep.utils.MybatisUtils;
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;
import java.util.List;public class MyApp2 {public static void main(String[] args) throws IOException {// 5.【重要】获取SqlSession对象,从SqlSessionFactory中获取SqlSessionSqlSession sqlSession = MybatisUtils.getSqlSession();// 6.【重要】指定要执行的sql语句的标识。sql映射文件中的namespace + “.” + 标签的id值String sqlId = "com.zep.dao.StudentDao"+ "." +"selectStudents";// 7.执行sql语句,通过sqlId找到语句List<Student> studentList = sqlSession.selectList(sqlId);// 8.输出结果// studentList.forEach(student -> System.out.println(student));for (Student student : studentList) {System.out.println("查询到的学生=" + student);}// 9.关闭SqlSession对象sqlSession.close();}
}
运行结果如下: