博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mybatis一对一和一对多配置
阅读量:7040 次
发布时间:2019-06-28

本文共 10578 字,大约阅读时间需要 35 分钟。

hot3.png

  • 问题描述

现在有三张数据表,表名为orders,orderdetail,items,分别表示订单,订单详情,商品。

表关系

其中一个订单包含多个订单详情,表示订单中的不同个具体的商品,订单详情唯一对应一件商品。所以orderdetail中的外键order_id为orders的主键,orderdetail中的外键items_id为items的主键。

  • 数据库结构
DROP TABLE IF EXISTS `items`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;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=6 DEFAULT CHARSET=utf8;/*!40101 SET character_set_client = @saved_cs_client */;---- Table structure for table `orderdetail`--DROP TABLE IF EXISTS `orderdetail`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;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;/*!40101 SET character_set_client = @saved_cs_client */;---- Table structure for table `orders`--DROP TABLE IF EXISTS `orders`;/*!40101 SET @saved_cs_client = @@character_set_client */;/*!40101 SET character_set_client = utf8 */;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;
  • POJO

根据表创建pojo类:

Items.java

package cn.elinzhou.mybatisTest.pojo;import java.util.Date;/** * Description: Items * Author: Elin Zhou * Create: 2015-06-30 00:57 */public class Items {
private Integer id; private String name; private Double price; private String detail; private String pic; private Date createtime; public Date getCreatetime() { return createtime; } public void setCreatetime(Date createtime) { this.createtime = createtime; } public String getDetail() { return detail; } public void setDetail(String detail) { this.detail = detail; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPic() { return pic; } public void setPic(String pic) { this.pic = pic; } public Double getPrice() { return price; } public void setPrice(Double price) { this.price = price; } @Override public String toString() { return "Items{" + "createtime=" + createtime + ", id=" + id + ", name='" + name + '\'' + ", price=" + price + ", detail='" + detail + '\'' + ", pic='" + pic + '\'' + '}'; }}

Order.java

package cn.elinzhou.mybatisTest.pojo;import java.util.Date;/** * Description: Orders * Author: Elin Zhou * Create: 2015-06-30 00:06 */public class Orders {
// id | user_id | number | createtime | note | private Integer id; private Integer user_id; private String number; private Date createtime; private String note; public Date getCreatetime() { return createtime; } public void setCreatetime(Date createtime) { this.createtime = createtime; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public Integer getUser_id() { return user_id; } public void setUser_id(Integer user_id) { this.user_id = user_id; } @Override public String toString() { return "Orders{" + "createtime=" + createtime + ", id=" + id + ", user_id=" + user_id + ", number='" + number + '\'' + ", note='" + note + '\'' + '}'; }}

OrderDetail.java

package cn.elinzhou.mybatisTest.pojo;/** * Description: OrderDetail * Author: Elin Zhou * Create: 2015-06-30 00:08 */public class OrderDetail {
// id | orders_id | items_id | items_num private Integer id; private Integer orders_id; private Integer items_id; private Integer items_num; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getItems_id() { return items_id; } public void setItems_id(Integer items_id) { this.items_id = items_id; } public Integer getItems_num() { return items_num; } public void setItems_num(Integer items_num) { this.items_num = items_num; } public Integer getOrders_id() { return orders_id; } public void setOrders_id(Integer orders_id) { this.orders_id = orders_id; } @Override public String toString() { return "OrderDetail{" + "id=" + id + ", orders_id=" + orders_id + ", items_id=" + items_id + ", items_num=" + items_num + '}'; }}

POJO由于对应这数据库字段,所以不方便修改,为了方便拓展,添加两个类OrderCustom和OrderDetailCustom,用来包含所需要的POJO对象

OrderCustom.java

package cn.elinzhou.mybatisTest.pojo;/** * Description: OrderDetailCustom * Author: Elin Zhou * Create: 2015-06-30 00:56 */public class OrderDetailCustom extends OrderDetail {
private Items items; public Items getItems() { return items; } public void setItems(Items items) { this.items = items; } @Override public String toString() { return "OrderDetailCustom{" + "items=" + items + '}'; }}

OrderDetailCustom.java

package cn.elinzhou.mybatisTest.pojo;import java.util.List;/** * Description: OrdersCustrom * Author: Elin Zhou * Create: 2015-06-30 00:35 */public class OrdersCustrom extends Orders {
private List
orderDetails; public List
getOrderDetails() { return orderDetails; } public void setOrderDetails(List
orderDetails) { this.orderDetails = orderDetails; } @Override public String toString() { return "OrdersCustrom{" + "orderDetails=" + orderDetails + '}'; }}

OrderCustom继承自Order,添加了一个List

OrderDetailCustom继承自OrderDetail,添加了一个Items

  • Mapper接口

本案例只实现订单的获取功能,所以在OrderMapper中只定义个findOrders方法

OrderMapper.java

package cn.elinzhou.mybatisTest.mapper;import cn.elinzhou.mybatisTest.pojo.OrdersCustrom;import java.util.List;/** * Description: OrdersMapper * Author: Elin Zhou * Create: 2015-06-30 00:32 */public interface OrdersMapper {
List
findOrders() throws Exception;}
  • OrderMapper.xml

这里需要用到两个标签,< collection >和< association >

< collection >用来表示一对多关系,如订单包含多个订单详情就可以用这个标签,主要用到两个属性:

property:属性名,可以理解为在该类型在父类型中的属性名
ofType:该属性所对应的POJO类型

<collection property="orderDetails" ofType="cn.elinzhou.mybatisTest.pojo.OrderDetailCustom">

< association >用来表示一对一关系,如订单详情对应一件商品,主要用到两个属性

property:属性名,可以理解为在该类型在父类型中的属性名
javaType:该属性所对应的POJO类型

特别注意,collection和association中描述POJO类型的属性名是不同的,collection是ofType,association是javaType

sql

为了方便重用,定了了三个sql标签,用来表示从三张表中索要查找的字段

orders.id orders_id,orders.user_id orders_user_id, orders.number orders_number,orders.createtime orders_createtime,orders.note orders_note
orderdetail.id orderdetail_id,orderdetail.orders_id orderdetail_orders_id, orderdetail.items_id orderdetail_items_id,orderdetail.items_num orderdetail_items_num
items.id items_id,items.name items_name,items.price items_price, items.detail items_detail,items.pic items_pic,items.createtime items_createtime

select标签

OrderResultMap就要勇当之前说过的collection和association标签,其余的部分与普通的resultMap的方式一样

POJO之间的关系,也相当于数据表之间的关系,只要定义好了主键和外键,mybatis会自动进行关联。

  • 测试代码
package cn.elinzhou.mybatisTest.test;import cn.elinzhou.mybatisTest.mapper.OrdersMapper;import cn.elinzhou.mybatisTest.pojo.Orders;import cn.elinzhou.mybatisTest.pojo.OrdersCustrom;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Before;import org.junit.Test;import java.io.Reader;import java.util.List;/** * Created by elin on 15-6-30. */public class OrderMapperTest {    SqlSession sqlSession = null;    @Before    public void setUp() throws Exception {        // 通过配置文件获取数据库连接信息        Reader reader = Resources.getResourceAsReader("cn/elinzhou/mybatisTest/config/mybatis.xml");        // 通过配置信息构建一个SqlSessionFactory                SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);        // 通过sqlSessionFactory打开一个数据库会话        sqlSession = sqlSessionFactory.openSession();    }    @Test    public void testFindOrders() throws Exception {        OrdersMapper orderMapper = sqlSession.getMapper(OrdersMapper.class);        List
list = orderMapper.findOrders(); System.out.println(list); }}

转载于:https://my.oschina.net/u/3099393/blog/798339

你可能感兴趣的文章
angular 定时函数
查看>>
移动端app测试关注点
查看>>
Android 仿QQ消息界面
查看>>
a demo for how to use QThread
查看>>
扩展欧几里德算法
查看>>
【原创】多字节版本下MFC控件处理字符集的BUG
查看>>
360,你能不吹嘘吗
查看>>
RTEMS硬实时操作系统简介
查看>>
k8s基本概念与术语
查看>>
Java监控常用工具 .
查看>>
模拟placeholder
查看>>
框架介绍
查看>>
中间件
查看>>
python 购物车
查看>>
Android之开发杂记(二)
查看>>
hdu1059(多重背包)
查看>>
jQuery基础整理!!
查看>>
检查python模块是否成功安装
查看>>
bzoj 2142 国家集训队试题 礼物
查看>>
Hive 0.12.0安装指南
查看>>