每次读取Mybatis核心配置文件来创建SqlSessionFactory的时候都需要重复写这三行代码, 这样造成了代码冗余.

不过这还不是最重要的一点:
SqlSessionFactory自带了数据库连接池, 如果每次访问都创建一个SqlSessionFactory对象很容易造成资源浪费

所以利用 静态代码块 会在类被加载的时候自动执行, 且只会执行一次的特点抽取一个工具类

package com.itheima.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class SqlSessionFactoryUtils {

    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

//返回一个sqlsessionfactory
    public static SqlSessionFactory getSqlSessionFactory() throws IOException {
        return sqlSessionFactory;
    }

}

private static SqlSessionFactory sqlSessionFactory;

变量设置为static确保不会再创建新的工厂类

因为所有类的实例共享同一个静态成员,不同实例对静态成员的访问是相同的