Mybatis核心类生命周期和管理

Mybatis的核心类及生命周期:

1、SqlSessionFactoryBuilding

这个类可以被实例化、使用和丢弃。一但创建了SqlSessionFactory后,这个类就不需要存在 了,因此sqlsessionfactorybuilder 实例的最佳作用域是方法范围(即作为方法的变量)

2、SqlSessionFactory

SqlSessionFactory,顾名思义就是获取SqlSession对象的工厂,功能类似于jdbc中加载数据库驱动。所以sqlsessionfactory对象一但被创建,应该在应用执行期间都存在,因此sqlsessionfactory的最佳作用域是应用范围,建议定义为静态变量。

3、sqlsession

sqlsession类似于jdbc的connection对象,每个线程都因该有自己的sqlsession 实例。sqlsesion的实例,sqlsession的实例不能共享,他是 线程不安全的,因此最佳作用域是请求或方法范围,sqlsession对象能够执行数据库的增删改查操作,因此在使用后应该关闭,并保存使用finally快来关闭。

Mybatis管理:

package util; import java.io.IOException; import java.io.Reader; 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 MyBatisUtil(){} private static final String RESOURCE="config.xml"; private static SqlSessionFactory sqlSessionFactory=null; private static ThreadLocal<SqlSession> threadlocal=new ThreadLocal<SqlSession>(); static { Reader reader=null; try { reader=Resources.getResourceAsReader(RESOURCE);//读取映射文件 SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder(); sqlSessionFactory=builder.build(reader); } catch (IOException e) { // TODO Auto-generated catch block throw new ExceptionInInitializerError("初始化MyBatis错误"); } } public static SqlSessionFactory getSqlSessionFactory(){ return sqlSessionFactory; } public static SqlSession getSession(){ SqlSession session=threadlocal.get();

//如果session为null,则打开一个新的session

if (session==null){ session=(sqlSessionFactory!=null)? sqlSessionFactory.openSession():null; threadlocal.set(session); } return session; } public static void closeSession(){ SqlSession session=(SqlSession)threadlocal.get(); threadlocal.set(null); if (session!=null){ session.close(); } } }

经验分享 程序员 微信小程序 职场和发展