Mybatis原理学习

已转移
mybatis初始化做了什么
configuration 配置

  • properties 属性
  • settings 设置
  • typeAliases 类型别名
  • typeHandlers 类型处理器
  • objectFactory 对象工厂
  • plugins 插件
  • environments 环境
  • environment 环境变量
  • transactionManager 事务管理器
  • dataSource 数据源
  • mappers 映射器

实战中是web.xml中包含database-beans.xml

 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driverClassName}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="initialPoolSize" value="${pool.initialPoolSize}"/>
        <property name="minPoolSize" value="${pool.minPoolSize}"/>
        <property name="maxPoolSize" value="${pool.maxPoolSize}"/>
        <property name="maxIdleTime" value="${pool.maxIdleTime}"/>
        <property name="acquireIncrement" value="${pool.acquireIncrement}"/>
        <property name="maxStatements" value="0"/>
      <!--  <property name="testConnectionOnCheckout" value="${pool.testConnectionOnCheckout}"/>
        <property name="testConnectionOnCheckin" value="${pool.testConnectionOnCheckin}"/>
        <property name="checkoutTimeout" value="${pool.checkoutTimeout}"/>
        <property name="automaticTestTable" value="${pool.automaticTestTable}"/>
        <property name="acquireRetryAttempts" value="30"/>
        <property name="idleConnectionTestPeriod" value="60"/>-->
    </bean>
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:sql_map_config_kylindb_i.xml"></property>
    </bean>

    <mybatis:scan base-package="com.**.dao"/>

    <!-- 配置事务管理器 -->
    <bean id="txManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 事务控制   -->
    <tx:annotation-driven transaction-manager="txManager"/>

接下来是classpath:sql_map_config.xml文件:

    settings可以有很多配置他们都被Configuration包围
    <settings>
        <setting name="defaultScriptingLanguage" value="customLanguage"/>
    </settings>
    <typeAliases>
        <typeAlias type="com.sankuai.pomelo.kylin.extend.mybatis.CustomXMLLanguageDriver" alias="customLanguage"/>
    </typeAliases>
    <mappers>
      dao层的
    </mappers>

总的来说就是创建创建 Configuration对象的过程.

mybatis初始化 –>创建SqlSession –>执行SQL语句

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"); 

sqlsessionbnulider->sqlsessionfactory->sqlsession作用域和生命周期
  

  • SqlSessionFactoryBuilder 这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。方法作用域.
  • SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,应用作用域。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。
  • 每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。

mybatis缓存


这里写图片描述
一级缓存是sqlsession域的,线程补共享,而二级缓存是将3个sqlsession缓存留下以供线程共享.
举例:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_25931839/article/details/79274702