使用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团队确实在他们的文档中(例如,在文档中弄错了:
lazyLoadingEnabled:默认值= TRUE
aggressiveLazyLoading:默认值= TRUE
但是查看其源代码:
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进行延迟加载的主要内容,如果未能解决你的问题,请参考以下文章