24Mybatis_延迟加载——用association来实现
resultMap可以实现高级映射(使用association、collection实现一对一及一对多映射),association、collection具备延迟加载功能。
需求:
如果查询订单并且关联查询用户信息。如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息。把对用户信息的按需去查询就是延迟加载。
延迟加载:先从单表查询、需要时再从关联表去关联查询,大大提高 数据库性能,因为查询单表要比关联查询多张表速度要快。
接下来我们用assocation来实现延迟加载:
先给出需求:
查询订单并且关联查询用户信息
老规矩:1.sql语句,2.pojo类,3.mapper.xml和mapper.java接口
第一步:
1。我们要实现延时加载,相当于先查订单(orders)的信息,等需要用到user的信息时再去查询User表。
也就是把
<select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">
Select * from orders;
</select>
<select id="finduserByid" parameterType="int" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE ID=#{VALUE}
</select>
上面两条select语句用延迟加载的方式实现。(用resultMap来连接这两条select语句)
第二步:
2.pojo类:
package cn.itcast.mybatis.po; import java.util.Date;
import java.util.List; public class Orders {
private Integer id;
private Integer user_id;
private String number;
private Date createtime;
private String note;
//用户信息,新增了一个User属性,为了保存查询得到的关联的User表的信息(一对一)
private User user; public List<Orderdetail> getOrderdetail() {
return orderdetails;
}
public void setOrderdetail(List<Orderdetail> orderdetail) {
this.orderdetails = orderdetail;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
} }
第三步:
3.编写OrderMapperCustom.xml代码:使用association中的select指定延迟加载去执行的statement的id。
<resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserLazyLoadingResultMap">这句代码的作用就是用来连接上面那两条select语句来实现延迟加载。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- nanmespace:命名空间。 作用就是对sql进行分类话管理,理解Sal分离 注意:使用mapper代理方式,namespace有特殊重要的作用
--> <mapper namespace="cn.itcast.mybatis.mapper.OrdersMapperCustom"> <!-- 延迟加载的resultMap -->
<resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserLazyLoadingResultMap">
<!--对订单信息进行映射配置 --> <resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersUserLazyLoadingResultMap">
<id column="id" property="id"/>
<result column="user_id" property="user_id"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/> <!-- 实现对用户信息进行延迟加载
select:指定延迟加载需要执行的statement的id(是根据user_id查询用户信息的statement)
要使用userMapper.xml中findUserById完成根据用户id(user_id)用户信息的查询,如果findUserById不在本mapper中需要前边加namespace
column:订单信息中关联用户信息查询的列,是user_id
关联查询的sql理解为:
SELECT orders.*,
(SELECT username FROM USER WHERE orders.user_id = user.id)username,
(SELECT sex FROM USER WHERE orders.user_id = user.id)sex
FROM orders
--> <association property="user" javaType="cn.itcast.mybatis.po.User"
select="finduserByid" column="user_id"
>
</association>
</resultMap> <select id="finduserByid" parameterType="int" resultType="cn.itcast.mybatis.po.User">
SELECT * FROM USER WHERE ID=#{VALUE}
</select> <select id="findOrdersUserLazyLoading" resultMap="OrdersUserLazyLoadingResultMap">
Select * from orders;
</select> </mapper>
编写OrdersMapperCustom.java接口:
package cn.itcast.mybatis.mapper; import java.util.List; import cn.itcast.mybatis.po.Orders;
import cn.itcast.mybatis.po.OrdersCustom;
import cn.itcast.mybatis.po.User; public interface OrdersMapperCustom {
//函数的名字OrdersMapperCustom.xml中select中的id名一样 public List<Orders> findOrdersUserLazyLoading();
}
第四步:
不要忘记修改总的配置文件,setting 加上延迟加载的功能
延迟加载配置
mybatis默认没有开启延迟加载,需要在SqlMapConfig.xml中setting配置。
在mybatis核心配置文件中配置:
lazyLoadingEnabled、aggressiveLazyLoading
设置项 |
描述 |
允许值 |
默认值 |
lazyLoadingEnabled |
全局性设置懒加载。如果设为‘false’,则所有相关联的都会被初始化加载。 |
true | false |
false |
aggressiveLazyLoading |
当设置为‘true’的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载。 |
true | false |
true |
aaarticlea/png;base64,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" alt="" />
在SqlMapConfig.xml中代码为:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration> <!-- properties的配置必须写在typeAliases的上面 -->
<properties resource="db.properties"></properties> <!-- 配置懒加载设置 -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings> <!-- 和spring整合后 environments配置将废除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事务管理-->
<transactionManager type="JDBC" />
<!-- 数据库连接池-->
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource> </environment> </environments> <!-- 把映射文件(sqlmap/user.xml)加载进sqlMapConfig.xml-->
<mappers> <!-- 把mapper.xml加载进sqlMapConfig.xml-->
<!--
遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致
且在一个目录中。
当着这个规范的前提是:使用mapper代理方法。 -->
<mapper class="cn.itcast.mybatis.mapper.OrdersMapperCustom"/> </mappers> </configuration>
第五步:
编写测试代码:
测试思路:
1、执行上边mapper方法(findOrdersUserLazyLoading),内部去调用cn.itcast.mybatis.mapper.OrdersMapperCustom中的findOrdersUserLazyLoading只查询orders信息(单表)。
2、在程序中去遍历上一步骤查询出的List<Orders>,当我们调用Orders中的getUser方法时,开始进行延迟加载。
3、延迟加载,去调用UserMapper.xml中findUserbyId这个方法获取用户信息。
测试代码Mybatis_mappertest.java如下:
package cn.itcast.mybatis.test; import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test; import cn.itcast.mybatis.mapper.OrdersMapperCustom;
import cn.itcast.mybatis.mapper.userMapper;
import cn.itcast.mybatis.po.Orders;
import cn.itcast.mybatis.po.User;
import cn.itcast.mybatis.po.UserCustom;
import cn.itcast.mybatis.po.UserQueryVo; public class Mybatis_mappertest { private SqlSessionFactory sqlSessionFactory;
@Before
public void setup() throws IOException
{ String resource="SqlMapConfig.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
//主要是生成SqlsessionFactory。
this.sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testMaper()
{
SqlSession sqlSession=null; sqlSession=sqlSessionFactory.openSession();
//生成代理类
OrdersMapperCustom orderMapper=sqlSession.getMapper(OrdersMapperCustom.class);
//创建包装对象,设置查询条件
//orderMapper.findOrdersUser(); @SuppressWarnings("unused") List<Orders> list=orderMapper.findOrdersUserLazyLoading();
for(Orders orders:list) {//只有执行了这一步才会执行延迟加载。
User user=orders.getUser();
System.out.println(user); } } }
运行结果如下:
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@30647e13]
DEBUG [main] - ==> Preparing: Select * from orders;
DEBUG [main] - ==> Parameters:
DEBUG [main] - <== Total: 3
DEBUG [main] - ==> Preparing: SELECT * FROM USER WHERE ID=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
cn.itcast.mybatis.po.User@1ff90029
我们看一下上面的结果:第一条sql语句:Select * from orders;
然后才会有:SELECT * FROM USER WHERE ID=?
实现了延迟加载、
24Mybatis_延迟加载——用association来实现的更多相关文章
- mybatis0206 延迟加载
延迟加载 1.1使用延迟加载意义 在进行数据查询时,为了提高数据库查询性能,尽量使用单表查询,因为单表查询比多表关联查询速度要快. 如果查询单表就可以满足需求,一开始先查询单表,当需要关联信息时,再关 ...
- MyBatis从入门到放弃六:延迟加载、一级缓存、二级缓存
前言 使用ORM框架我们更多的是使用其查询功能,那么查询海量数据则又离不开性能,那么这篇中我们就看下mybatis高级应用之延迟加载.一级缓存.二级缓存.使用时需要注意延迟加载必须使用resultMa ...
- 【转】使用Mybatis时遇到的延迟加载造成返回异常的问题——HttpMessageConversionException: Type definition error
在使用Mybatis的过程中,使用了resultMap延迟加载. 延迟加载:association联表查询的过程中,查询另外两个表的对象.而延迟加载是指只有在使用这两个对象的时候才会进行查询. 问题的 ...
- Mybatis中使用association进行关联的几种方式
这里以一对一单向关联为例.对使用或不使用association的配置进行举例. 实体类: @Data @ToString @NoArgsConstructor public class IdCard ...
- 在mybatis框架中,延迟加载与连表查询的差异
1.引子 mybatis的延迟加载,主要应用于一个实体类中有复杂数据类型的属性,包括一对一和一对多的关系(在xml中用collection.association标签标识).这个种属性往往还对应着另一 ...
- Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?
Mybatis 仅支持 association 关联对象和 collection 关联集合对象的延迟加载,association 指的就是一对一,collection 指的就是一对多查询.在 Myba ...
- MyBatis简单实例
---直接贴代码 (1)User.Java package me.gacl.domain; /** * @author gacl * users表所对应的实体类 */ public class Use ...
- Mybatis知识点总结
---恢复内容开始--- Mybatis知识点总结 1.#{}和${}的区别是什么? 答:#{}的使用场景:在表的sql映射文件中如下使用: <mapper namespace="co ...
- Mybatis面试整理
#{}和${}的区别 #{}是预编译处理,${}是字符串替换. Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值: Mybatis ...
随机推荐
- 在ALV中更新数据库表
FORM usercommand USING ucomm TYPE sy-ucomm selfield TYPE slis_selfield. DATA: lr_grid TYPE REF TO cl ...
- Microsoft Dynamics CRM 2013 --针对特定实体,取消保存功能(包含自动保存)
AutoSave 是 Microsoft Dynamics CRM 2013 一个新特性. 但AutoSave的有效范围是[所有实体],不允许针对特定某一实体进行设置. 所以,若想针对特定实体进行设置 ...
- SharePoint中Event Handler的触发
一直以来对于Event Handler的感觉就是:添加.编辑和删除动作之前和动作之后,我们在SharePoint系统中可以做的一些事情 不过在最近处理的一个问题中,发现它在触发时机上出了一点问题 ...
- Android——五大布局
Android的五大布局分为: 线性布局 相对布局 帧布局 绝对布局 表格布局 一.线性布局 线性布局在开发中使用最多,具有垂直方向与水平方向的布局方式 通过设置属性"android:ori ...
- storyBoard配置错误导致崩溃 superview]: unrecognized selector...
控制台打印崩溃原因 [TaskStartVC superview]: unrecognized selector sent to instance RT TaskStartVC是一个同storyBoa ...
- setSupportActionBar(toolbar)导致程序崩溃闪退
最近在做一个项目,使用了第三方的开源项目,主要是想实现android5.0之后推出的MaterialDesign的风格,但是代码已经写好了,发现一运行就闪退,所以就开始debug,发现问题出现在 To ...
- Extjs 控件属性(部分)
Ext.form.TimeField: 配置项: maxValue:列表中允许的最大时间 maxText:当时间大于最大值时的错误提示信息 minValue:列表中允许的最小时间 minText:当时 ...
- UVa 107 - The Cat in the Hat (找规律,注意精度)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
- apt-get
更新版本: apt-get --reinstall install apache2 卸载: apt-get remove apache2 只删除软件包 apt-get autorem ...
- linux 2>&1
2>&1就是用来将标准错误2重定向到标准输出1中的.此处1前面的&就是为了让bash将1解释成标准输出而不是文件1.至于最后一个&,则是让bash在后台执行 例如:/us ...