建设网站要服务器吗,wordpress整合ckplayer,投资理财网站建设,李时珍现货交易平台正如前面提到的#xff0c;SqlSession实例是MyBatis中最重要、最强大的类。它是您将找到执行语句、提交或回滚事务以及获取映射器实例的所有方法的地方。
SqlSession 类上有超过二十个方法#xff0c;让我们将它们分成更易理解的组别。
Statement Execution Methods-语…正如前面提到的SqlSession实例是MyBatis中最重要、最强大的类。它是您将找到执行语句、提交或回滚事务以及获取映射器实例的所有方法的地方。
SqlSession 类上有超过二十个方法让我们将它们分成更易理解的组别。
Statement Execution Methods-语句执行方法
这些方法用于执行在SQL映射XML文件中定义的SELECT、INSERT、UPDATE和DELETE语句。它们相当直观每个方法都接受语句的ID和参数对象作为输入参数对象可以是基本类型自动装箱或包装类、JavaBean、POJO或Map。
T T selectOne(String statement, Object parameter)
E ListE selectList(String statement, Object parameter)
T CursorT selectCursor(String statement, Object parameter)
K,V MapK,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是一个特殊情况它被设计用于根据结果对象中的某个属性将结果列表转换为Map。由于并不是所有语句都需要参数因此这些方法提供了无需参数对象的重载版本。
insert、update和delete方法返回的值表示受影响的行数。
T T selectOne(String statement)
E ListE selectList(String statement)
T CursorT selectCursor(String statement)
K,V MapK,V selectMap(String statement, String mapKey)
int insert(String statement)
int update(String statement)
int delete(String statement)
游标Cursor提供与列表List相同的结果但它使用迭代器Iterator来惰性获取数据。
try (CursorMyEntity entities session.selectCursor(statement, param)) {for (MyEntity entity : entities) {// process one entity}
}
最后还有三个高级版本的select方法允许您限制要返回的行范围或者提供自定义的结果处理逻辑通常用于处理非常大的数据集。
E ListE selectList (String statement, Object parameter, RowBounds rowBounds)
T CursorT selectCursor(String statement, Object parameter, RowBounds rowBounds)
K,V MapK,V selectMap(String statement, Object parameter, String mapKey, RowBounds rowbounds)
void select (String statement, Object parameter, ResultHandlerT handler)
void select (String statement, Object parameter, RowBounds rowBounds, ResultHandlerT 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参数允许您自定义处理每一行的结果。您可以将结果添加到列表中创建一个Map、Set或者完全忽略每个结果只保留计算的汇总数据。您可以根据需要对ResultHandler执行几乎任何操作MyBatis内部也使用它来构建结果集列表。
从MyBatis 3.4.6开始如果使用了CALLABLE语句并且存储过程中有输出参数的话传递给ResultHandler的接口将在每个REFCURSOR输出参数上使用。
该接口非常简单。
package org.apache.ibatis.session;
public interface ResultHandlerT {void handleResult(ResultContext? extends T context);
}
ResultContext参数提供了对结果对象本身的访问以及已创建的结果对象数量的计数还有一个Boolean型的stop()方法您可以使用该方法停止MyBatis加载更多的结果。
使用ResultHandler有两个限制需要注意
使用ResultHandler调用的方法获取的数据不会被缓存。当使用高级结果映射advanced resultMaps时MyBatis可能需要多行数据来构建一个对象。如果使用ResultHandler可能会得到一个对象其中关联或集合尚未填充。
Batch update statement Flush Method-立即批量更新方法
在任何时候可以使用JDBC驱动类中的方法来执行批量更新语句。当ExecutorType为ExecutorType.BATCH时可以使用该方法。
ListBatchResult flushStatements() Transaction Control Methods-事务控制方法
有四种方法可以控制事务的范围。当然如果选择使用自动提交或者使用外部事务管理器则这些方法没有效果。然而如果使用由Connection实例管理的JDBC事务管理器那么以下四种方法将会非常有用
void commit()
void commit(boolean force)
void rollback()
void rollback(boolean force)
默认情况下除非通过调用带有affectData参数的insert、update、delete或select方法来检测到数据库已被更改MyBatis实际上不会执行提交操作。如果在没有调用这些方法的情况下进行了更改您可以将true传递给commit和rollback方法以确保它们将被提交请注意仍然无法强制处于自动提交模式或使用外部事务管理器的会话。
大多数情况下您不需要调用rollback()因为如果不调用commitMyBatis会自动执行回滚操作。然而如果您需要对可能进行多次提交和回滚的会话进行更精细的控制您可以使用rollback选项来实现。
注意MyBatis-Spring和MyBatis-Guice提供了声明式的事务处理。因此如果您正在使用MyBatis与Spring或Guice请参考它们的具体手册。
Ensuring that SqlSession is Closed-确保SqlSession被关闭
void close() 最重要的一点是确保关闭您打开的任何会话Session。为了确保这一点最好使用以下工作单元模式
try (SqlSession session sqlSessionFactory.openSession()) {// following 3 lines are pseudocode for doing some worksession.insert(...);session.update(...);session.delete(...);session.commit();
} 注意就像SqlSessionFactory一样您可以通过调用getConfiguration()方法来获取SqlSession正在使用的Configuration实例。
Configuration getConfiguration()