O/R映射框架的延迟加载技术实现大体上有这么4种(参看Martin Fowler的意见):
(
http://www.martinfowler.com/eaaCatalog/lazyLoad.html)
There are four main varieties of lazy load. Lazy Initialization uses a special marker value (usually null) to indicate a field isn't loaded. Every access to the field checks the field for the marker value and if unloaded, loads it. Virtual Proxy is an object with the same interface as the real object. The first time one of its methods are called it loads the real the object and then delegates. Value Holder is an object with a getValue method. Clients call getValue to get the real object, the first call triggers the load. A ghost is the real object without any data. The first time you call a method the ghost loads the full data into its fields.
通过阅读源代码,发现iBATIS中的延迟加载是用上述方式中的虚拟代理实现的.
在动态代理的实现上, iBATIS有Java动态代理和CGLIB两种实现方案,iBATIS把用CGLIB实现的方案称为Enhanced的方案,可见CGLIB的效率会比java的动态代理效率要高.
在iBATIS首先判断是否定义了延迟加载,如果定义了,则利用Lazy的Loader来提取数据(返回一个Proxy).如没有执行对这个的任何操作,或者只是不再使用(finalize),则不做处理,否者就加载真正的对象.
可以通过阅读类
com.ibatis.sqlmap.engine.mapping.result.loader.LazyResultLoader
的源码获取更多的细节.
分享到:
相关推荐
SQL映射文件,如`User.xml`,是ibatis中最重要的组成部分之一,用于定义SQL语句和结果映射规则。映射文件的结构通常包括以下元素: - **typeAlias**:定义类型别名,简化SQL语句中的类型引用。 - **resultMap**:...
延迟加载(Lazy Loading)功能可以在需要时才加载关联的数据,以提高性能。动态映射允许你在运行时根据 Java 对象的状态动态生成 SQL 语句,增强了 SQL 语句的可扩展性。 在事务管理方面,Ibatis 支持基于 JDBC 和 ...
- **延迟加载**:延迟加载是在需要时才加载关联对象的数据,从而减少初始查询时的数据量。 - **动态映射**:支持在运行时动态构建SQL语句,提高了代码的灵活性。 - **事务管理**: - **基于JDBC的事务管理机制**:...
在实际应用中,我们还可以通过动态SQL来灵活控制一对多的加载,例如延迟加载(lazy loading)或按需加载。`<if>` 和 `<choose>` 等标签可以用来条件性地执行不同的SQL片段,以优化性能。 总的来说,`iBatis` 的一对...
- **数据关联**:包括一对多关联和一对一关联,支持延迟加载。 - **动态映射**:允许在SQL语句中使用动态参数,例如`<if>`、`<choose>`等标签。 - **事务管理**: - **基于JDBC的事务管理机制**:利用JDBC的原生...
在本文中,我们将深入探讨ibatis配置文件的关键组成部分及其如何影响ibatis框架的运行机制。ibatis(现在通常称为MyBatis)是一个优秀的持久层框架,它将SQL语句与Java代码分离,允许开发者直接编写SQL语句并映射到...
- **延迟加载**:ibatis支持懒加载机制,即在实际需要数据时才发起查询,以提高性能。 - **动态映射**:ibatis支持动态SQL语句的编写,可以根据不同的条件构造SQL语句,从而满足更复杂的查询需求。 - **事务管理*...
- **延迟加载**:通过配置文件中的 `<autoMapping>` 或 `<lazyLoading>` 标签来启用。 #### 七、iBatis高级特性 - **数据关联**:用于处理一对多或一对一的数据关系。 - **动态映射**:支持 SQL 语句的动态构建,...
在`SqlMapConfig.xml`文件中,我们配置了ibatis的基本设置,包括缓存模型、增强功能、延迟加载等,并指定了事务管理器和数据源的信息。数据源部分包含了连接数据库所需的驱动、URL、用户名和密码等信息。 #### 步骤...
- **延迟加载**:通过配置实现懒加载,提高应用性能。 2. **动态映射** - **动态SQL**:支持if、choose、when、otherwise等标签构造动态SQL语句。 - **参数传递**:通过`#{}`语法传递参数值,支持类型转换和空值...
此外,还支持延迟加载,即在真正需要时才加载关联对象,以提高性能。 ### IBatis的高级特性 #### 动态SQL IBatis支持动态SQL,即在运行时动态构建SQL语句。这可以通过在映射文件中使用`if`、`choose`、`when`、`...
- 延迟加载是指在需要时才加载关联的对象,而联合查询则是通过一次查询获取所有相关数据。 25. **复杂类型集合的属性** - 复杂类型的集合属性可以通过定义ResultMap来处理。 26. **避免N+1 Select(1:M和M:N)**...
- **半自动化**: 在ibatis中,程序员需要编写SQL语句,并明确地指定结果集如何映射到Java对象。这使得ibatis非常适合那些需要精细控制SQL执行的应用场景。 - **灵活性**: 由于ibatis不完全封装数据库访问细节,因此...
在ibatis中,可以通过配置文件定义一对多的关系,例如一个用户可以有多个订单。通常采用嵌套查询的方式实现。 - **一对一关联** 类似地,一对一的关联也可以通过嵌套查询或嵌套结果的方式来实现。 #### 六、高级...
- `lazyLoadingEnabled`: 是否启用延迟加载,默认为`true`。 - `enhancementEnabled`: 是否开启运行时字节码增强,默认为`false`,主要用于AOP代理。 - `useStatementNamespaces`: 是否使用命名空间来引用...
OSCache是一个第三方缓存组件,可以集成到IBatis中,提供更强大的缓存功能。 综上所述,《IBatis2开发指南》深入讲解了IBatis框架的核心功能和使用技巧,对于希望在复杂环境中高效处理数据库操作的开发者来说,是一...
在此配置文件中,我们定义了数据库连接的属性、缓存设置以及其他一些高级特性,如延迟加载等。其中,`<sqlMap>`元素用于引入具体的SQL映射文件。 3. **创建SqlMapClient实例** - **SqlMapUtil类** 下面是创建`...