0、测试代码如下,
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactoryBuilder build = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = build.build(in);
SQLSession session = factory.openSession();
IUserDao mapper = session.getMapper(IUserDao.class);
List<User> users = mapper.findAll();
for(User user : users){
System.out.println(user);
}
1、加载配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
1、查看Resource类中的getResourceAsStream方法
public static InputStream getResourceAsStream(String resource) throws IOException {
return getResourceAsStream((ClassLoader)null, resource);
}
public static InputStream getResourceAsStream(ClassLoader loader, String resource) throws IOException {
InputStream in = classLoaderWrapper.getResourceAsStream(resource, loader);
if (in == null) {
throw new IOException("Could not find resource " + resource);
} else {
return in;
}
}
2、 getResourceAsStream通过内加载器得到配置文件的输入流
2、获取SqlSessionFactoryBuilder类对象build
3、使用build的build()方法建立SqlSessionFactory
3.1 build的四个重载方法如下所示
public SqlSessionFactory build(InputStream inputStream) {
return this.build((InputStream)inputStream, (String)null, (Properties)null);
}
public SqlSessionFactory build(InputStream inputStream, String environment) {
return this.build((InputStream)inputStream, environment, (Properties)null);
}
public SqlSessionFactory build(InputStream inputStream, Properties properties) {
return this.build((InputStream)inputStream, (String)null, properties);
}
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
SqlSessionFactory var5;
try {
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
var5 = this.build(parser.parse());
} catch (Exception var14) {
throw ExceptionFactory.wrapException("Error building SqlSession.", var14);
} finally {
ErrorContext.instance().reset();
try {
inputStream.close();
} catch (IOException var13) {
}
}
return var5;
}
3.1.1 声明SqlSessionFactory 对象
SqlSessionFactory var5;
3.1.2 build()方法内部创建XMLConfigBuilder对象
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
var5 = this.build(parser.parse());
mapper = session.getMapper(IUserDao.class);
运用debug断点调试
this = {MybatisTest@1567}
build = {SqlSessionFactoryBuilder@1569}
factory = {DefaultSqlSessionFactory@1570}
session = {DefaultSqlSession@1571}
mapper = null
1、可以看到这里的SqlSession对象是实现了SqlSession接口的DefaultSqlSession类的对象
session = {DefaultSqlSession@1571}
2、进入DefaultSQLSession类找到getMapper()方法,getMapper方法内部调用Configuration内的
getMapper()方法。
public <T> T getMapper(Class<T> type) {
return this.configuration.getMapper(type, this);
}
getMapper断点调试内容如下:
this.configuration = {Configuration@1572}
this = {DefaultSqlSession@1571}
type = {Class@1548} "interface com.itheima.dao.IUserDao"
this.configuration = {Configuration@1572}
3、进入Configuration类内部找到getMapper()方法
public MapperRegistry getMapperRegistry() {
return this.mapperRegistry;
}
找到mapperRegistry对象,是一个MapperRegistry类型
protected final MapperRegistry mapperRegistry;
2、