SSM框架学习之(四)Mybatis——高级映射(多表查询)
使用resultType查询
需求:查询订单表和用户表的信息
对应sql语句:
SELECT
orders.*,
USER.username,
USER.sex,
USER.address
FROM
orders,
USER
WHERE orders.user_id = user.id
使用resultType进行查询,先创建一个对应pojo包装类:
//继承自订单类用于订单类的全部属性,并添加了部分用户属性
public class OrderCustom extends Orders{
private String username;
private String sex;
private String address;
编写相应的mapper接口文件:
public interface OrderMapperCustom {
//使用resultType方式查询订单用户信息,返回OrderCustom对象集合,
//OrderCustom继承自Orders并添加了用户信息对应的字段
List<OrderCustom> findOrderUser() throws Exception;
}
然后编写对应的映射文件:
<mapper namespace="cn.allene.mybatis.threed.mapper.OrderMapperCustom">
<!-- 使用pojo包装类方式 使用resultType查询订单用户信息 -->
<select id="findOrderUser" resultType="cn.allene.mybatis.threed.po.OrderCustom">
SELECT
orders.*,
USER.username,
USER.sex,
USER.address
FROM
orders,
USER
WHERE orders.user_id = user.id
</select>
</mapper>
别忘了在在mybatis配置文件的sqlmapperconfig文件中添加映射文件:
<!--这里采用package标签扫描的方式加载映射文件,会自动扫描相对应的包下所有的映射文件-->
<mappers>
<package name="cn.allene.mybatis.threed.mapper"/>
</mappers>
最后编写测试文件:创建sqlSessionFactory工厂方法就不给出了
@Test
public void testFindOrderUser() throws Exception {
SqlSession session = sqlSessionFactory.openSession();
OrderMapperCustom mapper = session.getMapper(OrderMapperCustom.class);
List<OrderCustom> list = mapper.findOrderUser();
System.out.println(list);
session.close();
}
使用resultMap查询
对应的需求和上面的不变,所以sql语句也不变
首先得在Orders对象中添加User对象:
//这是一对一的查询就添加单个对象,如果是一对多就是添加一个集合
public class Orders {
private Integer id;
private Integer userId;
private String number;
private Date createtime;
private String note;
private User user;
编写mapper接口文件:
public interface OrderMapperCustom {
//使用resultType方式查询订单用户信息,返回OrderCustom对象集合,
//OrderCustom继承自Orders并添加了用户信息对应的字段
List<OrderCustom> findOrderUser() throws Exception;
//使用resultMap方式查询订品用户信息,返回Orders对象集合,Orders对象里添加了User对象信息
List<Orders> findOrderUserResultMap() throws Exception;
}
然后编写相对应的mapper映射文件:
<!-- 使用resultmap方式查询订单用户信息 -->
<!--所有id是指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个id-->
<select id="findOrderUserResultMap" resultMap="OrderUserResultMap">
SELECT
orders.*,
USER.username,
USER.sex,
USER.address
FROM
orders,
USER
WHERE orders.user_id = user.id
</select>
<resultMap type="cn.allene.mybatis.threed.po.Orders" id="OrderUserResultMap">
<id column="id" property="id"/>
<result column="userId" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
<!--一对一使用association标签,javaType使用对应的实体类路径-->
<!--一对多使用使用collection标签,javaType使用集合里面对应的实体类路径-->
<association property="user" javaType="cn.allene.mybatis.threed.po.User">
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
</association>
</resultMap>
由于添加映射文件使用的是扫描的方式,所以不用添加
最后测试:
@Test
public void testFindOrderUserResultMap() throws Exception{
SqlSession session = sqlSessionFactory.openSession();
OrderMapperCustom mapper = session.getMapper(OrderMapperCustom.class);
List<Orders> list = mapper.findOrderUserResultMap();
System.out.println(list);
session.close();
}
resultType和resultMap实现查询对比
resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。如果没有查询结果的特殊要求建议使用resultType。
resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。
resultMap可以实现延迟加载,resultType无法实现延迟加载。