已转移
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缓存留下以供线程共享.
举例: