使用MyBatis 3和Java进行延迟加载

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用MyBatis 3和Java进行延迟加载相关的知识,希望对你有一定的参考价值。

我正在使用Mybatis(3.2.7版)作为我的JAVA项目的ORM框架。由于我来自JPA,所以我热衷于探索Mybatis支持的LAZYLOADING。但是我无法理解任何实质性的东西。((我仅使用JAVA API和注释来配置MYBATIS,仅用于查询目的)]] >>

根据Mybatis文档:1。 lazyLoadingEnabled:默认值为TRUE

全局启用或禁用延迟加载。启用后,所有关系都会变得懒惰已加载。可以使用fetchType属性将此值替换为特定的关系在它上面。

2。 sivelyLazyLoading:默认值= TRUE

启用后,具有延迟加载属性的对象将在调用任何延迟属性后完全加载。否则,将按需加载每个属性。

使用以下属性,我尝试了以下代码:

a。 JAVA类:

Feedback.java

public class Feedback implements Serializable {
private static final long serialVersionUID = 1L;

private int id;
private String message;

   /**
   * while loading Feedback, I want sender object to be lazily loaded
   */
private User sender;
private boolean seen;

// getters and setters
}

User.java

public class User implements Serializable, {
private static final long serialVersionUID = 1L;
private int id;
private String email;

// getters and setters
}

b。数据库架构:

反馈表

                Table "public.feedback"

  Column | Type      |    Modifiers                       
-------------+-----------+-------------------------------------------------------
 id          | integer   | PRIMARY KEY
 seen        | boolean   | not null
 sender_id   | integer   | FOREIGN KEY (sender_id) REFERENCES users(id)
 message     | text      | 

用户表:

                Table "public.users"

Column   | Type     |     Modifiers                      
-------------+----------+----------------------------------------------------
id          | integer  | PRIMARY KEY
email       | text     | 

c。通过JAVA API配置MyBatis:

DataSource dataSource = new PGSimpleDataSource();
        ((PGSimpleDataSource) dataSource).setServerName("localhost");
        ((PGSimpleDataSource) dataSource).setDatabaseName(dbName);
        ((PGSimpleDataSource) dataSource).setPortNumber(5432);
        ((PGSimpleDataSource) dataSource).setUser(new UnixSystem().getUsername());
        ((PGSimpleDataSource) dataSource).setPassword("");

        TransactionFactory transactionFactory = new JdbcTransactionFactory();
        Environment environment = new Environment(dbName, transactionFactory, dataSource);
        Configuration configuration = new Configuration(environment);
             configuration.addMapper(FeedbackMapper.class);

            //
             configuration.setAggressiveLazyLoading(false);
             sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

d。在Feedbackmapper中查询数据库和数据库查询:

feedbackmapper中的d.1代码:

@Select("SELECT f.id, f.message, f.seen, f.sender_id FROM feedback f WHERE f.id= #{feedbackId}")
@Results(value = { 
        @Result(property = "id", column = "id"),
        @Result(property = "sender", column = "sender_id", javaType = User.class, one = @One(select = "getUser", fetchType=FetchType.DEFAULT))
})
public Feedback getFeedback(@Param("feedbackId") int feedbackId);

@Select("SELECT id, email FROM users WHERE id=#{id}")
public User getUser(int id);

d.2:在feedbackMapper中调用查询的代码

    // setup Mybatis session factory and config
    Feedback feedback =feedbackMapper.getFeedback(70000);
    System.out.println(feedback);

但在查询getFeedback(id)时仍会填充“发送者”对象。我希望发送者对象不应该立即填充,而只能在我对获取的反馈对象调用getSender()时填充。请帮助

我最近的观察:

Mybatis团队确实在他们的文档中(例如,在文档中弄错了:

  1. lazyLoadingEnabled:默认值= TRUE

  2. aggressiveLazyLoading:默认值= TRUE

    但是查看其源代码:

  3.  protected boolean lazyLoadingEnabled = false;
     protected boolean aggressiveLazyLoading = true;
    

    **但是经过更正后,结果不会受到影响,并且延迟加载无效:( **

    我正在使用Mybatis(3.2.7版)作为我的JAVA项目的ORM框架。由于我来自JPA,所以我热衷于探索Mybatis支持的LAZYLOADING。但是我什么也听不见...

答案

我想我找到了一种启用延迟加载的方法(尽管不是百分之百确定):

  • MyBatis文档在配置中具有以下设置:
另一答案

UPDATE

另一答案

我认为使用print来验证mybatis中的延迟加载并不容易。我们可以使用configuration.getLazyLoadTriggerMethods().clear();删除默认的triggerMethods作为上一个答案。但是当我们打印它或使用toString时,它仍然会调用getXXX。因此它仍然会触发延迟加载以选择更多内容。因此,我们无法调试或打印以查看延迟加载的过程。

以上是关于使用MyBatis 3和Java进行延迟加载的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis的延迟加载

MyBatis延迟加载和缓存

MyBatis延迟加载和缓存

MyBatis一对多查询及延迟加载

Mybatis延迟加载和缓存

mybatis探究之延迟加载和缓存