mybatis中多表关联,主要修改mapper.xml文件和eitity实体。
mapper.xml文件中通过resultmap配置返回映射,eitity实体中通过对象引用定义关系。
spring-mybatis.xml文件与pom.xml文件与spring-mybatis中相同,选择其中第一种整合方式。
1、数据库执行脚本
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for item
-- ----------------------------
DROP TABLE IF EXISTS `item`;
CREATE TABLE `item` (
`itemid` int(11) NOT NULL AUTO_INCREMENT,
`itemname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`itemid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of item
-- ----------------------------
INSERT INTO `item` VALUES (1, '里斯');
INSERT INTO `item` VALUES (2, '嗡嗡嗡');
INSERT INTO `item` VALUES (3, '迭代');
-- ----------------------------
-- Table structure for order
-- ----------------------------
DROP TABLE IF EXISTS `order`;
CREATE TABLE `order` (
`orderid` int(11) NOT NULL,
`userid` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`orderid`) USING BTREE,
INDEX `userid`(`userid`) USING BTREE,
CONSTRAINT `userid` FOREIGN KEY (`userid`) REFERENCES `user` (`userid`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of order
-- ----------------------------
INSERT INTO `order` VALUES (1, 1);
-- ----------------------------
-- Table structure for orderitem
-- ----------------------------
DROP TABLE IF EXISTS `orderitem`;
CREATE TABLE `orderitem` (
`orderitemid` int(11) NOT NULL,
`orderid` int(11) NULL DEFAULT NULL,
`itemid` int(11) NULL DEFAULT NULL,
PRIMARY KEY (`orderitemid`) USING BTREE,
INDEX `orderid`(`orderid`) USING BTREE,
INDEX `itemid`(`itemid`) USING BTREE,
CONSTRAINT `itemid` FOREIGN KEY (`itemid`) REFERENCES `item` (`itemid`) ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `orderid` FOREIGN KEY (`orderid`) REFERENCES `order` (`orderid`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of orderitem
-- ----------------------------
INSERT INTO `orderitem` VALUES (1, 1, 1);
INSERT INTO `orderitem` VALUES (2, 1, 2);
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`userid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
PRIMARY KEY (`userid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'lin');
INSERT INTO `user` VALUES (2, '苏');
SET FOREIGN_KEY_CHECKS = 1;
2、数据模型分析
用户表:user,记录了用户信息。
订单表:order,记录了用户的订单信息。
订单项表:orderitem,记录订单中,每个商品项的购买情况。
商品表:item,记录了商品信息。
表与表之间业务分析:
user与orer:
user—>order:一个用户可以创建多个订单
order—>user:一个订单只属于一个用户
order与orderitem:
order--->orderitem:一个订单包含多个订单项
orderitem--->order:一个订单项属于一个订单
orderitem与item:
orderitem—>item:一个订单项包含一个商品
item--->orderitem:一个商品可以属于多个订单项
user与item:
user—>item:一个用户可以购买多个商品
item--->user:一个商品被多个用户购买
画出图:
3、实体类
1、user.java
public class User {
private Integer userId;
private String userName;
// 外键引用,一个用户可以创建多个订单
private List<Order> orders;
}
2、order.java
public class Order {
private Integer orderId;
// 一个订单包含多个订单项
private List<OrderItem> orderItems;
// 一个订单属于一个用户
private User user;
}
3、orderitem.java
public class OrderItem {
private Integer orderItemId;
// 一个订单项属于一个订单
private Order order;
// 一个订单项包含一个商品
private Item item;
}
4、item.java
public class Item {
private Integer itemId;
private String itemName;
}
4、Service及Dao
接口UserDao:
public interface UserDao {
User findUserById(User user);
实现类UserServiceImpl:
public class UserServiceImpl implements UserService {
private UserDao userdao;
return userdao.findUserById(user);
}
return userdao.findUserAndOrderById(user);
}
5、多表关系
多表关系主要用于查询,mybatis中在mapper.xml文件中配置resultMap来配置多表关系,用于返回映射。
mapper.xml中配置了一对一,一对多,多对多关系。
userMapper.xml
<!DOCTYPE mapper
PUBLIC "-// mybatis.org//DTD Mapper 3.0//EN"
" http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lin.dao.UserDao">
<!-- collection:表示一对多关系,实体类中通常用集合表示 -->
<!-- ofType:一对多中,多的实体类型 -->
<!-- association:表示一对一关系,实体类中为引用 -->
<!-- javaType:一对一中另一个一的实体类型 -->
<!-- 将多对多关系,可以拆分成2个一对多关系,与数据库表一样 -->
<!-- 用户 -->
<resultMap type="com.lin.bean.User" id="UserResultMap">
<id property="userId" column="userid" />
<result property="userName" column="username" />
<!-- 一个用户拥有多个订单,表示一对多关系 -->
<collection property="orders" ofType="com.lin.bean.Order" fetchType="lazy">
<!-- 订单和商品为多对多关系,将其拆分为订单,订单项,商品三张表 -->
<!-- 1、一个订单包含多个订单项 - -->
<!-- 2、一个订单项包含一个商品 -->
<!-- 3、一个订单项属于一个订单 - -->
<!-- 4、一个商品属于多个订单项(商品中不添加订单项的引用) -->
<!-- 采用1和2可完成多对多的配置 -->
<id property="orderId" column="orderid" />
<!-- 每个订单中包含多个订单项,一对多关系 -->
<collection property="orderItems" fetchType="lazy" ofType="com.lin.bean.OrderItem">
<id property="orderItemId" column="orderitemid" />
<!-- 每个订单项包含一个商品,一对一关系 -->
<!-- 嵌套结果方式 -->
<!-- <association property="item" javaType="com.lin.bean.Item"> <id property="itemId"
column="itemid" /> <result property="itemName" column="itemname" /> </association> -->
<!-- 嵌套查询方式 -->
<!-- column:外键字段名称:select语句参数 -->
<association property="item" javaType="com.lin.bean.Item" column="itemid" select="findItemById"></association>
</collection>
</collection>
</resultMap>
select itemid,itemname from item where itemid=#{v}
</select>
select
user u,`order` o,orderitem `or`,item i where o.userid=u.userid and
o.orderid=or.orderid and i.itemid=or.itemid;
</select>
select * from user where userid = #{userId}
</select>
6、测试
public class App {
public static void main(String[] args) {
User user = new User();
user.setUserId(1);
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-mybatis.xml");
UserService userServie = (UserService) applicationContext.getBean("UserService");
System.out.println(userServie.findUserById(user));
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println(userServie.findUserAndOrderById(user));
}
}
7、结果
来源:oschina
链接:https://my.oschina.net/linqiankun/blog/3191901