三大對象:
1、SqlSessionFactoryBuilder:負責構建SqlSessionFactory,並且提供了多個build()方法的重載
2、SqlSessionFactory:創建SqlSession實例的工廠
3、SqlSession:用於執行持久化操作的對象
三大對象獲取的步驟:
(1)每個MyBatis的應用程序都以一個SqlSessionFactory對象的實例為核心。
(2)首先獲取SqlSessionFactoryBuilder對象,可以根據XML配置文件的實例構建該對象。
(3)然后獲取SqlSessionFactory對象,該對象實例可以通過SqlSessionFactoryBuilder對象來獲得。
(4)有了SqlSessionFactory對象之后,通過SqlSessionFactory對象的openSession()方法就可以獲取SqlSession實例,SqlSession對象中完全包含以數據庫為背景的所有執行SQL操作的方法。
三大對象的聲明周期和作用域:
《1》SqlSessionFactoryBuilder的最大特點是:用過即丟。一旦創建了SqlSessionFactoryBuilder對象之后,這個類就不再需要存在了,因此SqlSessionFactoryBuilder的最佳范圍是存在方法體內,也就是局部變量而已。
《2》SqlSessionFactory對象一旦創建,就會在整個應用運行過程中始終存在,因此SqlSessionFactory的最佳作用域是Application(單例模式)。
《3》SqlSession對應着一次數據庫回話。在每次訪問數據庫時都需要創建它,每個線程都有自己的SqlSession實例,SqlSession實例不能被共享,也不是線程安全的。因此最佳的作用域范圍是request作用域或者方法體作用域內。
package com.ssm.utils; 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; /** * MyBatis的核心接口和類 * @author Administrator * */ public class MyBatisUtil { private static SqlSessionFactory factory; /* * 在靜態代碼塊下,factory只會被創建一次 */ static{ try { String resource="mybatis-config.xml"; InputStream is=Resources.getResourceAsStream(resource); factory=new SqlSessionFactoryBuilder().build(is); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 創建SqlSession對象 * @return */ public static SqlSession createSession(){ return factory.openSession(false);//true為自動提交事務,true為默認值 } /** * 關閉SqlSession對象 * @param session */ public static void closeSession(SqlSession session){ if (session!=null) { session.close(); } } }
package com.ssm.test; import java.util.List; import org.apache.ibatis.session.SqlSession; import com.ssm.entity.Address; import com.ssm.entity.User; import com.ssm.mapper.UserMapper; import com.ssm.utils.MyBatisUtil; public class TestUser { public static void main(String[] args) { SqlSession session=null; List<User> userList; /** * 查詢所有user的集合 */ try { session=MyBatisUtil.createSession(); userList = session.getMapper(UserMapper.class).getUserList(); for (User user : userList) { System.out.println("userid:"+user.getId()+"\tuserName:"+user.getUserName()); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ MyBatisUtil.closeSession(session); } } }
