(二) mybatis 源码之 SqlSessionFactory

从 mybatis 的官网,写最简单的 “ HelloWorld ”


Reader reader = Resources.getResourceAsReader("conf.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
StudentDao mapper = session.getMapper(StudentDao.class);
System.err.println(mapper.listStudent());

首先解析全局配置文件, 转换成一个 Reader 对象, 这个是 JDK 的代码,直接看第二行, 创建了一个 SqlSessionFactory 对象

SqlSesseionFactory

使用了 建造者模式,, 最后调用的是 build 方法,创建了一个 SqlSessionFactory 对象

public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
   
    try {
   
        // 将全局配置文件转换成一个 Document 对象放入 XPathParser 对象中
        // 而 XPathParser 对象保存在此 XMLConfiguration 对象中
        // 这个 Document 对象类似于 “树” 结构
        XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
        // 开始解析这个 Document 对象, 保存为一个 Configuration 对象中
        // 创建默认的 SqlSessionFactory 对象, DefaultSqlSessionFactory
        return build(parser.parse());
    }
   ....
}

解析全局配置文件

// 由 XMLConfigBuilder 对象解析

public Configuration parse() {
   
    if (parsed) {
   
        throw new BuilderException("Each XMLConfigBuilder can only be used once.");
    }
    // 解析完毕后设置一个标志位, 只能解析配置文件一次
    parsed = true;
    // 解析配置文件中的 <configuration> 标签, 保存到 XNode 对象中
    // 然后处理这个 XNode 对象
    parseConfiguration(parser.evalNode("/configuration"));
    return configuration;
}

解析 <configuration> 下的所有子标签

// 挨个解析所有子标签, 可以看到, 严格按照顺序依次执行
private void parseConfiguration(XNode root) {
   
    try {
   
        propertiesElement(root.evalNode("properties"));
        // 将 <setting> 标签的元素保存为 properties 对象
        Properties settings = settingsAsProperties(root.evalNode("settings"));
        loadCustomVfs(settings);
        // 日志
        loadCustomLogImpl(settings);
        typeAliasesElement(root.evalNode("typeAliases"));
        pluginElement(root.evalNode("plugins"));
        objectFactoryElement(root.evalNode("objectFactory"));
        objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
        reflectorFactoryElement(root.evalNode("reflectorFactory"));
        settingsElement(settings);
        // 解析并创建数据源
        environmentsElement(root.evalNode
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值