在上一篇mybatis的部落格中介紹了mybatis+mysql+IDEA如何搭建架構以及一個簡單的例子.【Mybatis】---mybatis+mysql+ IntelliJ IDEA架構搭建+執行個體講解,接下來要講解的是mybatis的進階映射.mybatis的進階映射包括一對一查詢,一對多,多對多查詢.本篇文章将要介紹使用ResultType和ResultMap的一對一查詢.将通過這兩種方式進行執行個體講解.
資料模型
本文将通過訂單商品的資料模型來進行講解.共包含四張表
user(使用者表)記錄了購買商品的使用者資訊
orders(訂單表)記錄了使用者所建立的訂單(購買商品的訂單)
orderdetail(訂單詳情表)記錄了訂單的詳細資訊即購買商品的資訊
items(商品表)記錄了商品資訊
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX1Z0RhpWOXlFco5mYshmMZZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DO1ETOzYDMxEDOyIDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
/*
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 */;
附加上各個表之間的對應關系.
需求:
查詢訂單資訊,關聯查詢建立訂單的使用者資訊
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