Mybatis 学习之API

几个重要的类

SqlSession

取映射器和管理事务, 所有执行语句的方法,提交或回滚事务,还有获取映射器实例。
SqlSession对象的主要功能是完成一次数据库的访问和结果的映射。由于不是线程安全的,所以SqlSession对象的作用域需限制方法内。SqlSession的默认实现类是DefaultSqlSession,它有两个必须配置的属性:Configuration和Executor。
SqlSession有一个重要的方法getMapper,顾名思义,这个方式是用来获取Mapper对象的。什么是Mapper对象?根据Mybatis的官方手册,应用程序除了要初始并启动Mybatis之外,还需要定义一些接口,接口里定义访问数据库的方法,存放接口的包路径下需要放置同名的XML配置文件。SqlSession的getMapper方法是联系应用程序和Mybatis纽带,应用程序访问getMapper时,Mybatis会根据传入的接口类型和对应的XML配置文件生成一个代理对象,这个代理对象就叫Mapper对象。应用程序获得Mapper对象后,就应该通过这个Mapper对象来访问Mybatis的SqlSession对象,这样就达到里插入到Mybatis流程的目的。
Executor对象在创建Configuration对象的时候创建,并且缓存在Configuration对象里。Executor对象的主要功能是调用StatementHandler访问数据库,并将查询结果存入缓存中(如果配置了缓存的话)。StatementHandler是真正访问数据库的地方,并调用ResultSetHandler处理查询结果。

创建sqlsession经过了以下几个主要步骤:

1) 从配置中获取Environment;

2) 从Environment中取得DataSource;

3) 从Environment中取得TransactionFactory;

4) 从DataSource里获取数据库连接对象Connection;

5) 在取得的数据库连接上创建事务对象Transaction;

6) 创建Executor对象(该对象非常重要,事实上sqlsession的所有操作都是通过它完成的);

7) 创建sqlsession对象。
实际上,Sqlsession对数据库的操作都是通过Executor来完成的。

SqlSessionFactory

获取 一个 SqlSession 实例。
有很多的相关方法创建SqlSession.
SqlSessionFactory对象一个必要的属性是Configuration对象,它是保存Mybatis全局配置的一个配置对象,通常由SqlSessionFactoryBuilder从XML配置文件创建。

SqlSessionFactoryBuilder

SqlSessionFactory 本 身 是 由 SqlSessionFactoryBuilder 创建的,它可以从 XML 配置,注解或手动配置 Java 来创建 SqlSessionFactory没有必要每次访问Mybatis就创建一次SqlSessionFactoryBuilder,通常的做法是创建一个全局的对象就可以了。
如下是创建SqlSessionFactory的方法:

SqlSessionFactory build(InputStream inputStream, String env, Properties props)
SqlSessionFactory build(Configuration config)

如果一个属性存在于这些位置,那么 MyBatis 将会按找下面的顺序来加载它们:

在 properties 元素体中指定的属性首先被读取,
从 properties 元素的类路径 resource 或 url 指定的属性第二个被读取, 可以覆盖已经 指定的重复属性,
作为方法参 数传递 的属性最 后被读 取,可以 覆盖已 经从 properties 元 素体和 resource/url 属性中加载的任意重复属性。
从 mybatis-config.xml 文件创建 SqlSessionFactory 的示例:

String resource = "org/mybatis/builder/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(inputStream);

Mapper

public <T>T getMapper(Class<T> type, SqlSession sqlSession) {  
    if (!knownMappers.contains(type))  
        thrownewBindingException("Type " + type + " isnot known to the MapperRegistry.");  
    try {  
        returnMapperProxy.newMapperProxy(type, sqlSession);  
    } catch (Exceptione) {  
        thrownewBindingException("Error getting mapper instance. Cause: " + e, e);  
    }  
}  

猜你喜欢

转载自blog.csdn.net/Jiakunboy/article/details/57075511