由于我们每写一个操作语句都要新建SqlSessionFactory,大大增加了内存的消耗,长此以往,以后项目中的sql语句越来越多的时候,就会影响性能,且代码十分冗余,这就有悖于Mybatis的初衷,因此,进行第一次优化-------封装SqlSessionFactory,将他封装成一个工具类,想使用的时候直接调用
java
public class MybatisUtils {
static SqlSessionFactory build=null;
public static SqlSession createSqlSession(){
String resource = "mybatis-config.xml";
InputStream inputStream = null;
if (build==null){
SqlSession sqlSession = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
throw new RuntimeException(e);
}
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
build= sqlSessionFactoryBuilder.build(inputStream);
}
SqlSession sqlSession = build.openSession(true);
return sqlSession;
}
}
但是,这只是解决了代码的冗余并没有减少他的创建次数,依旧是有多少条语句就创建多少个sqlsession对象,还是很浪费资源,这时就可以联想到前面说过的static关键字以及单例模式,无论创建多少个对象,在底层依然还是同一个,现在进行第二次改进:
java
public class MybatisUtils {
static SqlSessionFactory sqlSessionFactory;
//静态代码块:给静态成员变量赋值,加载类执行,只执行一次
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
sqlSessionFactory = sqlSessionFactoryBuilder.build(inputStream);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
public static SqlSession createSqlSession() {
try {
SqlSession sqlSession = sqlSessionFactory.openSession(true);
return sqlSession;
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}