天天看點

【Mybatis】---進階映射之一對一查詢資料模型需求:ResultTypeResultMap總結:

   在上一篇mybatis的部落格中介紹了mybatis+mysql+IDEA如何搭建架構以及一個簡單的例子.【Mybatis】---mybatis+mysql+ IntelliJ IDEA架構搭建+執行個體講解,接下來要講解的是mybatis的進階映射.mybatis的進階映射包括一對一查詢,一對多,多對多查詢.本篇文章将要介紹使用ResultType和ResultMap的一對一查詢.将通過這兩種方式進行執行個體講解.

資料模型

本文将通過訂單商品的資料模型來進行講解.共包含四張表

user(使用者表)記錄了購買商品的使用者資訊

orders(訂單表)記錄了使用者所建立的訂單(購買商品的訂單)

orderdetail(訂單詳情表)記錄了訂單的詳細資訊即購買商品的資訊

items(商品表)記錄了商品資訊

【Mybatis】---進階映射之一對一查詢資料模型需求:ResultTypeResultMap總結:
/*
SQLyog v10.2 
MySQL - 5.1.72-community : Database - mybatis
*********************************************************************
*/


/*!40101 SET NAMES utf8 */;

/*!40101 SET SQL_MODE=''*/;

/*!40014 SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @[email protected]@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @[email protected]@SQL_NOTES, SQL_NOTES=0 */;
/*Table structure for table `items` */

CREATE TABLE `items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(32) NOT NULL COMMENT '商品名稱',
  `price` float(10,1) NOT NULL COMMENT '商品定價',
  `detail` text COMMENT '商品描述',
  `pic` varchar(64) DEFAULT NULL COMMENT '商品圖檔',
  `createtime` datetime NOT NULL COMMENT '生産日期',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

/*Table structure for table `orderdetail` */

CREATE TABLE `orderdetail` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `orders_id` int(11) NOT NULL COMMENT '訂單id',
  `items_id` int(11) NOT NULL COMMENT '商品id',
  `items_num` int(11) DEFAULT NULL COMMENT '商品購買數量',
  PRIMARY KEY (`id`),
  KEY `FK_orderdetail_1` (`orders_id`),
  KEY `FK_orderdetail_2` (`items_id`),
  CONSTRAINT `FK_orderdetail_1` FOREIGN KEY (`orders_id`) REFERENCES `orders` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `FK_orderdetail_2` FOREIGN KEY (`items_id`) REFERENCES `items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

/*Table structure for table `orders` */

CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT '下單使用者id',
  `number` varchar(32) NOT NULL COMMENT '訂單号',
  `createtime` datetime NOT NULL COMMENT '建立訂單時間',
  `note` varchar(100) DEFAULT NULL COMMENT '備注',
  PRIMARY KEY (`id`),
  KEY `FK_orders_1` (`user_id`),
  CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

/*Table structure for table `user` */

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL COMMENT '使用者名稱',
  `birthday` date DEFAULT NULL COMMENT '生日',
  `sex` char(1) DEFAULT NULL COMMENT '性别',
  `address` varchar(256) DEFAULT NULL COMMENT '位址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8;

/*!40101 SET [email protected]_SQL_MODE */;
/*!40014 SET [email protected]_FOREIGN_KEY_CHECKS */;
/*!40014 SET [email protected]_UNIQUE_CHECKS */;
/*!40111 SET [email protected]_SQL_NOTES */;
           
【Mybatis】---進階映射之一對一查詢資料模型需求:ResultTypeResultMap總結:

附加上各個表之間的對應關系.

需求:

   查詢訂單資訊,關聯查詢建立訂單的使用者資訊

ResultType

sql語句

在使用sql語句查詢的時候,使用了内連接配接,由于orders表中有一個外鍵(user_id),通過外鍵關聯查詢使用者表隻能查詢出一條資料.确定查詢的主表為:訂單表,關聯表為使用者表.

SELECT 
  orders.*,
  USER.username,
  USER.sex,
  USER.address 
FROM
  orders,
  USER 
WHERE orders.user_id = user.id
           

建立pojo

package cn.itcast.mybatis.po;

/**
 * Created by CXC on 2017/2/26.
 */
//通過此類映射訂單和使用者查詢的結果,讓此類繼承字段較多的pojo類
public class OrderCustom 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;
    }
}
           

mapper.xml

<!-- 查詢訂單關聯查詢使用者資訊-->
    <select id="findOrderUser"  resultType="cn.itcast.mybatis.po.OrderCustom">
  SELECT
    orders.*,
    USER.username,
    USER.sex,
    USER.address
  FROM
    orders,
    USER
  WHERE orders.user_id = user.id


  </select>
           

mapper.java

package cn.itcast.mybatis.mapper;

import cn.itcast.mybatis.po.OrderCustom;
import cn.itcast.mybatis.po.Orders;
import cn.itcast.mybatis.po.User;

import java.util.List;

/**
 * Created by CXC on 2017/2/26.
 */
public interface OrdersMapperCustomer {
    //根據訂單關聯查詢使用者資訊
    public List<OrderCustom> findOrderUser() throws  Exception;
    
}
           

ResultMap

   使用ResultMap将查詢結果中的訂單資訊映射到Orders對象中,在orders類中添加User屬性,将關聯查詢出來的使用者資訊映射到orders對象中的user屬性中.

sql語句

同resultType實作的sql語句

修改pojo

在Orders類中添加user屬性

//使用者資訊
    private User user;
           

mapper.xml

<!-- 訂單查詢關聯使用者的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中哪個屬性
		 -->
		<association property="user"  javaType="cn.itcast.mybatis.po.User">
			<!-- id:關聯查詢使用者的唯 一辨別
			column:指定唯 一辨別使用者資訊的列
			javaType:映射到user的哪個屬性
			 -->
			<id column="user_id" property="id"/>
			<result column="username" property="username"/>
			<result column="sex" property="sex"/>
			<result column="address" property="address"/>
		
		</association>
	</resultMap>
           
<!-- 查詢訂單關聯查詢使用者資訊,使用resultmap -->
	<select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
		SELECT
		orders.*,
		USER.username,
		USER.sex,
		USER.address
		FROM
		orders,
		USER
		WHERE orders.user_id = user.id
	</select>
           

mapper.java

//查詢訂單關聯查詢使用者使用resultMap
    public List<Orders> findOrdersUserResultMap() throws Exception;
           

總結:

resultType:使用resultType實作較為簡單,如果pojo中沒有包括查詢出來的列名,需要增加列名對應的屬性,即可完成映射。如果沒有查詢結果的特殊要求建議使用resultType。

resultMap:需要單獨定義resultMap,實作有點麻煩,如果對查詢結果有特殊的要求,使用resultMap可以完成将關聯查詢映射pojo的屬性中。resultMap可以實作延遲加載,resultType無法實作延遲加載。

轉載于:https://www.cnblogs.com/chenxiaochan/p/7253429.html