mybatis3.2.7应用_高级映射(一对一、一对多、多对多)

1. 一对一查询

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

1.1 使用resultType实现

1.1.1 sql语句

   确定查询的主表:订单表
       确定查询的关联表:用户表
       关联查询:使用外连接,还是内连接??

        --由于orders表中有一个外键(user_id),通过外键关联查询用户表只能查询出一条记录,可以使用内连接

select t.*,
         u.username,  u.sex,  u.address
  from orders t, user u
 where t.user_id = u.id

1.1.2 创建pojo

     将上边sql查询结果映射到pojo中,pojo中必须包含所有查询列名。
         原始的Orders不能映射全部字段,需要新创建pojo。创建一个pojo继承包括查询字段较多的po类。

//通过此类映射订单和用户和用户查询的结果,让此类继承包括字段较多的pojo类
public class OrdersCustom extends Orders{
     //添加用户属性
    //u.username, u.sex, u.address
     private String username;
     private String sex;
     private String address;
}

1.1.3 mapper.xml

<!-- 查询订单,关联查询用户信息 -->
<select id="findOrderUser" resultType="cn.itcast.mybatis.po.OrdersCustom">
        select t.*, u.username, u.sex, u.address
         from orders t, user u
        where t.user_id = u.id
</select>

1.1.4 mapper.java

public List<OrdersCustom> findOrderUser() throws Exception;

1.2 使用resultMap实现
1.2.1 sql语句
      同resultType实现的sql
1.2.2 使用resultType映射的思路
    使用resultType将查询结果中的订单信息映射到Orders对象中,在Orders对象中添加user属性,将关联查询出来的用户信息映射到Orders对象中user属性中。
    需要Orders类中添加user属性。

public class Orders{

     private Integer id;
     private Integer userId;
     private String number;
     private Date createTime;
     private String note;

     //用户信息
    private User user;
}

1.2.3 mapper.xml   定义resultMap(一对一使用association来映射用户信息)

    <!-- 订单查询关联查询用户信息 的 resultMap
           将整个查询的结果映射到cn.itcast.mybatis.po.Orders中
    -->
    <resultMap type="cn.itcast.mybatis.po.Orders" id="ordersUserResultMap">
         <!-- 配置映射的订单信息-->
         <!-- id: 指定查询列中的唯一标识,订单信息中的唯一标识,如果有多个列组成唯一标识,配置多个id
                column: 订单信息中的唯一标识列
            property:订单信息中的唯一标识列所映射到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"/>

         <!-- 配置映射的关联的用户信息
           association: 用于映射关联查询单个对象的信息
           property: 要将关联查询的用户信息映射到Orders中哪个属性
           javaType: 指定映射到关联用户的pojo类型中-->
         <association property="user" javaType="cn.itcast.mybatis.po.User">
              <!-- id: 关联查询用户的唯一标识
               column: 指定唯一标识用户信息的列
               property:映射到user的哪个属性-->
              <id column="user_id" property="id"/>
              <result column="username" property="username"/>
             <result column="sex" property="sex"/>
             <result column="address" property="address"/>
          </association>
    </resultMap>        

1.2.4 mapper.xml   statement

<!-- 查询订单,关联查询用户信息 -->
<select id="findOrdersUserResultMap" resultMap="ordersUserResultMap">
     select t.*, u.username, u.sex, u.address
      from orders t, user u
    where t.user_id = u.id
</select>

1.2.5 mapper.java

public List<Orders> findOrdersUserResultMap() throws Exception;

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

  

    

时间: 2024-11-08 05:48:46

mybatis3.2.7应用_高级映射(一对一、一对多、多对多)的相关文章

mybatis 一对一 一对多 多对多

一对一 一对多 多对多 原文地址:https://www.cnblogs.com/cwone/p/11909271.html

mybatis入门基础(六)----高级映射(一对一,一对多,多对多)

一:订单商品数据模型 1.数据库执行脚本 创建数据库表代码: 1 CREATE TABLE items ( 2 id INT NOT NULL AUTO_INCREMENT, 3 itemsname VARCHAR(32) NOT NULL COMMENT '商品名称', 4 price FLOAT(10,1) NOT NULL COMMENT '商品定价', 5 detail TEXT COMMENT '商品描述', 6 pic VARCHAR(64) DEFAULT NULL COMMENT

Mybatis学习总结(六)——高级映射(一对一,一对多,多对多)

一.订单商品数据模型 1.数据库执行脚本 创建数据库表代码: /*Table structure for table `t_user` */ CREATE TABLE t_user ( id INT NOT NULL AUTO_INCREMENT, username VARCHAR(32) NOT NULL COMMENT '用户名称', birthday DATE DEFAULT NULL COMMENT '生日', sex CHAR(1) DEFAULT NULL COMMENT '性别',

django mysql 表的一对一 一对多 多对多

表结构的设计 一对一 多对一  将key写在多 多对多 外键: 描述  多对一的关系 写在多的一方 class Book(models.Model) title = models.CharField(max_length=32,unique=Ture) publisher = models.ForeignKey (to=Publisher,on_deleete=models.CASADE) publisher = models.ForeignKey(to='Publisher', on_dele

Hibernate 映射文件的配置 核心文件的配置 一对一 一对多 多对多 hibernate实现分页 Hibernate中session的关闭问题总结

以留言系统为实例 1 .配置映射文件:首先得引入约束dtd <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 然后<hibernate-mapping></hibernate-mapping>映射标签 <

19_高级映射:一对多查询(使用resultMap)

[需求] 查询订单以及订单明细的信息. 确定主查询表:订单表orders 确定关联查询表:订单明细表 orderdetail 在一对一查询的基础上添加订单明细表关联即可. [分析] 使用resultMap将上面的查询结果映射到pojo中,订单信息有重复. 要求:对orders映射不能出现重复记录 在orders.java类中添加List<orderDetail> orderDetails属性. 最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetai

SQLAlchemy_定义(一对一/一对多/多对多)关系

目录 Basic Relationship Patterns One To Many One To One Many To Many Basic Relationship Patterns 基本关系模式 The imports used for each of the following sections is as follows: 下列的 import 语句,应用到接下来所有的代章节中: from sqlalchemy import Table, Column, Integer, Forei

表关系(一对一,一对多,多对多)

可以在数据库图表中的表之间创建关系,以显示一个表中的列与另一个表中的列是如何相链接的. 在一个关系型数据库中,利用关系可以避免多余的数据.例如,如果设计一个可以跟踪图书信息的数据库,您需要创建一个名为 titles 的表,它用来存储有关每本书的信息,例如书名.出版日期和出版社.您也可能保存有关出版社的信息,诸如出版社的电话.地址和邮政编码.如果您打算在 titles 表中保存所有这些信息,那么对于某出版社出版的每本书都会重复该出版社的电话号码. 更好的方法是将有关出版社的信息在单独的表,publ

【MyBatis学习08】高级映射之一对一查询

从这一篇博文开始,将总结一下mybatis中的几个高级映射,即一对一.一对多.多对多查询,这篇先总结一下mybatis中的一对一查询. 为了模拟这些需求,事先要建立几个表,不同的表之间将对应上面提到的不同的映射,为此,我建立4个表,如下: DROP TABLE IF EXISTS `items`; DROP TABLE IF EXISTS `orders`; DROP TABLE IF EXISTS `user`; DROP TABLE IF EXISTS `orderdetail`; /*it