在使用Mybatis进行数据库操作时,虽然省略了JDBC的繁琐操作,但出现了创建SqlSession的冗余
class PersonServiceImpl implements PersonService{
@Override
public List<Person> queryAllPerson(){
InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSesionFactory factory = builder.build(is);
SqlSession sqlSession = factory.openSession();
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
List<Person> list = mapper.queryAllPersion();
sqlSession.close();
return list;
}
@Override
public Person queryPersonByID(int id){
InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSesionFactory factory = builder.build(is);
SqlSession sqlSession = factory.openSession();
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
List<Person> list = mapper.queryAllPersion();
sqlSession.close();
return list;
}
}
第一次类内提取
class PersonServiceImpl implements PersonService{
private static SqlSesionFactory factory;
static{
try{
InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(is);
}catch(IOException e){
e.printStackTrace();
}
}
@Override
public List<Person> queryAllPerson(){
SqlSession sqlSession = factory.openSession();
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
List<Person> list = mapper.queryAllPersion();
sqlSession.close();
return list;
}
@Override
public Person queryPersonByID(int id){
SqlSession sqlSession = factory.openSession();
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
List<Person> list = mapper.queryAllPersion();
sqlSession.close();
return list;
}
}
类内的提取可以解决类内部冗余,但不能解决不同实现类的冗余
第二次直接封装一个工具类
class MybatisUtil{
private static SqlSesionFactory factory;
static{
try{
InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(is);
}catch(IOException e){
e.printStackTrace();
}
}
//获取
public static SqlSession getSqlSession(){
return factory.opeanSession();
}
}
class PersonServiceImpl implements PersonService{
@Override
public List<Person> queryAllPerson(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
List<Person> list = mapper.queryAllPersion();
sqlSession.close();
return list;
}
@Override
public Person queryPersonByID(int id){
SqlSession sqlSession = MybatisUtil.getSqlSession();
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
List<Person> list = mapper.queryAllPersion();
sqlSession.close();
return list;
}
}
这时候我注意到还是有SqlSession的重复与mapper的重复,于是我想能不能直接从工具类中获取mapper
class MybatisUtil{
private static SqlSesionFactory factory;
private static SqlSession sqlSession;
static{
try{
InputStream is=Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(is);
}catch(IOException e){
e.printStackTrace();
}
}
//获取
public static<E> E getMapper(Class<E> e){
sqlSession = factory.opeanSession();
return sqlSession.getMapper(e);;
}
//关闭
public static void closeSqlSession(){
sqlSeesion.close();
}
}
class PersonServiceImpl implements PersonService{
private final PersonMapper mapper = MybatisUtil.getMapper(PersonMapper.class);
@Override
public List<Person> queryAllPerson(){
List<Person> list = mapper.queryAllPersion();
MybatisUtil.closeSqlSession();
return list;
}
@Override
public Person queryPersonByID(int id){
List<Person> list = mapper.queryAllPersion();
MybatisUtil.closeSqlSession();
return list;
}
}
这里运行便会报出Executor was closed异常信息
这里的问题在于,第一次使用了SqlSession之后,就关闭了SqlSession,而下一次执行的时候,并没有重新获取SqlSession,导致mapper无法执行