一、高级映射

-------一对一

这里以订单查询为例,其中有一个外键为user_id,通过这个关联用户表。这里要实现的功能是这个两个表关联查询,得到订单的信息和部分user的信息。order表结构如下图:

1.这里先介绍一对一的关联查询。原始的order.java不能映射全部字段,需要新创建pojo。所以创建一个OrderCustom的pojo。

package entity;

public class OrderCustom extends Order{
private String username;
private String sex;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
} }

2.后面就是按步骤创建OrderMaper和其对应的配置文件

因为此处在sqlmapConfig中打算使用批量类加载的方式,所以要把maper类和对应的配置文件放在同一个包中

OrderCustomerMapper .java的代码如下:

package mapper;

import java.util.List;

import entity.Order;
import entity.OrderCustom; public interface OrderCustomerMapper {
public List<OrderCustom> findOrder() throws Exception; }

OrderCustomerMapper .xml

<?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"> <!--mapper代理开发,namespace要与mapper接口的全名地址一样--> <mapper namespace="mapper.OrderCustomerMapper">
<resultMap id="orderResultMap" type="entity.Order"> <select id="findOrder" resultType="OrderCustom">
SELECT o.*,u.username,u.sex from users u,orders o
WHERE u.id=o.user_id
</select> </mapper>

以上都做好了后可以用Junit测试了:

测试代码

package mapper;

import java.io.InputStream;
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 entity.Order;
import entity.OrderCustom; public class OrderTest {
private SqlSessionFactory sqlSessionFactory; @Before
public void setUp() throws Exception {
String resource="SqlMapConfig.xml";
InputStream stream=Resources.getResourceAsStream(resource);
sqlSessionFactory=new SqlSessionFactoryBuilder().build(stream);
} @Test
public void testFindOrder() throws Exception {
SqlSession sqlSession=sqlSessionFactory.openSession();
OrderCustomerMapper ordermapper=sqlSession.getMapper(OrderCustomerMapper.class);
List<OrderCustom> orderCustom=ordermapper.findOrder();
sqlSession.close(); } } }

以上是用的resultType方式返回的结果集,其实还有resultMap的方式返回结果集。下面介绍如何使用resultMap来实现。

1.resultMap是不需要再创建一个OrderCustom的pojo的,只需要在Order类中加一个User类定义的user属性即可,并加上这个属性的get set方法。

然后在OrderCustomerMapper .xml中添加resultMap标签映射,添加后的OrderCustomerMapper .xml如下:

<?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"> <!--mapper代理开发,namespace要与mapper接口的全名地址一样--> <mapper namespace="mapper.OrderCustomerMapper">
<resultMap id="orderResultMap" type="entity.Order">
<!-- 配置映射的订单信息 -->
<id column="id" property="id"/>
<result column="user_id" property="user_id"/>
<result column="createTime" property="createTime"/>
<result column="note" property="note"/>
<!-- 配置映射的关联用户信息 --> <!-- 关联查询出的一个对象 --> <!-- property:将关联查询的用户信息映射到哪个属性中去 -->
<association property="user" javaType="entity.users">
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/> </association> </resultMap> <select id="findOrder" resultType="OrderCustom">
SELECT o.*,u.username,u.sex from users u,orders o
WHERE u.id=o.user_id
</select>
<select id="findOrderResultMap" resultMap="orderResultMap">
SELECT o.*,u.username,u.sex from users u,orders o
WHERE u.id=o.user_id
</select> </mapper>

2.在OrderCustomerMapper 中添加一个接口来测试这个用resultMap

public List<Order> findOrderResultMap() throws Exception;

3.测试

@Test
public void testFindOrderResltMap() throws Exception {
SqlSession sqlSession=sqlSessionFactory.openSession();
OrderCustomerMapper ordermapper=sqlSession.getMapper(OrderCustomerMapper.class);
List<Order> orderCustom=ordermapper.findOrderResultMap();
sqlSession.close(); }

以上就介绍完了两种方式的一对一查询关联的使用,可以看出resultType的方式使用起来更简单,一般使用这个。当有某种特殊的需求不得不使用resultMap时才用这个。

一对多的查询:

查询订单及订单明细的方法。

1.在mapper.xml中添加:

<select id="findOrderAndDetail"  resultMap="orderAndItemDetail">
SELECT o.*,u.username,u.sex,od.id as odrderdetai_id,od.item_id,od.order_id from users u,orders o,orderdetail od
WHERE u.id=o.user_id AND o.id=od.order_id
</select>

<resultMap id="orderAndItemDetail" type="entity.Order" extends="orderResultMap">

    <!-- 因为一个订单对应多个订单详细,所以使用collection -->
<collection property="orderDetail" ofType="entity.OrderDetail">
<id column="odrderdetai_id" property="id"/>
<result column="order_id" property="order_id"/>
<result column="item_id" property="item_id"/>
</collection> </resultMap>

2.在mapper.java接口中添加方法:

public List<Order> findOrderAndDetail() throws Exception;

3.测试

@Test
public void testFindOrderAndDetail() throws Exception {
SqlSession sqlSession=sqlSessionFactory.openSession();
OrderCustomerMapper ordermapper=sqlSession.getMapper(OrderCustomerMapper.class);
List<Order> orderCustom=ordermapper.findOrderAndDetail();
sqlSession.close(); }

多对多的查询:

多对多的映射方式与一对多的映射方式基本相同,它是一对多的一种情况。例如一个用户和商品类型就是多对多的,一个用户可以买多种商品,一个商品可以被多个用户购买。在User类中创建一个属性orderList<Order>,Oder表中加一个

orderDetailList<OrderItem>属性,OrderItem表中增加一个属性item,这是类间的关系。那么使用ResultMap的时候,要在collection中再套着collection。

二、延迟加载

1.什么是延迟加载

resultMap中的association和collection具有延迟加载的属性

先从单标查询,需要时再从关联表中查询,

2.使用association实现延迟加载

1)mapper.xml中需要两个statement:

a只查询订单信息:  select * from orders  在查询订单的statement中使用association去延迟加载下面的statement

在association中有select和column连个属性。

select:指定需要延迟加载的statement的ID(根据user_id查询user的statement),如果要找的statement不在本mapper中,需要在前面加上namespace

column:订单信息中关联用户信息查询的列,是user_id。

b关联查询用户信息:通过以上查询到的user_id去关联查询用户信息

3.延迟加载配置

mybatis默认是关闭延迟加载的,需要在SqlMapConfig.xml中setting中配置

<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLasyLoading" value="false">
</settings>

高级映射,查询缓存和与spring整合的更多相关文章

  1. MyBatis高级映射查询(3)

    一.数据库数据和项目搭建过程 1.主要要四张表,分别为user用户信息表.items商品表.orderdetail订单明细表.orders订单表.表的结构和数据如下: 表结构 CREATE DATAB ...

  2. 以Spring整合EhCache为例从根本上了解Spring缓存这件事(转)

    前两节"Spring缓存抽象"和"基于注解驱动的缓存"是为了更加清晰的了解Spring缓存机制,整合任何一个缓存实现或者叫缓存供应商都应该了解并清楚前两节,如果 ...

  3. hessian的简单使用以及与spring整合

    Hessian是一个由Caucho Technology开发的轻量级二进制RPC协议.和其他Web服务的实现框架不同的是,Hessian是一个使用二进制格式传输的Web服务协议的框架,相对传统soap ...

  4. mybatis 高级映射和spring整合之查询缓存(5)

    mybatis 高级映射和spring整合之查询缓存(5) 2.0 查询缓存 2.0.1 什么是查询缓存 mybatis提供缓存,用于减轻数据压力,提高数据库性能. mybatis提供一级缓存和二级缓 ...

  5. mybatis 高级映射和spring整合之高级映射(4)

    mybatis 高级映射和spring整合之高级映射 ----------------学习结构-------------------- 0.0 对订单商品数据模型进行分析 1.0 高级映射 1.1 一 ...

  6. 零基础学习java------37---------mybatis的高级映射(单表查询,多表(一对一,一对多)),逆向工程,Spring(IOC,DI,创建对象,AOP)

    一.  mybatis的高级映射 1  单表,字段不一致 resultType输出映射: 要求查询的字段名(数据库中表格的字段)和对应的java类型的属性名一致,数据可以完成封装映射 如果字段和jav ...

  7. mybatis 高级映射和spring整合之逆向工程(7)

    mybatis 高级映射和spring整合之逆向工程(7) 4.0 逆向工程 4.1 mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表自动生成mybatis执行 ...

  8. mybatis 高级映射和spring整合之与Spring整合(6)

    mybatis 高级映射和spring整合之mybatis与Spring整合 3.0 mybatis和spring整合(掌握) 3.1 整合思路 需求spring通过单例方式管理SqlSessionF ...

  9. Spring+SpringMVC+MyBatis深入学习及搭建(八)——MyBatis查询缓存

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6956206.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(七)——My ...

随机推荐

  1. input的文件上传图片

    <img id="headIMG" src="img/header_default.jpg"/> <input type="file ...

  2. Chrome浏览器扩展开发系列之五:Page Action类型的Chrome浏览器扩展

    Page Action类型的Google Chrome浏览器扩展程序,通常也会有一个图标,但这个图标位于Chrome浏览器的地址栏内右端.而且这个图标并非始终出现,而是当某指定的页面打开时才会出现.也 ...

  3. JAXP Dom 案例 对xml文件进行增加 查找 删除

    利用 JAXP 对 XML文件 的处理,把xml当做一个数据库来对待

  4. sqlserver 处理百万级以上的数据处理与优化

    一处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应 ...

  5. 深入浅析JavaScript中的constructor

    constructor 属性返回对创建此对象的数组函数的引用.本文给大家介绍JavaScript中的constructor ,需要的朋友参考下吧 定义和用法 constructor 属性返回对创建此对 ...

  6. 使用软件开发的部分思想,帮助HR处理Excel。

    前言 上周末,XX给我抱怨:因为计算绩效奖金,把2个人的工资发错了,还被扣了500元.问的缘由得知,她每个月要处理十来个excel表格,每次都要手动修改里面的值,如果修改了一处,其他地方也要修改,然后 ...

  7. JQuery学习笔记——层级选择器

    JQuery学习笔记--层级选择器 上一篇学习了基础的五种选择,分别是id选择器,class选择器,element选择器,*选择器 和 并列选择器.根据手册大纲,这篇学习的是层级选择器. 选择器: 1 ...

  8. pug模板引擎(原jade)

    前面的话 为什么要引入pug,pug有什么特别之处呢?有一些嵌套层次较深的页面,可能会出现巢状嵌套,如下图所示 在后期维护和修改时,一不小心少了一个尖括号,或者某个标签的开始和闭合没有对应上,就会导致 ...

  9. join和wait

    最近看多线程的时候发现对于join的理解有些错误,在网上查了不少资料,根据自己的理解整理了一下,这里之所以把join和wait放在一起,是因为join的底层实现就是基于wait的,一并讲解更容易理解. ...

  10. 【.net 深呼吸】自己动手来写应用程序设置类

    在开始装逼之前,老周先说明一件事.有人说老周写的东西太简单了,能不能写点复杂点.这问题就来了,要写什么东西才叫“复杂”?最重要的是,写得太复杂了,一方面很多朋友看不懂,另一方面,连老周自己也不知道怎么 ...