ssm之路(8)一对一,一对多,多对一,多对多查询

1. 一对一查询

查询订单信息,关联查询创建订单的用户信息

确定查询主表:订单表

确定查询关联表:用户表

内连接查询:选择订单。*,`user`.username,`user`.sex,`user`.address 
from orders,user where orders.user_id = user.id

原始POJO不满足我们的需求,故新建一个pojoCustom类继承POJO,来实现关联查询的功能多张表的关联,pojoCustom应该继承包括我们查询字段最多的那个类:

插一段理念中的一个坑:

新建的mapper.xml文件必须要把文件的后缀名加上,即.XML不能省略,最好是新建文件,然后自己加上的.XML后缀,使用建XML的形式建mapper.xml,文件在想法显示为没有后缀,回导致找不到mapper.xml的问题,:

截图对比,错误的命名:

报错如下: 

正确文件命名:

现在放上我的代码:

Orders实体类:
public class Orders {
    private Integer id;

    private String userId;

    private String number;

    private Date createtime;

    private String note;
//省略getter,setter
}

 关联查询的自定义OrdersCustom类,用于映射查询结果:

public class OrdersCustom extends Orders {
    private String name;
    private String sex;
    private String address;
//省略getter,setter
}
OrdersMapperCustom接口:
public interface OrdersMapperCustom {
    public List<OrdersCustom>findOrdersUser()throws Exception;
}

OrdersMapperCustom.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.lmj.ssm.mapper.OrdersMapperCustom" >

    <select id="findOrdersUser" resultType="OrdersCustom">
        select orders.*,`user`.username,`user`.sex,`user`.address
             from orders,user where orders.user_id=user.id
    </select>

</mapper>

测试类:测试:

public class Test {
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession sqlSession=sqlSessionFactory.openSession();

    @org.junit.Test
    public void findOrdersUser() throws Exception {
        OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class);
        //创建包装对象,设置查询条件
        List<OrdersCustom> orderslist=  ordersMapperCustom.findOrdersUser();
        System.out.println(orderslist);
        sqlSession.close();
    }
    public Test() throws IOException {
    }

}

一对一的结果映射的实现:

在OrdersCustom中添加代码:

  private User user;
    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

orderMapperCustom.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.lmj.ssm.mapper.OrdersMapperCustom" >
   
  <!--  一对一的实现-->
    <resultMap id="OrdersPlusUser" type="OrdersCustom">
配置订单列column与订单类的属性的映射关系
        <id column="id" property="id"/> 
        <result column="note" property="note"/>
      <!--  配置与订单一对一关系的User的映射,association 表示它们之间一对一的关系-->
        <association property="user" javaType="User">
          <!--  指定外键所映射的类型-->
            <id column="user_id" property="id"/>
            <result column="sex" property="sex"/>
            <result column="address" property="address"/>

        </association>
    </resultMap>

 <select id="findOrdersPlusUser" resultMap="OrdersPlusUser">
      select orders.*,`user`.username,`user`.sex,`user`.address
from orders,user,orderdetail where orders.user_id=user.id and orderdetail.orders_id=orders_id
    </select>

</mapper>

 接口类OrdersMapperCustom的代码:

public interface OrdersMapperCustom {
    public List<OrdersCustom>findOrdersPlusUser()throws Exception;
}

测试类的主代码:

  public void findOrdersUser() throws Exception {
        OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class);
        //创建包装对象,设置查询条件
        List<OrdersCustom> orderslist=  ordersMapperCustom.findOrdersPlusUser();
        System.out.println(orderslist);
        sqlSession.close();
    }

运行图:

2. 一对多查询:

查询的结果集这里应该用结果映射来作映射(因为有重复的列名)

主查询表:订单表,关联查询表:订单明细表。

先对比一下区别:先执行三表的查询:

select orders.*,`user`.username,`user`.sex,`user`.address 
from orders,user,orderdetail where orders.user_id=user.id and orderdetail.orders_id=orders_id

运行截图:你会发现有重复,但重复的记录并不一样:

 修改语句检验:

select orders.*,`user`.username,`user`.sex,`user`.address,orderdetail.id,orderdetail.items_num
from orders,user,orderdetail where orders.user_id=user.id and orderdetail.orders_id=orders_id

结果如下:

发现有重复的列名,并且有重复的记录数,故在订单类中添加列表<的的OrderDetail>订单明细来解决映射重复的问题,使映射的记录为两条:

处理如下:

在OrdersCustom类中添加集合属性:

public class OrdersCustom extends Orders {
    private String name;
    private String sex;
    private String address;
//一对一的集合user类
    private User user;
//一对多的集合Orderdetail类
    private List<Orderdetail> orderDetails;
省略getter,setter方法
}

ordersmapperCustom.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.lmj.ssm.mapper.OrdersMapperCustom" >
    <!--订单和订单的明细resultMap-->
   <!-- 使用继承extends,不用再配订单信息和用户信息的映射-->
  <!--  一对一的实现-->
    <resultMap id="OrdersPlusUser" type="OrdersCustom">
        <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="User">
          <!--  指定外键所映射的类型-->
            <id column="user_id" property="id"/>
            <result column="sex" property="sex"/>
            <result column="address" property="address"/>
        </association>
        <collection property="orderDetails" ofType="Orderdetail">
               <id column="orderdetail_id" property="id"/>
            <result column="items_num" property="itemsNum"/>
            <result column="items_id" property="itemsId"/>

        </collection>
    </resultMap>


    <select id="findOrdersPlusUser" resultMap="OrdersPlusUser">
    select orders.*,`user`.username,`user`.sex,`user`.address,orderdetail.id orderdetail_id,orderdetail.items_id,orderdetail.items_num
from orders,user,orderdetail where orders.user_id=user.id and orderdetail.orders_id=orders.id
    </select>

</mapper>

编写OrdersMapperCustom接口:

public interface OrdersMapperCustom {

    public List<OrdersCustom>findOrdersPlusUser()throws Exception;
}

编写测试方法:

public class Test {
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession sqlSession=sqlSessionFactory.openSession();

    @org.junit.Test
    public void findOrdersUser() throws Exception {
        OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class);
        //创建包装对象,设置查询条件
        List<OrdersCustom> orderslist=  ordersMapperCustom.findOrdersPlusUser();
        System.out.println(orderslist);
        sqlSession.close();
    }
    public Test() throws IOException {
    }

}

结果如下:

多对多查询:

主表:用户表,,,关联表:用户商品没有直接关联,所以要关联订单和订单详细表。

映射思路:将用户信息映射到user中,

在user类中添加订单列表属性List<Order>orderslist

在Orders中添加订单明细表属性List<Ordertail>orderdetails

在orderdetail中添加item属性,将订单明细所对应商品映射到items

运行截图:

最后贴一下完整的代码:

ordermapperCustom.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.lmj.ssm.mapper.OrdersMapperCustom" >

   <resultMap id="OrdersPlusUser" type="UserCustom">
       <!-- 用户信息-->
        <id column="user_id" property="id"/>
        <result column="username" property="username"/>
        <result column="sex" property="sex"/>
        <result column="address" property="address"/>
<!--订单信息-->
       <!-- 一个用户多个订单,用collection-->
        <collection property="ordersList" ofType="OrdersCustom">
            <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"/>
           <!--订单明细
            一个订单多个明细-->
            <collection property="orderDetails" ofType="Orderdetail">
                <id column="orderdetail_id" property="id"/>
                <result column="items_num" property="itemsNum"/>
                <result column="items_id" property="itemsId"/>
                <!--一个订单明细对应一个商品-->
                <association property="items" javaType="Items">
                    <id column="items_id" property="id"/>
                    <result column="detail" property="detail"/>
                    <result column="name" property="name"/>
                </association>
            </collection>
        </collection>
   </resultMap>

    <!--查询用户和购买的商品信息-->
    <select id="findOrdersPlusUser" resultMap="OrdersPlusUser">
    select orders.*,`user`.username,`user`.sex,`user`.address,
orderdetail.id orderdetail_id,orderdetail.items_id,
orderdetail.items_num,
items.name,items.detail
from orders,user,orderdetail,items
 where orders.user_id=user.id and orderdetail.orders_id=orders.id and orderdetail.items_id=items.id
    </select>

</mapper>

在Orderdetail类中添加Item类:

public class Orderdetail {
    private Integer id;

    private Integer ordersId;

    private Integer itemsId;

    private Integer itemsNum;

    private Items items;

在OrdersCustom中添加user类和orderdetail集合:

public class OrdersCustom extends Orders {
    private String name;
    private String sex;
    private String address;
    private User user;
    private List<Orderdetail> orderDetails;
省略getter,setter方法
}
UserCustom类中添加订单order类集合:
public class UserCustom extends User {
    private List<Orders> ordersList;

    public List<Orders> getOrdersList() {
        return ordersList;
    }

    public void setOrdersList(List<Orders> ordersList) {
        this.ordersList = ordersList;
    }
}

测试类代码:

public class Test {
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession sqlSession=sqlSessionFactory.openSession();

    @org.junit.Test
    public void findOrdersUser() throws Exception {
        OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class);
        //创建包装对象,设置查询条件
        List<OrdersCustom> orderslist=  ordersMapperCustom.findOrdersPlusUser();
        System.out.println(orderslist);
        sqlSession.close();
    }
    public Test() throws IOException {
    }

}

一切ok

猜你喜欢

转载自blog.csdn.net/qq_41063141/article/details/83819994