抽取MyBatisUtil工具类
以前的测试代码
//Get one
@Test
public void testGet() throws Exception{
//1. 从classpath路径去加载全局配置文件: mybatis-config.xml
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2. 创建SqlSessionFactory, 类似DataSource
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3. 创建SqlSession, 类似Connection
SqlSession session = factory.openSession();
//4. 具体操作
User user = session.selectOne("com.gx.mybatis.hello.UserMapper.get", 1l);
System.out.println(user);
//5. 关闭SqlSession
session.close();
}
//Get all
@Test
public void testGetAll() throws Exception{
//1. 从classpath路径去加载全局配置文件: mybatis-config.xml
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2. 创建SqlSessionFactory, 类似DataSource
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3. 创建SqlSession, 类似Connection
SqlSession session = factory.openSession();
//4. 具体操作
List<User> users = session.selectList("com.gx.mybatis.hello.UserMapper.getAll");
for (User u : users) {
System.out.println(u);
}
//5. 关闭SqlSession
session.close();
}
抽取MyBatisUtil
上述代码存在重复(几乎只有具体操作步骤不同), 把创建session
的代码抽取出来
public class MyBatisUtil {
private static SqlSessionFactory factory = null;
static{
try {
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
factory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
public static SqlSession getSqlSession(){
return factory.openSession();
}
}
注意:
因为SqlSessionFactory
是线程安全的, 所以只需要创建一份即可(类比DataSource
)
而SqlSession
线程不安全, 所以需要创建多份(类比Connection
)
重构后的代码
//Get one
@Test
public void testGet() throws Exception{
SqlSession session = MyBatisUtil.getSqlSession();
User user = session.selectOne("com.gx.mybatis.hello.UserMapper.get", 1l);
System.out.println(user);
session.close();
}
//Get all
@Test
public void testGetAll() throws Exception{
SqlSession session = MyBatisUtil.getSqlSession();
List<User> users = session.selectList("com.gx.mybatis.hello.UserMapper.getAll");
for (User u : users) {
System.out.println(u);
}
session.close();
}