1.一對一查詢
需求:查詢訂單信息谴供,關(guān)聯(lián)查詢創(chuàng)建訂單的用戶信息能扒。
1)resultType實現(xiàn)
- sql語句
確定主查詢表:訂單表
確定查詢的關(guān)聯(lián)表:用戶表
關(guān)聯(lián)查詢使用內(nèi)鏈接還是外鏈接
SELECT orders.* ,user.username,user.sex,user.address
FROM orders,user
WHERE orders.user_id=user.id
- 將各個數(shù)據(jù)表寫成類
- pojo
將上面查詢的結(jié)果集映射到pojo中佣渴,pojo中必須包括所有的查詢。
在pojo下新建一個OrderCustom類初斑。
package com.chinglee.mybatis.pojo;
/**
* 訂單的擴(kuò)展類
* 通過此類映射訂單和用戶的結(jié)果辛润,讓此類繼承包括字段較多的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進(jìn)行分類化管理,理解sql隔離
注:使用mapper代理方法開發(fā)鹃答,namespace有特殊作用
-->
<mapper namespace="com.chinglee.mybatis.mapper.OrderCustomMapper">
<!--查詢訂單關(guān)聯(lián)查詢用戶信息-->
<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 {
//查詢訂單關(guān)聯(lián)查詢用戶信息
public List<OrderCustom> findOrdersUser() throws Exception;
}
- 沒有配置批量加載乎澄,需要到SqlMapConfig配置
<!--加載映射文件-->
<mappers>
<mapper resource="sqlmap/User.xml"/>
<!--<mapper resource="mapper/UserMapper.xml"/>-->
<!--通過mapper接口加載
遵循一些規(guī)范:需要將mapper接口類名和mapper.xml映射文件名稱保持一致,且在一個目錄中
前提:使用mapper代理的方法
-->
<!--
<mapper class="com.chinglee.mybatis.mapper.UserMapper"/>
-->
<!--批量加載mapper
指定mapper接口的包名测摔,mybatis自動掃描包下面所有mapper接口進(jìn)行加載
遵循一些規(guī)范:需要將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();
//創(chuàng)建代理對象
OrderCustomMapper orderCustomMapper= sqlSession.getMapper(OrderCustomMapper.class);
//調(diào)用mapper的方法
List<OrderCustom> list =orderCustomMapper.findOrdersUser();
System.out.println(list);
sqlSession.close();
}
2)resultMap實現(xiàn)
- sql語句
同resultType實現(xiàn)的sql - 使用resultMap映射的思路
使用resultMap將查詢結(jié)果中的訂單信息映射到Orders對象中,在Orders類中添加User屬性锋八,將關(guān)聯(lián)查詢出來的用戶信息映射到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
<!--訂單關(guān)聯(lián)查詢用戶的resultMap-->
<resultMap id="OrdersUserResultMap" type="com.chinglee.mybatis.pojo.Orders">
<!-- 配置映射的訂單信息-->
<!--指定查詢列中的唯一標(biāo)識,訂單信息中的唯一標(biāo)識挟纱,如果有多個列組成唯一標(biāo)識路媚,配置多個id
column:訂單信息的唯一標(biāo)識列
property:訂單信息的唯一標(biāo)識列所映射到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"/>
<!--配置映射關(guān)聯(lián)的用戶信息-->
<!-- association:用于映射關(guān)聯(lián)查詢對象的信息
property:要將關(guān)聯(lián)查詢的用戶信息映射到Orders中的那個屬性
-->
<association property="user" javaType="com.chinglee.mybatis.pojo.User">
<!-- id:關(guān)聯(lián)查詢用戶的唯一標(biāo)識
唯一標(biāo)識用戶信息的列
-->
<id column="user_id" javaType="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
</association>
</resultMap>
<!--查詢訂單關(guān)聯(lián)查詢用戶信息,使用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();
//創(chuàng)建代理對象
OrderCustomMapper orderCustomMapper= sqlSession.getMapper(OrderCustomMapper.class);
//調(diào)用mapper的方法
List<Order> list =orderCustomMapper.findOrdersUserResultMap();
System.out.println(list);
sqlSession.close();
}
實現(xiàn)一對一的查詢:
resultType:使用resultType較為簡單,如果pojo中沒有包括查詢出來的列明樊销,需要增加列名對應(yīng)的屬性整慎,即可完成映射。
如果沒有查詢結(jié)果的特殊要求建議使用resultType围苫。
resultMap:需要單獨的定義裤园,實現(xiàn)相對麻煩,如果對查詢結(jié)果有特殊的要求使用resultMap可以完成將關(guān)聯(lián)查詢映射到pojo的屬性中剂府。
resultMap可以實現(xiàn)延遲加載拧揽,resultType無法實現(xiàn)延遲加載。