MyBatis一对多保存多对多关系.docx
- 文档编号:24758479
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:13
- 大小:16.80KB
MyBatis一对多保存多对多关系.docx
《MyBatis一对多保存多对多关系.docx》由会员分享,可在线阅读,更多相关《MyBatis一对多保存多对多关系.docx(13页珍藏版)》请在冰豆网上搜索。
MyBatis一对多保存多对多关系
一、一对多保存
1)提出需求
保存班级以及学生信息。
2)创建表和数据
CREATETABLE`dept`(
`id`int(11)unsignedNOTNULLAUTO_INCREMENT,
`deptName`varchar(50)DEFAULTNULL,
PRIMARYKEY(`id`)
)
CREATETABLE`emp`(
`id`int(11)unsignedNOTNULLAUTO_INCREMENT,
`empName`varchar(50)NOTNULL,
`deptId`int(11)unsignedDEFAULTNULL,
PRIMARYKEY(`id`),
KEY`fk_emp_dept_id`(`deptId`),
CONSTRAINT`fk_emp_dept_id`FOREIGNKEY(`deptId`)REFERENCES`dept`(`id`)
)
INSERTINTO`emp`VALUES('2','emp01','1');
3)定义实体
publicclassEmp{
privateintid;
privateStringempName;
privateDeptdept;
}
publicclassDept{
privateintid;
privateStringdeptName;
privateList
}
4)定义sql映射文件
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http:
//mybatis.org/dtd/mybatis-3-mapper.dtd">
insertintoemp(empName,deptId)values(#{empName},#{dept.id})
5)测试代码
@Test
publicvoidtestInsert(){
SqlSessionsession=MyBatisUtil.getFactory().openSession();
Empemp=newEmp(1,"emp01",newDept(1,"dept1"));
intinsetCnt=session.insert("com.tocean.domain.empMapper.insert",emp);
mit();
assertEquals(1,insetCnt);
}
二、多对多关联关系(实现方式1)
1)提出需求
●保存订单
●根据订单ID查询订单(订单对象包含产品信息)
2)创建表和数据
CREATETABLE`product`(
`id`int(11)unsignedNOTNULLAUTO_INCREMENT,
`prodName`varchar(50)NOTNULL,
PRIMARYKEY(`id`)
)
CREATETABLE`order_infor`(
`id`int(11)unsignedNOTNULLAUTO_INCREMENT,
`orderNum`varchar(50)NOTNULL,
PRIMARYKEY(`id`)
)
CREATETABLE`prod_order`(
`id`int(11)unsignedNOTNULLAUTO_INCREMENT,
`prodId`int(11)unsignedNOTNULL,
`orderId`int(11)unsignedNOTNULL,
`num`int(3)NOTNULLDEFAULT'1',
PRIMARYKEY(`id`),
KEY`fk_prod_order_oid`(`orderId`),
KEY`fk_prod_order_pid`(`prodId`),
CONSTRAINT`fk_prod_order_pid`FOREIGNKEY(`prodId`)REFERENCES`product`(`id`),
CONSTRAINT`fk_prod_order_oid`FOREIGNKEY(`orderId`)REFERENCES`order_infor`(`id`)
)
INSERTINTO`product`VALUES('1','prod1');
INSERTINTO`product`VALUES('2','prod2');
INSERTINTO`product`VALUES('3','prod3');
3)定义实体
publicclassOrderInfor{
privateintid;
privateStringorderNum;
privateList
}
publicclassProduct{
privateintid;
privateStringprodName;
privateList
}
//定义中间表实体
publicclassProdOrder{
privateintid;
privateProductproduct;
privateOrderInfororderInfor;
privateintnum;//订单的产品数量
}
4)定义sql映射文件
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http:
//mybatis.org/dtd/mybatis-3-mapper.dtd">
select*fromorder_inforwhereid=#{id}
select*fromorder_inforwhereorderNum=#{orderNum}
resultMap="orderWidthProd"> selectt1.id,t1.orderNum, t2.idprodOrderId,t2.num,t3.idprodId,t3.prodName fromorder_infort1 leftjoinprod_ordert2ont1.id=t2.orderId leftjoinproductt3ont2.prodId=t3.id wheret1.id=#{id} insertintoorder_infor(orderNum)values(#{orderNum}) insertintoprod_order(prodId,orderId,num)values(#{product.id},#{orderInfor.id},#{num}) 5)测试 publicclassTestOrder{ @Test publicvoidinsertTest(){ SqlSessionsession=MyBatisUtil.getFactory().openSession(); OrderInfororder=newOrderInfor(0,"o-1234",null); intretCnt=session.insert("com.tocean.domain.orderInforMapper.insert",order); System.out.println("---"+retCnt); //根据orderNum获取order对象 OrderInfororderInserted=session.selectOne("com.tocean.domain.orderInforMapper.getByOrderNum",order.getOrderNum()); Productp1=session.selectOne("com.tocean.domain.productMapper.get",1); Productp2=session.selectOne("com.tocean.domain.productMapper.get",2); System.out.println(orderInserted); System.out.println(p1); System.out.println(p2); //插入成功,保存中间表 if(retCnt>0){ ProdOrderpo1=newProdOrder(0,p1,orderInserted,1); ProdOrderpo2=newProdOrder(0,p2,orderInserted,1); intret1=session.insert("com.tocean.domain.orderInforMapper.insertProdOrder",po1); intret2=session.insert("com.tocean.domain.orderInforMapper.insertProdOrder",po2); System.out.println("---ret1--"+ret1); System.out.println("---ret2-"+ret2); } mit(); session.close(); } @Test publicvoidselectTest(){ SqlSessionsession=MyBatisUtil.getFactory().openSession(); OrderInfororder=session.selectOne("com.tocean.domain.orderInforMapper.getOrderWidthProd",9); System.out.println(order); session.close(); } } 三、多对多关联关系(实现方式2) 6)提出需求 ●保存订单 ●根据订单号查询订单 ●根据订单ID查询订单(订单对象包含产品信息) 7)创建表和数据 CREATETABLE`product`( `id`int(11)unsignedNOTNULLAUTO_INCREMENT, `prodName`varchar(50)NOTNULL, PRIMARYKEY(`id`) ) CREATETABLE`order_infor`( `id`int(11)unsignedNOTNULLAUTO_INCREMENT, `orderNum`varchar(50)NOTNULL, PRIMARYKEY(`id`) ) CREATETABLE`prod_order`( `id`int(11)unsignedNOTNULLAUTO_INCREMENT, `prodId`int(11)unsignedNOTNULL, `orderId`int(11)unsignedNOTNULL, `num`int(3)NOTNULLDEFAULT'1', PRIMARYKEY(`id`), KEY`fk_prod_order_oid`(`orderId`), KEY`fk_prod_order_pid`(`prodId`), CONSTRAINT`fk_prod_order_pid`FOREIGNKEY(`prodId`)REFERENCES`product`(`id`), CONSTRAINT`fk_prod_order_oid`FOREIGNKEY(`orderId`)REFERENCES`order_infor`(`id`) ) INSERTINTO`product`VALUES('1','prod1'); INSERTINTO`product`VALUES('2','prod2'); INSERTINTO`product`VALUES('3','prod3'); 8)定义实体 publicclassOrderInfor{ privateintid; privateStringorderNum; privateList } publicclassProduct{ privateintid; privateStringprodName; privateList privateintnum; }| 9)定义sql映射文件 xmlversion="1.0"encoding="UTF-8"? > DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http: //mybatis.org/dtd/mybatis-3-mapper.dtd"> insertintoorder_infor(orderNum)values(#{orderNum}) insertintoprod_order(prodId,orderId,num) values(#{prod.id},#{orderId},#{prod.num}) select*fromorder_infor whereorderNum=#{orderNum} resultMap="orderMap"> selectt1.id,t1.orderNum,t2.idprodId,t2.prodName,t3.num fromorder_infort1,productt2,prod_ordert3 wheret1.id=t3.orderId andt2.id=t3.prodId andt1.id=#{id} 10)测试 publicclassTestOrder{ @Test publicvoidinsertTest(){ SqlSessionsession=MyBatisUtil.getFactory().openSession(); OrderInfororder=newOrderInfor("1002"); intinsetCnt1=session.insert( "com.tocean.domain.orderInforMapper.insert",order); //获取刚刚插入的order对象 OrderInfororderInserted=session.selectOne( "com.tocean.domain.orderInforMapper.getOrderByOrderNum",order.getOrderNum()); System.out.println(orderInserted); //获取产品信息 Productp1=session.selectOne("com.tocean.domain.productMapper.get",1); Productp2=session.selectOne("com.tocean.domain.productMapper.get",2); System.out.println(p1); System.out.println(p2); //保存中间表 List prods.add(p1); prods.add(p2); for(Productprod: prods){ HashMapparam=newHashMap(); param.put("orderId",orderInserted.getId()); param.put("prod",prod); intinsetCnt2=session.insert( "com.tocean.domain.orderInforMapper.insertProductOrder", param); } mit(); assertEquals(1,insetCnt1); } @Test publicvoidselectOrderByIdWithProdTest(){ SqlSessionsession=MyBatisUtil.getFactory().openSession(); OrderInfororder=session.selectOne( "com.tocean.domain.orderInforMapper.getOrderByIdWithProduct",5); System.out.println(order); } @Test publicvoidselectOrderByOrderNumTest(){ SqlSessionsession=MyBatisUtil.getFactory().openSession(); OrderInfororder=session .selectOne( "com.tocean.domain.orderInforMapper.getOrderByOrd
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MyBatis 一对 保存 关系