设为首页 加入收藏

TOP

MyBatis 架构与原理深入解析,面试随便问!(十)
2023-09-09 10:25:39 】 浏览:142
Tags:MyBatis 解析
ronment.Builder environmentBuilder = new Environment.Builder(id) .transactionFactory(txFactory) .dataSource(dataSource); //4. 将创建的Envronment对象设置到configuration 对象中 configuration.setEnvironment(environmentBuilder.build()); } } } }
private boolean isSpecifiedEnvironment(String id)  
{  
      if (environment == null)  
      {  
           throw new BuilderException("No environment specified.");  
      }  
      else if (id == null)  
      {  
           throw new BuilderException("Environment requires an id attribute.");  
      }  
      else if (environment.equals(id))  
      {  
          return true;  
      }  
      return false;  
 }  
  • (4)返回Configuration对象:

    将上述的MyBatis初始化基本过程的序列图细化:

    基于XML配置创建Configuration对象的过程

  • 7.3 基于Java API手动加载XML配置文件创建Configuration对象,并使用SqlSessionFactory对象##

    我们可以使用XMLConfigBuilder手动解析XML配置文件来创建Configuration对象,代码如下:

    String resource = "mybatis-config.xml";  
    InputStream inputStream = Resources.getResourceAsStream(resource);  
    // 手动创建XMLConfigBuilder,并解析创建Configuration对象  
    XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, null,null);  
    Configuration configuration=parse();  
    // 使用Configuration对象创建SqlSessionFactory  
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);  
    // 使用MyBatis  
    SqlSession sqlSession = sqlSessionFactory.openSession();  
    List list = sqlSession.selectList("com.foo.bean.BlogMapper.queryAllBlogInfo");  
    

    7.4 涉及到的设计模式##

    初始化的过程涉及到创建各种对象,所以会使用一些创建型的设计模式。在初始化的过程中,Builder模式运用的比较多

    7.4.1 Builder模式应用1: SqlSessionFactory的创建###

    对于创建SqlSessionFactory时,会根据情况提供不同的参数,其参数组合可以有以下几种

    根据情况提供不同的参数,创建SqlSessionFactory

    由于构造时参数不定,可以为其创建一个构造器Builder,将SqlSessionFactory的构建过程和表示分开

    MyBatis将SqlSessionFactoryBuilder和SqlSessionFactory相互独立

    7.4.2 Builder模式应用2: 数据库连接环境Environment对象的创建###

    在构建Configuration对象的过程中,XMLConfigBuilder解析 mybatis XML配置文件节点 节点时,会有以下相应的代码:

    private void environmentsElement(XNode context) throws Exception {  
        if (context != null) {  
            if (environment == null) {  
                environment = context.getStringAttribute("default");  
            }  
            for (XNode child : context.getChildren()) {  
                String id = child.getStringAttribute("id");  
                //是和默认的环境相同时,解析之  
                if (isSpecifiedEnvironment(id)) {  
                    TransactionFactory txFactory = transactionManagerElement(child.eva lNode("transactionManager"));  
                    DataSourceFactory dsFactory = dataSourceElement(child.eva lNode("dataSource"));  
                    DataSource dataSource = dsFactory.getDataSource();  
      
                    //使用了Environment内置的构造器Builder,传递id 事务工厂和数据源  
                    Environment.Builder environmentBuilder = new Environment.Builder(id)  
                    .transactionFactory(txFactory)  
                    .dataSource(dataSource);  
                    configuration.setEnvironment(environmentBuilder.build());  
                }  
            }  
        }  
    }  
    

    在Environment内部,定义了静态内部Builder类:

    public final class Environment {  
        private final String id;  
        private final TransactionFactory transactionFactory;  
        private final DataSource dataSource;  
      
        public Environment(String id, TransactionFactory transactionFactory, DataSource dataSource) {  
            if (id == null) {  
                throw new IllegalArgumentException("Parameter 'id' must not be null");  
            }  
            if (transactionFactory == null) {  
                throw new IllegalArgumentException("Parameter 'transactionFactory' must not be null");  
            }  
            this.id = id;  
            if (dataSource == null) {  
                throw new IllegalArgumentException("
    首页 上一页 7 8 9 10 下一页 尾页 10/10/10
    】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
    上一篇Induction of Design Pattern 下一篇13分钟聊聊并发包中常用同步组件..

    最新文章

    热门文章

    Hot 文章

    Python

    C 语言

    C++基础

    大数据基础

    linux编程基础

    C/C++面试题目