zoukankan      html  css  js  c++  java
  • Mybatis中的映射结果resutType和resultMap

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

    分析:共有订单表和用户表两张表,其中订单表是主表,用户表是从表

    关系:一个订单对应着一个用户,从订单到用户是一对一, 从订单到用户是一对一的关联关系

    sql:

    1
    2
    3
    4
    5
    6
    7
    8
    SELECT
        orders.*
        USER.username,
        USER.sex,
        USER.address
    FROM
        orders,
        USER

    POJO类:

      Orders.java:

    1
    2
    3
    4
    private Integer id;
    private String orderName;
    private Date crateTime;
    加上 getter/setter 方法

      User.java:

    1
    2
    3
    4
    5
    6
    private Integer id;
    private String username;
    private String password;
    private String sex;
    private String address;
    加上 getter/setter 方法

    (一) 使用resultType实现

      为了系统的可扩展性, 需要另外创建一个POJO类的扩展类(扩展类是继承订单POJO还是用户POJO,具体看SQL语句的查询列中查询出来的字段在哪个POJO中占得多, 哪个映射的字段多扩展类就继承哪个POJO类),这里就继承Orders类了,当然继承User类也是可以的:

      OrdersUser.java: (这个类将是resultType的映射结果类型)

    1
    2
    3
    4
    5
    6
    7
    public class OrdersUser extends Orders {       // 继承这个类,Orders类中的属性全都有了
        // 把User的查询列字段加上
        private String username;
        private String sex;
        private String address;
        加上 getter/setter 方法
    }

        Mapper接口(这里使用的是动态代理接口),OrdersUserMapper.java:

    1
    2
    3
    public interface OrdersUserMapper {
        List<OrdersUser> findOrdersUser() throws Exception();
    }

      Mapper接口对应的映射文件, OrdersUserMapper.xml:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?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="包.OrdersUserMapper">
        <select id="findOrdersUser" resultType="包.OrdersUser">
            SELECT
            orders.*
            USER.username,
            USER.sex,
            USER.address
            FROM
            orders,
            USER
        </select>
    </mapper>

    (二) 使用resultMap实现

    POJO类:直接在Orders.java类中添加User对象属性,比如:

    Orders.java:

    1
    2
    3
    4
    5
    6
    private Integer id;
    private String orderName;
    private Date createTime;
     
    private User user;        // 这里直接引入User对象属性
    加上 getter/setter 方法

    Mapper接口, OrdersUserMapper.xml:

    1
    2
    3
    public interface OrdersUserMapper {
        List<Orders> findOrdersUser() throws Exception();
    }

    Mapper映射文件(要和Mapper接口同名且在同一个目录下),OrdersUserMapper.xml:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?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="包.OrdersUserMapper">
        <resultMap id="findOrdersUserResultMap" type="包.Orders">
            <!-- 映射的Orders类的属性 -->
            <id column="id" property="id"/><!-- USER表字段列的唯一标识 -->
            <result column="order_name" property="orderName"/>
            <result column="create_time" property="createTime"/>
     
            <!-- 关联映射的User类的属性 -->
            <association property="user" javaType="包.User">
                <id column="id" /><!-- orders表字段列的唯一标识 -->
                <result column="username" property="username"/>
                <result column="sex" property="sex"/>
                <result column="address" property="address"/>
            </association>
        </resultMap>
     
        <select id="findOrdersUser" resultMap="findOrdersUserResultMap">
            SELECT
            orders.*
            USER.username,
            USER.sex,
            USER.address
            FROM
            orders,
            USER
        </select>
    </mapper>

    ------------<完>---------------------------------------------------------------------------------

    以上是一对一, 下面是一对多的关联关系的映射

    需求:查询订单关联查询订单明细的信息

    分析:有两张表,订单表orders表和订单明细表ordersdetail

    关系:一个订单对应多个订单明细, 从订单到订单明细是一对多的关联关系

      用户表和订单表有关系, 订单表和订单明细表有关系, 订单表是中间表

    做法:在以上一对一的基础上添加订单明细的映射即可

    sql:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT
        orders.*
        USER.username,
        USER.sex,
        USER.address,
        orderdetail.items_id,
        orderdetail.items_num
    FROM
        orders,
        USER
        ordersdetail
    WHERE
        orders.user_id=user.id AND orderdetail.orders_id=orders.id

    在Orders.java中添加List<OrderDetail> orderDetails

     接下的做法请参考:http://www.cnblogs.com/josephcnblog/articles/6442030.html

  • 相关阅读:
    django报错信息解决办法
    postgresql数据库的基本使用
    Ubuntu 18.04中安装PostgreSQL(PSQL)
    Ubuntu 18.04 安装 PyCharm
    在Ubuntu中安装Docker和docker的使用
    ubuntu怎么切换到root用户,切换到root账号方法
    centos7彻底卸载mysql和通过yum安装mysql
    django运行时报错处理方法
    Django 查询时间段 时间搜索 过滤
    View Controller Programming Guide for iOS---(四)---Creating Custom Content View Controllers
  • 原文地址:https://www.cnblogs.com/brithToSpring/p/13489052.html
Copyright © 2011-2022 走看看