1.一对一查询
需求:查询订单信息,关联查询创建订单的用户信息。
1)resultType实现
- sql语句
确定主查询表:订单表
确定查询的关联表:用户表
关联查询使用内链接还是外链接
SELECT orders.* ,user.username,user.sex,user.address
FROM orders,user
WHERE orders.user_id=user.id
- 将各个数据表写成类
- pojo
将上面查询的结果集映射到pojo中,pojo中必须包括所有的查询。
在pojo下新建一个OrderCustom类。
package com.chinglee.mybatis.pojo;
/**
* 订单的扩展类
* 通过此类映射订单和用户的结果,让此类继承包括字段较多的pojo类
*/
public class OrderCustom extends Orders{
//添加用户的属性
//user.username,user.sex,user.address
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.xml
新建一个OrderCustomMapper.xml,为了在SqlMapConfig中使用批量加载,需要将mapper.xml和mapper.java文件放在同一个文件夹下。
<?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">
<!--namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
注:使用mapper代理方法开发,namespace有特殊作用
-->
<mapper namespace="com.chinglee.mybatis.mapper.OrderCustomMapper">
<!--查询订单关联查询用户信息-->
<select id="findOrdersUser" resultType="com.chinglee.mybatis.pojo.OrderCustom">
SELECT orders.* ,user.username,user.sex,user.address
FROM orders,user
WHERE orders.user_id=user.id
</select>
</mapper>
- OrserCustomMapper.java
package com.chinglee.mybatis.mapper;
import com.chinglee.mybatis.pojo.OrderCustom;
import java.util.List;
/**
* 订单的mapper
*/
public interface OrderCustomMapper {
//查询订单关联查询用户信息
public List<OrderCustom> findOrdersUser() throws Exception;
}
- 没有配置批量加载,需要到SqlMapConfig配置
<!--加载映射文件-->
<mappers>
<mapper resource="sqlmap/User.xml"/>
<!--<mapper resource="mapper/UserMapper.xml"/>-->
<!--通过mapper接口加载
遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中
前提:使用mapper代理的方法
-->
<!--
<mapper class="com.chinglee.mybatis.mapper.UserMapper"/>
-->
<!--批量加载mapper
指定mapper接口的包名,mybatis自动扫描包下面所有mapper接口进行加载
遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录中
前提:使用mapper代理的方法
-->
<package name="com.chinglee.mybatis.mapper"/>
</mappers>
- test方法
public class OrderCustomMapperTest {
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 findOrdersUserTest() throws Exception {
SqlSession sqlSession=sqlSessionFactory.openSession();
//创建代理对象
OrderCustomMapper orderCustomMapper= sqlSession.getMapper(OrderCustomMapper.class);
//调用mapper的方法
List<OrderCustom> list =orderCustomMapper.findOrdersUser();
System.out.println(list);
sqlSession.close();
}
2)resultMap实现
- sql语句
同resultType实现的sql - 使用resultMap映射的思路
使用resultMap将查询结果中的订单信息映射到Orders对象中,在Orders类中添加User属性,将关联查询出来的用户信息映射到orders对象中的user属性中。 - 需要在Orders类中添加user属性
public class Orders {
private int id;
private int userId;
private String number;
private Date createtime;
private String note;
//使用resultMap时添加的user属性
private User user;
- mapper.xml
定义resultMap
<!--订单关联查询用户的resultMap-->
<resultMap id="OrdersUserResultMap" type="com.chinglee.mybatis.pojo.Orders">
<!-- 配置映射的订单信息-->
<!--指定查询列中的唯一标识,订单信息中的唯一标识,如果有多个列组成唯一标识,配置多个id
column:订单信息的唯一标识列
property:订单信息的唯一标识列所映射到Orders中的那个属性
-->
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
<!--配置映射关联的用户信息-->
<!-- association:用于映射关联查询对象的信息
property:要将关联查询的用户信息映射到Orders中的那个属性
-->
<association property="user" javaType="com.chinglee.mybatis.pojo.User">
<!-- id:关联查询用户的唯一标识
唯一标识用户信息的列
-->
<id column="user_id" javaType="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
</association>
</resultMap>
<!--查询订单关联查询用户信息,使用resultMap-->
<select id="findOrdersUser" resultMap="OrdersUserResultMap">
SELECT orders.* ,user.username,user.sex,user.address
FROM orders,user
WHERE orders.user_id=user.id
</select>
- mapper.java
public List<Order> findOrdersUserResultMap() throws Exception;
- test
@Test
public void findOrdersUserResultMapTest() throws Exception {
SqlSession sqlSession=sqlSessionFactory.openSession();
//创建代理对象
OrderCustomMapper orderCustomMapper= sqlSession.getMapper(OrderCustomMapper.class);
//调用mapper的方法
List<Order> list =orderCustomMapper.findOrdersUserResultMap();
System.out.println(list);
sqlSession.close();
}
实现一对一的查询:
resultType:使用resultType较为简单,如果pojo中没有包括查询出来的列明,需要增加列名对应的属性,即可完成映射。
如果没有查询结果的特殊要求建议使用resultType。
resultMap:需要单独的定义,实现相对麻烦,如果对查询结果有特殊的要求使用resultMap可以完成将关联查询映射到pojo的属性中。
resultMap可以实现延迟加载,resultType无法实现延迟加载。