MybatisUtil工具factory空指针异常

mybatis工具类:

package com.henau.util;

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

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 {
public static SqlSessionFactory factory;//确保只有一个factory产生
private static ThreadLocal< SqlSession > tl=new ThreadLocal<>();//线程容器,给线程绑定一个object对象,只要线程不变可以随时取出,线程改变无法取出.
static {
try {
InputStream is = Resources.getResourceAsStream(“mybatis.xml”);
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
System.out.println(factory);
} catch (IOException e) {
e.printStackTrace();
}

}

/如果tl中国存在sql对象,那就返回session对象,如果没有通过factory创建一个/
public static SqlSession getSession() {
SqlSession session=tl.get();
System.out.println(session);
if(session==null) {
session=factory.openSession();
tl.set(session);
}
return tl.get();
}

/*保证一个线程中用的sqlsession为同一个对象
* 因此,利用过滤器对session中对象进行统一设置前一部分和后一部分的时候
* filter中的session (需要在filter中进行关闭)和service中的session为统一sessiion
* 保证了两个对象的同步。
* */
public static void closeSession() {
SqlSession session=tl.get();
if(session!=null)
session.close();
tl.set(null);
}

}

所报异常:

MybatisUtil工具factory空指针异常_第1张图片
原因:由于我定义完全局变量factory之后,又在static中定义了factory导致getsession中的sqlsession对象为空。
只需要将static对象中的factory类名去掉就行。
由此可以发现一个有意思的事,定义过全局变量之后,再局部代码块中还可以定义同名的变量。两者不同。

你可能感兴趣的:(报错,mybatis工具,空指针异常,factory,局部代码块变量)