mybatis中获取SqlSessionFactory的几种方法及其相关使用

其实mybatis中我们和数据库打交道主要还是通过sqlSession来完成,我们可以使用这个接口来执行命令、获取映射器和事务管理器等等。在这里我主要列举了获取sqlSession实例的几种方法,仅供参考!如也请发现有误的地方请提提出。
SqlSession是由SqlSessionFactory实例创建的,SqlSessionFactory对象张包含了创建SqlSession实例的所有方法。而SqlSessionFactory本身又是SqlSessionFactoryBuilder创建的,它可以通过XML配置文件、注解或者手动配置来完成创建SqlSessionFactory实例的工作。
先简要认识SqlSessionFactoryBuilder类,它是可以被直接new的类。其中有9个重载的build()方法,每一个build()方法都可以从不通的资源创建一个SqlSessionFactory接口的实例。
    //1.根据给定的Configuration对象创建一个SqlSessionFactory的实例
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
    //2.根据给定的inputStream字节流创建一个SqlSessionFactory的实例
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    //3.根据给定的reader字符流创建一个SqlSessionFactory的实例
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    //4.根据给定的inputStream字节流和properties对象创建一个SqlSessionFactory的实例
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, properties);
    //5.根据给定的inputStream字节流和environment(String类型,默认是development,可以在mybatis-config.xml文件中自定义)对象创建一个SqlSessionFactory的实例
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, environment);
    //6.根据给定的reader字符流和properties对象创建一个SqlSessionFactory的实例
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, properties);
    //7.根据给定的reader字符流和environment创建一个SqlSessionFactory的实例
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, environment);
    //8.根据给定的inputStream字节流和environment以及properties属性创建一个SqlSessionFactory的实例
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, environment, properties);
    //根据给定的reader字节流和environment以及properties属性创建一个SqlSessionFactory的实例
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, environment, properties);

其中第二种最为常见。
—————————————————————————————————————–
以下是mybatis-config.xml文件environment元素体简要的配置文件。这里写图片描述
———————————————————————————————-
如果我们调用了一个含有environment对象参数的build()方法,那么mybatis将会使用configuration对象来配置这个environment.如果我们调用了一个不合法(在mybatis-config.xml文件中不存在)的environment的build()方法,那么就使用默认的environment(即)。
如果我们调用了含有properties参数的build()方法,那么mybatis会加载那些properties属性文件,并在我们的配置中可以使用。配置文件中的${propName}语法形式将会被替代。
写到这里,有一个重要的容易被忽视的点,那就是properties属性加载的顺序。通常mybatis会按照以下顺序加载properties属性。
—————————————————————————————————————
1) 在properties元素体中指定的属性首先会被加载读取;
2)接着properties元素类路径resource或者url指定的属性会被加载读取,而且还会覆盖已经存在的重复属性;
3)作为方法参数传递的属性最后被读取加载,当然也可以覆盖已经存在的重复属性。
—————————————————————————————————————
小结一下:其实获取SqlSessionFactory接口的实例的方法都大同小异,这里暂且给出从mybatis-config.xml配置文件中获取SqlSessionFactory实例的方法:
################################################################################################
public static void main(String[] args) throws IOException {
//指定mybatis全局配置文件,类路径。
String resource = “mybatis-config.xml”;
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, “zidingyi”);
}

这是mybatis-config.xml的简要配置:这里写图片描述

如果你喜欢从Java程序而不是XML文件中直接创建配置实例,或创建你自己的配置构建器,MyBatis也提供完整的配置类,提供所有从XML文件中加载配置信息的选项。
接下来这里介绍一个手动配置configuration实例,然后将其传递给build()方法来创建SqlSessionFactory实例:

    DataSource dataSource = new PooledDataSource("com.mysql.jdbc.Driver", 
            "jdbc:mysql://localhost:3306/mybatis?userUnicode=true&characterEncoding=utf8", 
            "root", "root"); 
     Environment environment = new Environment("test", new JdbcTransactionFactory(), dataSource);  
        Configuration configuration = new Configuration(environment);
        configuration.setLazyLoadingEnabled(true);
        configuration.getTypeAliasRegistry().registerAlias(xxxx.class);
        configuration.getTypeAliasRegistry().registerAlias(yyyy.class);
        configuration.addMapper(xxxx.class); 
        configuration.addMapper(yyyy.class);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); 

现在我们拥有了SqlSessionFactory实例,就可以拿到sqlSession实例进而操作数据库,赶快开始把。

SqlSessionFactory
SqlSessionFactory 有六个方法可以用来创建 SqlSession 实例。通常来说,如何决定是你
选择下面这些方法时:
 Transaction(事务):你想为 session 使用事务或者使用自动提交(通常意味着很多
数据库和/或 JDBC 驱动没有事务)?
 Connection(连接):你想 MyBatis 获得来自配置的数据源的连接还是提供你自己
定义的连接?
 Execution(执行): 你想 MyBatis 复用预处理语句和/或批量更新语句(包括插入和
删除)?
重载的 openSession()方法签名设置允许你选择这些可选中的任何一个组合。
SqlSession openSession()
SqlSession openSession(boolean autoCommit)
SqlSession openSession(Connection connection)
SqlSession openSession(TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType,
TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType)
SqlSession openSession(ExecutorType execType, boolean autoCommit)
SqlSession openSession(ExecutorType execType, Connection connection)
Configuration getConfiguration();
默认的 openSession()方法没有参数,它会创建有如下特性的 SqlSession:
 将会开启一个事务(也就是不自动提交) 范围
 连接对象会从由活动环境配置的数据源实例中得到。
 事务隔离级别将会使用驱动或数据源的默认设置。
 预处理语句不会被复用,也不会批量处理更新。
这些方法大都可以自我解释的。开启自动提交,传递“ true”给可选的 autoCommit 参数。
提供自定义的连接,传递一个 Connection 实例给 connection 参数。注意没有覆盖同时设置
Connection 和 autoCommit 两者的方法,因为 MyBatis 会使用当前 connection 对象提供的设
置。MyBatis 为事务隔离级别调用使用一个 Java 枚举包装器,称为 TransactionIsolationLevel,
否 则 它 们 按 预 期 的 方 式 来 工 作 , 并 有 JDBC 支 持 的 5 级(NONE,READ_UNCOMMITTED,READ_COMMITTED,REPEATABLE_READ,SERIALIZA
BLE)
还有一个可能对你来说是新见到的参数,就是 ExecutorType。这个枚举类型定义了 3 个
值:
ExecutorType.SIMPLE
这个执行器类型不做特殊的事情。它为每个语句的执行创建一个新的预处理语句。
ExecutorType.REUSE
这个执行器类型会复用预处理语句。
ExecutorType.BATCH
这个执行器会批量执行所有更新语句,如果 SELECT 在它们中间执行还会标定它们是
必须的,来保证一个简单并易于理解的行为。
注意:在 SqlSessionFactory 中还有一个方法我们没有提及,就是 getConfiguration()。这
个方法会返回一个 Configuration 实例,在运行时你可以使用它来自检 MyBatis 的配置。
注意:如果你已经使用之前版本 MyBatis,你要回忆那些 session, transaction 和 batch
都是分离的。现在和以往不同了,这些都包含在 session 的范围内了。你需要处理分开处理
事务或批量操作来得到它们的效果。
SqlSession
如上面所提到的, SqlSession 实例在 MyBatis 中是非常强大的一个类。在这里你会发现
所有执行语句的方法,提交或回滚事务,还有获取映射器实例。
在 SqlSession 类中有超过 20 个方法,所以将它们分开成易于理解的组合。
语句执行方法
这些方法被用来执行定义在 SQL 映射的 XML 文件中的 SELECT, INSERT, UPDATE
和 DELETE 语句。它们都会自行解释,每一句都使用语句的 ID 属性和参数对象,参数可以
是原生类型(自动装箱或包装类), JavaBean, POJO 或 Map。
Object selectOne(String statement, Object parameter)
List selectList(String statement, Object parameter)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)
selectOne 和 selectList 的不同仅仅是 selectOne 必须返回一个对象。如果多余一个,或者
没有返回(或返回了 null),那么就会抛出异常。如果你不知道需要多少对象,使用 selectList。
如果你想检查一个对象是否存在,那么最好返回统计数( 0 或 1)。因为并不是所有语句都需
要参数,这些方法都是有不同重载版本的,它们可以不需要参数对象。
Object selectOne(String statement)
List selectList(String statement)
int insert(String statement)
int update(String statement)
int delete(String statement)
最后,还有查询方法的三个高级版本,它们允许你限制返回行数的范围,或者提供自定
义结果控制逻辑,这通常用于大量的数据集合。
List selectList
(String statement, Object parameter, RowBounds rowBounds)void select
(String statement, Object parameter, ResultHandler handler)
void select
(String statement, Object parameter, RowBounds rowBounds,
ResultHandler handler)
RowBounds 参数会告诉 MyBatis 略过指定数量的记录,还有限制返回结果的数量。
RowBounds 类有一个构造方法来接收 offset 和 limit,否则是不可改变的。
int offset = 100;
int limit = 25;
RowBounds rowBounds = new RowBounds(offset, limit);
不同的驱动会实现这方面的不同级别的效率。对于最佳的表现,使用结果集类型的
SCROLL_SENSITIVE 或 SCROLL_INSENSITIVE(或句话说:不是 FORWARD_ONLY)。
ResultHandler 参数允许你按你喜欢的方式处理每一行。你可以将它添加到 List 中,创
建 Map,Set或抛出每个结果而不是只保留总计。你可以使用ResultHandler 做很多漂亮的事,
那就是 MyBatis 内部创建结果集列表。
它的接口很简单。
package org.mybatis.executor.result;
public interface ResultHandler {
void handleResult(ResultContext context);
}
ResultContext 参数给你访问结果对象本身的方法,大量结果对象被创建,你可以使用布
尔返回值的 stop()方法来停止 MyBatis 加载更多的结果。

阅读更多
文章标签: mybatis
个人分类: framework
博主设置当前文章不允许评论。

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭