mybatis之一对一映射查询(十)

来源:互联网 发布:各种域名区别 编辑:程序博客网 时间:2024/05/29 15:15

需求:查询订单信息并关联查询用户信息

项目目录结构

首先分析需求
查询订单信息,关联查询用户信息,所以我们可以发现主信息为orders,从信息为user

sql语句为:

SELECT   orders.*,  user.username,  user.sex ,  user.addressFROM  orders   LEFT JOIN  USER  ON  orders.user_id = user.id

由于查询出来的信息中包含了orders中的所有信息,还包含了user中的sex、username、address信息,单独一个orders或者user类是接收不了这么多信息的,所以应该建立一个大的实体类来接收这些信息

1.resultType

建立扩展类(数据封装)

package com.test.domain;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;    }}   

为什么这个类要继承Orders而不是继承User,因为根据orders.*,USER.username,USER.sex,USER.address,很明显,要映射的数据是order表中的全部数据以及user

表中的username,sex,address这些数据,直接继承Order类的话就可以少定义一些属性,只要定义username,sex,address就可以了。

新建OrdersMapper.java接口

package com.test.mapper;import java.util.List;import com.test.domain.OrdersExt;public interface OrdersMapper {    List<OrdersExt> findOrdersAndUser();}

新建OrdersMapper.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="com.test.mapper.OrdersMapper">    <select id="findOrdersAndUser" resultType="com.test.domain.OrdersExt">        SELECT           orders.*,          user.username,          user.sex ,          user.address        FROM          orders         LEFT JOIN          USER          ON          orders.user_id = user.id    </select></mapper>

注意不要忘记在SqlMapConfig.xml全局配置文件中配置OrdersMapper.xml

<!-- 加载映射文件 -->    <mappers>        <mapper resource="mapper/UserMapper.xml" />        <mapper resource="mapper/OrdersMapper.xml" />    </mappers>

测试代码

package com.test.test;import java.io.IOException;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 com.test.domain.OrdersExt;import com.test.mapper.OrdersMapper;public class OrdersTest {    SqlSessionFactory sqlSessionFactory = null;    @Before    public void init() throws IOException{        //读取配置文件        //全局配置文件的路径        String resource = "SqlMapConfig.xml";        InputStream inputStream = Resources.getResourceAsStream(resource);        //创建SqlSessionFactory        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);    }    @Test    public void test_01(){        SqlSession sqlSession = sqlSessionFactory.openSession();        OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);        List<OrdersExt> ordersExtList = mapper.findOrdersAndUser();        System.out.println(ordersExtList);    }}

注:使用resultType来进行一对一结果映射,查询出的列的个数和映射的属性的个数要一致。而且映射的属性要存在与一个大的对象中,它是一种平铺式的映射,即数据库查询出多少条记录,则映射成多少个对象。

2.resultMap
  使用resultMap来进行一对一结果映射,它是将关联对象添加到主信息的对象中,具体说是对象嵌套对象的一种映射方式。

修改扩展类

package com.test.domain;public class OrdersExt extends Orders {    private User user;    public User getUser() {        return user;    }    public void setUser(User user) {        this.user = user;    }}   

OrdersMapper.java接口

package com.test.mapper;import java.util.List;import com.test.domain.OrdersExt;public interface OrdersMapper {    List<OrdersExt> findOrdersAndUser();}

OrdersMapper.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="com.test.mapper.OrdersMapper">    <resultMap type="com.test.domain.OrdersExt" id="ordersAndUserResultMap">        <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="user" javaType="com.test.domain.User">            <id column="user_id" property="id"/>            <result column="username" property="username"/>            <result column="sex" property="sex"/>            <result column="address" property="address"/>        </association>    </resultMap>    <select id="findOrdersAndUser" resultMap="ordersAndUserResultMap">        SELECT           orders.*,          user.username,          user.sex ,          user.address        FROM          orders         LEFT JOIN          USER          ON          orders.user_id = user.id    </select></mapper>

测试代码

    @Test    public void test_01(){        SqlSession sqlSession = sqlSessionFactory.openSession();        OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);        List<OrdersExt> ordersExtList = mapper.findOrdersAndUser();        System.out.println(ordersExtList);    }


实现一对一查询:
resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。
如果没有查询结果的特殊要求建议使用resultType。
resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。
resultMap可以实现延迟加载,resultType无法实现延迟加载。

原创粉丝点击