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加载更多的结果。 

 

 

事务控制方法 

控制事务范围有四个方法。当然,如果你已经选择了自动提交或你正在使用外部事务管理器,这就没有任何效果了。然而,如果你正在使用JDBC事务管理员,由Connection实例来控制,那么这四个方法就会派上用场: 

 

      void commit() 

      void commit(boolean force) 

      void rollback() 

      void rollback(boolean force) 

 

    默认情况下MyBatis不会自动提交事务,除非它侦测到有插入,更新或删除操作改变了数据库。如果你已经做出了一些改变而没有使用这些方法,那么你可以传递true到commit和rollback方法来保证它会被提交

(注意,你不能在自动提交模式下强制session,或者使用了外部事务管理器时)。很多时候你不用调用rollback(),因为如果你没有调用commit时MyBatis会替你完成。然而,如果你需要更多对多提交和回滚都可能

的session的细粒度控制,你可以使用回滚选择来使它成为可能。 

 

 

清理Session级的缓存 

 

      void clearCache() 

 

SqlSession实例有一个本地缓存在执行update,commit,rollback和close时被清理。要明确地关闭它(获取打算做更多的工作),你可以调用clearCache()。 

 

 

确保SqlSession被关闭 

 

     void close() 

 

你必须保证的最重要的事情是你要关闭所打开的任何session。保证做到这点的最佳方式是下面的工作模式: 

 

     SqlSession session = sqlSessionFactory.openSession(); 

      try { 

           // following 3 lines pseudocod for “doing some work” 

            session.insert(…); 

            session.update(…); 

            session.delete(…); 

            session.commit(); 

      } finally { 

           session.close(); 

      } 

 

注意:就像SqlSessionFactory,你可以通过调用getConfiguration()方法获得SqlSession使用的Configuration实例 

      Configuration getConfiguration() 

 

 

使用映射器 

     <T> T getMapper(Class<T> type) 

    上述的各个insert,update,delete和select方法都很强大,但也有些繁琐,没有类型安全,对于你的IDE也没有帮助,还有可能的单元测试。在上面的入门章节中我们已经看到了一个使用映射器的示例。 

因此,一个更通用的方式来执行映射语句是使用映射器类。一个映射器类就是一个简单的接口,其中的方法定义匹配于SqlSession方法。下面的示例展示了一些方法签名和它们是如何映射到SqlSession的。 

 

      public interface AuthorMapper { 

            // (Author) selectOne(“selectAuthor”,5); 

            Author selectAuthor(int id); 

            // (List<Author>) selectList(“selectAuthors”) 

            List<Author> selectAuthors(); 

            // insert(“insertAuthor”, author) 

            void insertAuthor(Author author); 

            // updateAuthor(“updateAuhor”, author) 

            void updateAuthor(Author author); 

            // delete(“deleteAuthor”,5) 

            void deleteAuthor(int id); 

        } 

 

    总之,每个映射器方法签名应该匹配相关联的SqlSession方法,而没有字符串参数ID。相反,方法名必须匹配映射语句的ID。 此外,返回类型必须匹配期望的结果类型。所有常用的类型都是支持的,包括:原生类型,Map,POJO和JavaBean。 

 

1、映射器接口不需要去实现任何接口或扩展任何类。只要方法前面可以被用来唯一标识对应的映射语句就可以了。

2、映射器接口可以扩展其他接口。当使用XML来构建映射器接口时要保证在合适的命名空间中有语句。而且,唯一的限制就是你不能在两个继承关系的接口中有相同的方法签名(这也是不好的想法)。 

 

    你可以传递多个参数给一个映射器方法。如果你这样做了,默认情况下它们将会以它们在参数列表中的位置来命名,比如:#{1},#{2}等。如果你想改变参数的名称(只在多参数情况下),那么你可以在参数上使用@Param(“paramName”)注解。 

你也可以给方法传递一个RowBounds实例来限制查询结果。 

 

 

映射器注解 

    因为最初设计时,MyBatis是一个XML驱动的框架。配置信息是基于XML的,而且映射语句也是定义在XML中的。而到了MyBatis 3,有新的可用的选择了。MyBatis 3构建在基于全面而且强大的Java配置API之上。

这个配置API是基于XML的MyBatis配置的基础,也是新的基于注解配置的基础。注解提供了一种简单的方式来实现简单映射语句,而不会引入大量的开销。 

注意:不幸的是,Java注解限制了它们的表现和灵活。尽管很多时间都花调查,设计和实验上,最强大的MyBatis映射不能用注解来构建,那并不可笑。C#属性(做示例)就没有这些限制,因此MyBatis.NET将会比XML有更丰富的选择。

也就是说,基于Java注解的配置离不开它的特性。 

注解有下面这些: 注解 

目标 

相对应的XML 

描述 

@CacheNamespace 

类 

<cache> 

为给定的命名空间(比如类)配置缓存。属性:implemetation,eviction, 

flushInterval,size和readWrite。 

@CacheNamespaceRef 

类 

<cacheRef> 

参照另外一个命名空间的缓存来使用。属性:value,应该是一个名空姐的字符串值(也就是类的完全限定名)。 

转载于:https://www.cnblogs.com/linked5233/articles/4264391.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值