咱们都知道MyBatis的持久化操做离不开SqlSessionFactory对象,这个对象是整个数据库映射关系通过编译后的内存镜像,该对象的openSession()方法能够打开SqlSession对象.该对象由由SqlSessionFactoryBuilder加载MyBatis的配置文件产生.
先贴一张MyBatis初始化的基本过程,以下图:sql
上图所示,MyBatis初始化要通过如下几步:数据库
SqlSessionFactoryBuilder
对象的build(inputStream)方法;SqlSessionFactoryBuilder
会根据输入流inputStream等信息建立XMLConfigBuilder
对象;SqlSessionFactoryBuilder
调用XMLConfigBuilder
对象的parse()方法;XMLConfiguBuilde
r对象解析XML配置文件返回Configuration
对象;SqlSessionFactoryBuilder
根据Configuration
对象建立一个DefaultSessionFactory
对象;SqlSessionFactoryBuilder
返回DefaultSessionFactory
对象给客户端,供客户端调用;因而可知,SqlSessionFactory是根据MyBatis的配置文件mybatis-config.xml
建立的,接下来咱们就来重点研究下MyBatis配置文件中经常使用属性的意义.服务器
MyBatis的配置文件包含了影响MyBatis行为的信息,文档的结构以下:
顶层configuration配置mybatis
environments 环境并发
environment 环境变量oracle
这些属性都是可外部配置且可动态替换的,既能够在典型的Java属性文件中配置,亦可经过properties元素的子元素来传递.
能够再CLASSPATH中增长一个db.properties的Java属性文件.app
driver=oracle.jdbc.driver.OracleDriver ur=jdbc:oracle:thin:@127.0.0.1:1526:mybatis username=root password=root
在配置文件中配置<properties.../>属性:
<properties resource="db.properties"/>
其中的属性就能够在整个配置文件中使用来替换须要动态配置的属性值.dom
<dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource>
一个配置完成的settings元素示例以下,具体含义这里再也不列举,能够自行google.ide
类型别名是为Java类型设置的一个短的名字.它只和XML配置有关,存在的意义仅在于用来减小类彻底限定名的冗余.性能
<typeAliases> <typeAlias alias="user" type="org.ccgogoing.domian.User"/> </typeAliases>
当这样配置时,user能够用在任何使用org.ccgogoing.domain.User的地方.
也能够指定一个包名,MyBatis会在包名下面搜索须要的Java Bean
<typeAliases> <package name="org.ccgogoing.domian"/> </typeAliases>
每个在包org.ccgogoing.domain中的Java Bean,在没有注解的状况下,会使用Bean的首字母小写的非限定类名来做为它的别名.好比org.ccgogoing.domain.User
的别名为user,如有注解,则别名为其注解值.
@Alias("user") public class User { ... }
不管是MyBatis在预处理语句(preparedStatement)中设置一个参数时,仍是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成Java类型,下图描述了一些默认的类型处理器.
MyBatis每次建立结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成.默认的对象工厂须要作的仅仅是实例化目标类,要么经过默认构造方法,要买在参数映射存在的时候经过参数构造方法来实例化.若是想覆盖对象工厂的默认行为,则能够经过建立本身的对象工厂来实现.
MyBatis的环境配置实际就是数据源的配置.MyBatis能够配置多种环境,这种机制使得MyBatis能够将SQL映射应用于多种数据库中.例如,开发,测试盒生产环境须要不一样的配置;多个生产数据库想使用相同的sql映射,等等.
尽管能够配置多个环境,可是每一个SqlSessionFactory实例只能选择一个环境,即每一个数据库对应一个SqlSessionFactory实例.因此若是你想链接两个数据库,就须要建立两个SqlSessionFactory实例,每一个数据库对应一个.
环境配置示例以下:
<environments default="development"> <environment id="development"> <!--指定事务管理类型,type="JDBC"指直接简单使用了JDBC的提交和回滚事务--> <transactionManager type="JDBC"></transactionManager> <!-- dateSource指定数据源配置,POOLED是jdbc链接对象的数据源链接池的实现--> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments>
默认的环境ID(default="development");
每一个environment元素定义的环境ID(好比,id="development").
环境ID能够随意命名,建议简洁有意义,而默认环境必定要匹配定义的其中一个环境ID.
<transactionManager.../>表示事务管理配置,在MyBatis中有JDBC和MANAGED两中类型的事务管理器:
<transactionManager type="MANAGED"> <property name="closeConnection" value="false"/> </transactionManager>
提示: 若是开发使用Spring+MyBatis,则没有必要配置事务管理器,由于Spring模块会使用自带的管理器来覆盖前面的配置.
<dataSource.../>表示数据源配置,在MyBatis中有UNPOOLED、POOLED和JNDI三种数据源类型:
UNPOOLED类型的数据源仅仅须要配置一下5种属性:
drive、url、username、password、defaultTransactionIsolationLevel。默认的链接事务隔离级别。
POOLED:这种数据源的实现利用“池”的概念将JDBC链接对想组织起来,避免了建立新的链接实例时所必需的初始化时间和认证时间。这是一种使得并发Web应用快速响应请求的流行处理方式,除了上述提到的UNPOOLED的5中属性外,还可使用更多的属性来配置POOLED的数据源:
MyBatis须要开发者本身写sql语句,mapper映射器正是告诉MyBatis到哪里去找映射文件,进而找到这些sql语句.实际开发中可使用相对于类路径的资源引用或彻底限定资源定位符(包括file:///的URL),以及类名和包名等,例如:
<!-- 使用类路径查找资源文件 --> <mappers> <mapper resource="com/ccgogoing/fileupload/mapper/sqlmap-mapping-user.xml"/> </mappers> <!-- 使用本地文件 --> <mappers> <mapper url="file:///C:/mapper/UserMapper.xml"> </mappers> <!-- 使用接口类 --> <mappers> <mapper class="org.ccgogoing.mapper.UserMapper" </mappers> <!-- 使用包名 --> <mappers> <package name="org.ccgogoing.mapper"/> </mappers>
mapper映射器会告诉MyBatis去哪里找映射文件,剩下的细节就是每一个SQL映射文件了,我会在接下来的文章中详细说明这部分知识.