1.配置文件载入
1.org.apache.ibatis.io.Resources 将文件读入进来,转成输入字节流
2.SqlSessionFactoryBuilder的build方法,解析配置文件,然后构建SqlSessionFactory
1、将输入字节流转换成Document对象,并赋值给XPathParser解析器对象属性document
2、由 XPathParser解析器对象、environment, Properties对象构建XMLConfigBuilder,在此Configuration对象初始化。
3、解析器解析出来配置文件根节点root,即<configuration>,转换成XNode,执行的方法是parser.evalNode("/configuration")
4、根据根节点root,解析其他节点
private void parseConfiguration(XNode root) {
try {
// settings解析成Properties
Properties settings = settingsAsPropertiess(root.evalNode("settings"));
// properties元素解析
propertiesElement(root.evalNode("properties"));
loadCustomVfs(settings);
// typeAliases元素解析
typeAliasesElement(root.evalNode("typeAliases"));
// plugins元素解析
pluginElement(root.evalNode("plugins"));
// objectFactory元素解析
objectFactoryElement(root.evalNode("objectFactory"));
objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
reflectorFactoryElement(root.evalNode("reflectorFactory"));
// settings元素解析
settingsElement(settings);
// read it after objectFactory and objectWrapperFactory issue #631
// environments元素解析
environmentsElement(root.evalNode("environments"));
// databaseIdProvider元素解析
databaseIdProviderElement(root.evalNode("databaseIdProvider"));
// typeHandlers元素解析
typeHandlerElement(root.evalNode("typeHandlers"));
// mappers元素解析
mapperElement(root.evalNode("mappers"));
} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}
}
2.属性文件载入
如果属性在不只一个地方进行了配置,那么 MyBatis 将按照下面的顺序来加载:
在 properties 元素体内指定的属性首先被读取。
然后根据 properties 元素中的 resource 属性读取类路径下属性文件或根据 url 属性指定的路径读取属性文件,并覆盖已读取的同名属性。
例如:
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="dev_user"/>
<property name="password" value="F2Fa3!33TYyg"/>
</properties>
最后读取作为方法参数传递的属性,并覆盖已读取的同名属性。
因此,通过方法参数传递的属性具最高优先级,resource/url 属性中指定的配置文件次之,最低优先级的是 properties 属性中指定的属性。
String resource = "com/gupaoedu/lsj/mybatis/mybatis-config.xml";
Properties properties = new Properties();
properties.load(App.class.getClassLoader().getResourceAsStream("com/gupaoedu/lsj/mybatis/db.properties"));
InputStream inputStream = Resources.getResourceAsStream(resource);
// 第二个参数传入属性文件
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,properties);
4.创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
5.SqlSession数据库操作
根据mapper的namespace+操作方法,转化jdbc的sql执行
User user = (User)sqlSession.selectOne("com.gupaoedu.lsj.mybatis.mapper.UserMapper.selectUser",1);