SqlSessions:
使用MyBatis的主要Java接口是SqlSession,可通过该接口执行命令,获取映射器和管理事务,SqlSessions 是由 SqlSessionFactory 实例创建的, SqlSessionFactory 对象包含创建SqlSessions 实例的所有方法,而SqlSessionFactory 本身是由 SqlSessionFactoryBuilder 创建的,它可以从 XML、注解或手动配置 Java 代码来创建 SqlSessionFactory。
注意:当MyBatis与一些依赖注入框架(如Spring或Guice)同时使用时,SqlSessions将被依赖注入框架所创建,无需使用SqlSessionFactoryBuilder或者SqlSessionFactory。
SqlSessionFactoryBuilder:
SqlSessionFactoryBuilder 有五个 build() 方法,每一种都允许从不同的资源中创建一个 SqlSession 实例:
SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String env, Properties props)
SqlSessionFactory build(Configuration config)
如果调用了参数有environment的build方法,那么MyBatis将会使用configuration对象配置environment,如果指定的environment不合法,将会得到错误提示。如果调用了不带environment参数的build方法,就使用默认的environment。如果调用了含有properties实例的方法,那么MyBatis就会加载那些properties属性配置文件,并在配置中可用。MyBatis加载属性的顺序为:
1.首先读取properties元素体重指定的属性
2.读取从properties元素的类路径resource或url指定的属性,且会覆盖已经指定的重复属性
3.读取作为方法参数传递的属性,覆盖前面的重复属性
因此,方法传递属性的优先级最高,resource或url指定的属性优先级其次,最次的是properties元素体重指定的属性
创建SqlSessionFactory第一种方法举例:从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);
创建SqlSessionFactory第二种方法举例:
DataSource dataSource = BaseDataTest.createBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.setLazyLoadingEnabled(true);
configuration.setEnhancementEnabled(true);
configuration.getTypeAliasRegistry().registerAlias(Blog.class);
configuration.getTypeAliasRegistry().registerAlias(Post.class);
configuration.getTypeAliasRegistry().registerAlias(Author.class);
configuration.addMapper(BoundBlogMapper.class);
configuration.addMapper(BoundAuthorMapper.class);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(configuration);
SqlSessionFactory:
SqlSessionFactory有六个方法创建SqlSession实例,需要三个方面:事务处理、连接和执行语句,从而有下列多个方法供使用:
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();
SqlSession openSession()有如下四个特性:
1.会开启一个事务(也就是不自动提交)。
2.将从由当前环境配置的 DataSource 实例中获取 Connection 对象。
3.事务隔离级别将会使用驱动或数据源的默认设置。
4.预处理语句不会被复用,也不会批量处理更新。
SqlSession:
该类的实例在MyBatis中飞强大,其可执行所有语句,提交或回滚事务和获取映射器实例,其方法如下:
执行语句方法:
T selectOne(String statement, Object parameter)
List selectList(String statement, Object parameter)
Cursor selectCursor(String statement, Object parameter)
Map selectMap(String statement, Object parameter, String mapKey)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)
批量立即更新方法:
List < BatchResult > flushStatements ()
事务控制方法:
void commit () void commit ( boolean force ) void rollback () void rollback ( boolean force )
本地缓存:
MyBatis使用了两种缓存:本地缓存和二级缓存
当一个新session被创建,MyBatis就会创建一个与之相关联的本地缓存,任何在session执行过的查询语句本身就会保存在本地缓存中,从而相同的查询语句和相同的参数所产生的更改就不会影响数据库,本地缓存会被增删改、提交事务、关闭事务以及关闭session清空。默认情况下,本地缓存数据可在整个session周期内使用,这一缓存被用来解决循环引用错误和加快重复嵌套查询的速度,所以不可以不被禁用,可设置localCacheScope= STATEMENT表示缓存仅在语句执行时有效,如果localCacheScope被设置成SESSION,那么MyBatis所返回的引用将传递个保存在本地缓存中的相同对象,可以调用localCacheScop
方法清空本地缓存,我们需确保SqlSession被关闭,可以使用如下语句:
try ( SqlSession session = sqlSessionFactory . openSession ()) {
session . insert (...);
session . update (...);
session . delete (...) ;
session . commit (); }
可以通过SqlSession获取Configuration实例:
Configuration getConfiguration ()
可以通过SqlSession获取映射器:
T getMapper(Class type)