Mybatis的Java API(八)

使用mybatis的主要Java接口就是SqlSession。可以通过这个接口来执行命令,获取映射器和事务管理。

SqlSession是由SqlSessionFactory实例创建,SqlSessionFactory对象包含创建SqlSession实例的所有方法。而SqlSessionFactory本身是由SqlSessionFactoryBuilder创建的,可以从XML,注解或手动配置Javadiam来创建SqlSessionFactory。

一、SqlSessionFactoryBuilder

有5个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)

以下给出一个从 mybatis-config.xml 文件创建 SqlSessionFactory 的示例:

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

Resources工具类,这个类在org.apache.ibatis.io包里面。可以从类路径,文件系统或一个web URL中加载资源文件。

这里有一个简单的示例,教你如何手动配置configuration实例,然后将它传递给build()方法来创建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有6个方法创建SqlSession实例。通常来说,当你选择这些方法时你需要考虑以下几点:

  • 事务处理:需要在session使用事务或者使用自动提交功能?
  • 连接:需要依赖mybatis获得来自数据源的配置?还是使用自己提供的配置?
  • 执行语句:需要mybatis复用预处理语句,还是批量更新语句?

常用API:

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:

  • 会开启一个事务(也就是不自动提交);
  • 将从由当前环境配置的DataSource实例中获取Connection对象;
  • 事务隔离级别将会使用驱动或数据源的默认设置;
  • 预处理语句不会被复用,也不会批量处理更新。

(1) autoCommit传递true即可开启自动提交功能;

(2) 如要使用自己的Connection实例,传递一个Connection实例给connection参数即可;

(3) mybatis为事务隔离级别调用使用了一个Java枚举包装器,称为TransacationIsolationLevel,若不使用它,将使用JDBC所支持5个隔离级(NONE、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ 和 SERIALIZABLE) 

(4) ExecutorType.SIMPLE:这个执行器类型不做特殊的事情,它为每个语句的执行创建一个姓的预处理语句;ExecutorType.REUSE:这个执行器类型会复用处理语句;ExecutorType.BATCH:这个执行器会批量执行所有更新语句,如果select在它们中间执行,必要时请把它们区别开来以保证行为的易读性。

三、SqlSession

1. 执行语句方法

这些方法被用来执行定义在SQL映射的XML文件中的SELECT、INSERT、UPDATE 和 DELETE 语句。它们都会自行解释,每一句都使用语句的ID属性和参数对象,参数可以是原生类型(自动装箱或包装类)、JavaBean、POJO或Map。

<T> T selectOne(String statement, Object parameter)
<E> List<E> selectList(String statement, Object parameter)
<K,V> Map<K,V> 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)  

selectOne和 selectList的不同仅仅是selectOne必须返回一个对象或null值。如果返回值多于一个,那么就会抛出异常。如果你不知道返回对象的数量,请使用selectList。如果需要查看返回对象是否存在,可行的方案是返回一个值即可(0 或 1)。selectMap稍微特殊一点,因为它会将返回的对象的其中一个属性作为key值,将对象作为 value值,从而将多结果集转为Map类型值。因为并不是所有语句都需要参数,所以这些方法都重载成不需要参数的形式。  

<T> T selectOne(String statement)
<E> List<E> selectList(String statement)
<K,V> Map<K,V> selectMap(String statement, String mapKey)
int insert(String statement)
int update(String statement)
int delete(String statement)

实例:

// UserMapper.xml
 <select id="selectUserById" resultMap="UserMap">
  select * from user where
  id = #{id}
 </select>
 
// UserDao.java
User u = session1.selectOne("selectUserById", 1);

最后,还有select方法的三个高级版本,它们允许你限制返回行数的范围,或者提供自定义结果控制逻辑,这通常在数据集合庞大的情形下使用(分页查询)。

<E> List<E> selectList (String statement, Object parameter, RowBounds rowBounds)
<K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowbounds)
void select (String statement, Object parameter, ResultHandler<T> handler)
void select (String statement, Object parameter, RowBounds rowBounds, ResultHandler<T> handler)

RowBounds参数会告诉MyBatis略过指定数量的记录,还有限制返回结果的数量。RowBounds类有一个构造方法来接收offset和limit,另外,它们是不可二次赋值的。

int offset = 100;
int limit = 25;
RowBounds rowBounds = new RowBounds(offset, limit);  

实例:

//UserMapper.xml
 <select id="selectUsers" resultType= "org.mybatis.mapper.User">
  select * from user
 </select>
 
//UserDao.java
List<User> us = session1.selectList("selectUsers",null, new RowBounds(2, 1));

ResultHandler参数允许你按你喜欢的方式处理每一行。你可以将它添加到List中、创建Map和Set,或者丢弃每个返回值都可以,它取代了仅保留执行语句过后的总结果列表的死板结果。你可以使用ResultHandler做很多事,并且这是MyBatis自身内部会使用的方法,以创建结果集列表。

猜你喜欢

转载自www.cnblogs.com/myitnews/p/11563740.html
今日推荐