1 关联查询映射
1.1 分析数据模型
思路 :每张表记录的数据内容
每张表重要的字段(主键,外键,非空字段)
表与表之间的关系(外键关系)
表与表之间的业务关系(建立在某个业务意义基础上去分析)
如图:
1.2 一对一查询
有三种实现方法:
resultType
resultMap中的association嵌套查询
resultMap中的嵌套结果
需求:
进行订单查询,包括用户的姓名和地址信息
SQL语句:
SELECT
orders.id,orders.user_id,orders.number,orders.createtime,orders.note,user.username,user.address
FROM
orders, user
WHERE
orders.user_id = user.id;
方法一:resultType
复杂查询时,单表对应的domain类已不能满足输出结果集的映射。
所以要根据需求建立一个扩展类来作为resultType的类型。
创建domain类(OrdersExt.java):package cn.mybatis.mapper.domain;
/**
* 使用此类来映射订单和用户的查询结果,此类继承订单,所以是扩展的
* @author 刘泽栋
* @date 2015年6月21日 下午10:08:57
*/
public class OrdersExt extends Orders {
/**
* 添加用户的属性
*/
private String username;
private String sex;
private String address;
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;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
编写mapper接口(OrdersMapper.java)
public interface OrdersMapper {
// 进行订单查询,包括用户的姓名和地址信息
public List findOrders();
}
编写映射文件(OrdersMapper.xml)<?xml version="1.0" encoding="UTF-8" ?>
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
orders.id,
orders.user_id,
orders.number,
orders.createtime,
orders.note
user.username,
user.address
SELECT
,
FROM orders, user
WHERE orders.user_id = user.id
加载配置文件(sqlMapConfig.xml)
编写测试代码(OrdersMapperTest.java)package cn.mybatis.mapper.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 cn.mybatis.mapper.domain.OrdersExt;
/**
* 测试mybatis的关联映射
* @author 刘泽栋
* @date 2015年6月21日 下午10:57:23
*/
public class OrdersMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
String resource = "sqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
/**
* 测试,进行订单查询,包括用户的姓名和地址信息
*/
@Test
public void testFindOrders() {
SqlSession sqlSession = sqlSessionFactory.openSession();
OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
// 测试
List list = ordersMapper.findOrders();
System.out.println(list);
sqlSession.close();
}
}
方法二:resultMap的association嵌套查询
修改SQL:
SELECT orders.id,orders.user_id,orders.number,orders.createtime,orders.note FROM orders;
修改domain类(OrdersExt.java):package cn.mybatis.mapper.domain;
/**
* 使用此类来映射订单和用户的查询结果,此类继承订单,所以是扩展的
* @author 刘泽栋
* @date 2015年6月21日 下午10:08:57
*/
public class OrdersExt extends Orders {
/**
* 添加用户的属性
*/
private String username;
private String sex;
private String address;
// 用户信息
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
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;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "OrdersExt [username=" + username + ", sex=" + sex
+ ", address=" + address + "]";
}
}
编写mapper接口(OrdersMapper.java):// 进行订单查询,包括用户的姓名和地址信息(resultMap的嵌套查询)
public List findOrdersResultMapOfSelect();
编写映射文件(OrdersMapper.xml)
SELECT
FROM orders
加载配置文件(sqlMapConfig.xml)
编写测试代码(OrdersMapperTest.java)
/**
* 进行订单查询,包括用户的姓名和地址信息(resultMap的嵌套查询)
*/
@Test
public void testFindOrdersResultMapOfSelect() {
SqlSession sqlSession = sqlSessionFactory.openSession();
OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
// 测试
List list = ordersMapper.findOrdersResultMapOfSelect();
System.out.println(list);
sqlSession.close();
}
方法三:resultMap的association嵌套结果
SQL语句:
SELECT
orders.id,orders.user_id,orders.number,orders.createtime,orders.note,user.username,user.address
FROM
orders, user
WHERE
orders.user_id = user.id;
编写mapper接口(OrdersMapper.java):// 进行订单信息查询,包括用户的名称和地址信息(resultMap之嵌套结果)
public List findOrdersResultMap();
编写映射文件(OrdersMapper.xml)
SELECT
,
FROM orders, user
WHERE orders.user_id = user.id
加载配置文件(sqlMapConfig.xml)
编写测试代码(OrdersMapperTest.java)
/**
* 进行订单信息查询,包括用户的名称和地址信息(resultMap之嵌套结果)
*/
@Test
public void testFindOrdersResultMap() {
SqlSession sqlSession = sqlSessionFactory.openSession();
OrdersMapper ordersMapper = sqlSession.getMapper(OrdersMapper.class);
// 测试
List list = ordersMapper.findOrdersResultMap();
System.out.println(list);
sqlSession.close();
}