主要体现在关联查询上
一、开启延时加载
需要在核心配置文件中做两个必须的配置
<configuration>
<settings>
<!– 延迟加载总开关 –>
<setting name="lazyLoadingEnabled" value="true" />
<!– 禁止积极主动的加载 –>
<setting name="aggressiveLazyLoading" value="false" />
</settings>
二、一对多
对于Person来说
一条SQL语句查询Person的基本信息
一条SQL语句查询Person的订单(懒加载的语句)
1.在PersonMapper中
<resultMap type="com.yutouxiuxiu.model.Person" id="selectOrderByPersonIdLazyRM" extends="personRM">
<!–
column - 主SQL语句查询的结果集的某一字段作为参数传给子SQL语句
select - 子SQL语句 –>
<collection property="orderList" column="person_id" select="com.yutouxiuxiu.Orders.selectOrderByPersonId">
</collection>
</resultMap>
<select id="selectOrderByPersonIdLazy" parameterType="int" resultMap="selectOrderByPersonIdLazyRM">
select * from person where person_id = #{personId}
</select>
2.在OrdersMapper中
<!– 一对多的时候的延迟加载的子SQL语句 –>
<select id="selectOrderByPersonId" parameterType="int" resultMap="BaseResultMap">
select * from orders o where o.person_id = #{personId}
</select>
@Test
public void selectOrderByPersonIdLazy() {
// 获得session
SqlSession session = sqlSessionFactory.openSession();
try {
Person person = session.selectOne("com.yutouxiuxiu.Person.selectOrderByPersonIdLazy", 1);
// 发出查询person信息的SQL语句
System.out.println(person);
// 发出查询订单信息的SQL语句
System.out.println(person.getOrderList());
} finally {
session.close();
}
}
执行结果:
2014-02-11 11:17:30,550 [main] DEBUG [com.yutouxiuxiu.Person.selectOrderByPersonIdLazy] – ooo Using Connection [com.mysql.jdbc.Connection@4e94ac10]
2014-02-11 11:17:30,551 [main] DEBUG [com.yutouxiuxiu.Person.selectOrderByPersonIdLazy] – ==> Preparing: select * from person where person_id = ?
2014-02-11 11:17:30,602 [main] DEBUG [com.yutouxiuxiu.Person.selectOrderByPersonIdLazy] – ==> Parameters: 1(Integer)
2014-02-11 11:17:30,702 [main] DEBUG [com.yutouxiuxiu.Orders.selectOrderByPersonId] – ooo Using Connection [com.mysql.jdbc.Connection@4e94ac10]
2014-02-11 11:17:30,702 [main] DEBUG [com.yutouxiuxiu.Orders.selectOrderByPersonId] – ==> Preparing: select * from orders o where o.person_id = ?
2014-02-11 11:17:30,703 [main] DEBUG [com.yutouxiuxiu.Orders.selectOrderByPersonId] – ==> Parameters: 1(Integer)
Person [id=1, name=赵四, birthday=Mon Feb 10 00:00:00 CST 2014, address=象牙山, salary=1000, orderList=[Orders [orderId=1, orderSum=1000.0, orderTime=Sun Feb 09 16:28:26 CST 2014, personId=1, detialList=null, person=null], Orders [orderId=2, orderSum=200.0, orderTime=Sun Feb 09 09:09:00 CST 2014, personId=1, detialList=null, person=null]], roleList=null]
[Orders [orderId=1, orderSum=1000.0, orderTime=Sun Feb 09 16:28:26 CST 2014, personId=1, detialList=null, person=null], Orders [orderId=2, orderSum=200.0, orderTime=Sun Feb 09 09:09:00 CST 2014, personId=1, detialList=null, person=null]]
三、多对一
对于Orders来说
一条SQL语句查询Order是的基本信息
一条SQL语句查询Order的所属人(懒加载的语句)
1.Order的映射文件
<resultMap type="com.yutouxiuxiu.model.Orders" id="selectPersonByOrderIdLazyRM" extends="BaseResultMap">
<association property="person" column="person_id" select="com.yutouxiuxiu.Person.selectPersonByOrderId">
</association>
</resultMap>
<select id="selectPersonByOrderIdLazy" parameterType="int" resultMap="selectPersonByOrderIdLazyRM">
select * from orders where order_id = #{orderId}
</select>
2.Person的映射文件
<select id="selectPersonByOrderId">
select * from person where person_id = #{personId}
</select>
@Test
public void selectPersonByOrderIdLazy() {
// 获得session
SqlSession session = sqlSessionFactory.openSession();
try {
Orders orders = session.selectOne("com.yutouxiuxiu.Orders.selectPersonByOrderIdLazy", 1);
// 发出查询person信息的SQL语句
System.out.println(orders);
// 发出查询订单信息的SQL语句
System.out.println(orders.getPerson());
} finally {
session.close();
}
}
相关推荐
1. **配置延迟加载**:在MyBatis的XML映射文件中,通过`<association>`或`<collection>`元素配置延迟加载。例如,对于一个一对多的关系,我们需要在`<collection>`元素中设置`lazyLoadingEnabled="true"`来开启延迟...
在 MyBatis 的映射文件中,可以为一对一或一对多的关系映射设置 `lazyLoadingEnabled=true`,开启全局延迟加载功能。然后在需要延迟加载的关联映射上添加 `<association>` 或 `<collection>` 标签,并设置 `...
在MyBatis中,懒加载(延迟加载)是一种优化策略,用于提高应用程序的性能。懒加载是指当真正需要数据时,而不是在加载实体对象时立即加载关联数据,这种机制可以避免不必要的数据库查询,从而减少资源消耗。 标题...
- 在Mybatis中,一对一延迟加载的实现通常涉及到在Mapper接口和XML映射文件中的配置。例如,可以通过在映射文件中设置`association`标签,并开启延迟加载(`lazyLoadingEnabled=true`),以及在关联的对象上添加`@...
在本篇文章中,我们将详细介绍MyBatis延迟加载的意义、配置和实现。 延迟加载的意义 在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度要快。如果查询单表就可以满足...
在Mybatis中,延迟加载可以通过配置文件mybatis-config.xml来实现,主要有三种方式:直接加载、侵入式延迟加载和深度延迟加载。 直接加载是指执行完对主加载对象的select语句,马上执行对关联对象的select查询。...
在Mybatis的核心配置文件中,可以通过以下两个设置来控制延迟加载的行为: 1. `lazyLoadingEnabled`:全局控制是否启用延迟加载。如果设置为`false`,所有关联的对象都会在加载时立即初始化;如果设置为`true`...
2. **全局启用延迟加载**:你可以在Mybatis的全局配置文件`mybatis-config.xml`中通过`<settings>`标签的`lazyLoadingEnabled`属性来开启延迟加载: ```xml <setting name="lazyLoadingEnabled" value="true"/> ...
要开启MyBatis的延迟加载功能,需要在`SqlMapConfig.xml`文件中配置`settings`标签。设置`lazyLoadingEnabled`为`true`可启用全局性的懒加载,意味着所有的关联对象都会在首次访问时加载。同时,设置`...
MyBatis中延迟加载Lazy策略的方法 MyBatis中延迟加载Lazy策略是一个非常重要的概念,它可以帮助开发者提高数据库查询的效率和性能。在MyBatis中,延迟加载Lazy策略的方法主要有两种:一对一延迟加载和一对多延迟...
3. **`<settings>`**:这个标签用于配置MyBatis的全局行为,包括缓存设置、延迟加载、结果集映射等。例如,你可以设置`lazyLoadingEnabled`来开启或关闭懒加载。 4. **`<typeAliases>`**:定义类型别名,简化类名的...
* lazyLoadingEnabled:延迟加载加全局开关 true/false * multipResultSetsEnabled:是否允许单一语句返回多结果集 true/false * userColumnLabel:使用列标签代替列名 true/false * userGeneratedKeys:允许jdbc...
MyBatis 的延迟加载功能默认是关闭的,需要在 SqlMapConfig.xml 文件中通过 setting 标签配置来开启延迟加载功能。开启延迟加载的属性包括: * lazyLoadingEnabled:全局性设置懒加载。如果设为‘false',则所有相...
例如,`lazyLoadingEnabled`用来启用或禁用延迟加载,`aggressiveLazyLoading`则决定是否一旦对象被初始化,所有关联的对象都会被立即加载。 2. **类型别名(typeAliases)**:为了简化Java类全限定名,我们可以...
lazyLoadingEnabled:该配置控制的是 MyBatis 中的延迟加载行为,当设置为 true 时,MyBatis 会启用延迟加载,否则会禁用延迟加载。默认值为 false。 aggressiveLazyLoading:该配置控制的是 MyBatis 中的延迟加载...
- `settings` 标签:包含各种运行时设置,如自动映射级别、延迟加载等。 - `autoMappingBehavior`:设置自动映射行为,可选值有 `PARTIAL`(部分映射)、`FULL`(全映射)和 `NONE`(不自动映射)。 - `...
例如,`settings`元素允许你配置MyBatis的行为,如开启延迟加载(lazyLoadingEnabled)、自动映射级别(autoMappingBehavior)等。此外,还可以通过`typeAliases`定义类型别名,简化Java类的引用。`mappers`元素则...
2. `lazyLoadingEnabled`:这是一个关于延迟加载(懒加载)的开关。默认情况下,它设为 `true`,意味着当需要关联的对象时,MyBatis 将在实际访问时才加载。若设置为 `false`,则关联的对象会在查询时立即加载,也...