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=?

实现了延迟加载

不使用mybatis提供的association及collection中的延迟加载功能,如何实现延迟加载??

实现方法如下:

定义两个mapper方法:

1、查询订单列表

2、根据用户id查询用户信息

实现思路:

先去查询第一个mapper方法,获取订单信息列表

在程序中(service),按需去调用第二个mapper方法去查询用户信息。

总之:

使用延迟加载方法,先去查询简单的sql(最好单表,也可以关联查询),再去按需要加载关联查询的其它信息。

延迟加载-association来实现的更多相关文章

  1. 七 mybatis的延迟加载

    1       延迟加载 1.1     什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.coll ...

  2. mybatis延迟加载——(十二)

    1.     什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能 ...

  3. mybatis学习记录七——延迟加载

    14       延迟加载 14.1     什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.co ...

  4. 07_mybatis延迟加载

    1. 延迟加载 ​ resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能. 需求: ...

  5. mybatis系列-14-延迟加载

    14.1     什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载 ...

  6. 框架应用:Mybatis (一) - 入门案例

    ORM框架 在实际开发中,工程中本质的任务是从数据库中获取数据,然后对数据进行操作,又或者写入数据.开发时语言是大多是面向对象的工程语言,这个时候就必须进行工程语言和数据库连接语言的转换,也就是所谓的 ...

  7. 笔记:MyBatis Mapper XML文件详解 - Result Maps

    Result Maps(结果集) resultMap 元素是 MyBatis 中最重要最强大的元素.它就是让你远离 90%的需要从结果 集中取出数据的 JDBC 代码的那个东西, 而且在一些情形下允许 ...

  8. Mybatis学习笔记三

    一.延迟加载 延迟加载即加载延迟了,并不是一次性加载完而是按需加载,感觉应该是针对多表查询而言的,即先查询单表等需要另一张表的信息时再去加载,这样能提高数据库的性能: 需要注意的是,mybatis提供 ...

  9. SSH和SSM的区别

    一怒成仙 博客园 首页 新随笔 联系 管理 订阅 随笔- 54  文章- 1  评论- 0    SSH(Struts,Spring,Hibernate)和SSM(SpringMVC,Spring,M ...

随机推荐

  1. java swing MenuItem乱码处理

    用java开发一个带有托盘图标的程序, 其它模块的中文显示都是正常的,就只有托盘中点击小图标时弹出的菜单中的中文是方框(中文方块) 解决: 1: 在你的具有main函数的类也即你应用运行的主类上点击右 ...

  2. fabric-ca-server

    fabric-ca-server start -b admin:adminpw -d --db.type mysql --db.datasource "root:rootpwd@tcp(17 ...

  3. [Android Pro] 开发一流的 Android SDK:Fabric SDK 的创建经验

    cp from : https://academy.realm.io/cn/posts/oredev-ty-smith-building-android-sdks-fabric/ Ty Smith T ...

  4. C#与Java的语法差异

    C#与Java的语法差异C与Java的语法差异前言程序结构基本语法数据类型字符串变量与常量运算符判断语句循环语句访问权限方法数组结构枚举类继承多态运算符重载接口命名空间预处理器指令正则表达式异常IO泛 ...

  5. 直方图与bin

    1.bin的含义 直方图中bin的含义:计算颜色直方图需要将颜色空间划分为若干小的颜色区间,即直方图的bin,通过计算颜色在每个小区间内德像素得到颜色直方图,bin越多,直方图对颜色的分辨率越强,但增 ...

  6. Caffe的solver参数介绍

      版权声明:转载请注明出处,谢谢! https://blog.csdn.net/Quincuntial/article/details/59109447 1. Parameters solver.p ...

  7. State of Serverless

    Some quick thoughts from Serverlessconf, Austin in April 2017 I wanted to take a bit of time to writ ...

  8. CSS 强制换行和禁止换行强制换行 和禁止换行样式

    强制换行 1.word-break: break-all;       只对英文起作用,以字母作为换行依据. 2.word-wrap: break-word;   只对英文起作用,以单词作为换行依据. ...

  9. 下载Sourceforge等国内无法下载站点文件的另一种方法

    Sourceforge是一些开源软件经常用到的网站,然而国内的网站一直不稳定,如今是可以访问,但是一直无法下载,今天发现了一种新方法那就是http://www.mirrorservice.org 这个 ...

  10. 再看copy_on_write缩小临界区的例子

    本例子是模拟的读者写者问题,采用shared_ptr+写时拷贝实现,其中我觉得一个比较值得注意的地方是考虑到对象可能在临界区析构而将析构移除临界区,这对于多线程来说要多看多思. #include< ...