java表关联一对多CRUD大致思路代码是怎样的,比如商品表,商品标签表,mybatis框架实现,有详细一点的代码学习下更好
以查询订单信息,关联查询订单明细信息及用户信息为例。主信息:orders 从信息:orderdetail、user(一个订单对应多个订单详情):
那么sql语句为:
SELECT
orders.id
,
orders.user_id
,
orders.number
,
user.username
,
user.sex
,
orderdetail.id
detailId,
orderdetail.items_id
,
orderdetail.items_num
FROM
orders,
USER,
orderdetail
WHERE orders.user_id
= user.id
AND orders.id
= orderdetail.orders_id
我们可以新建Order的扩展类:
public class OrdersExt extends Orders {
private User user;//用户信息
private List detailList;//订单明细信息
}
然后在映射文件中:
extends="OrdersAndUserRstMap">
<!-- 订单明细信息(一对多) -->
<!-- collection:映射一对多关系 -->
SELECT
orders.id
,
orders.user_id
,
orders.number
,
user.username
,
user.sex
,
orderdetail.id
detailId,
orderdetail.items_id
,
orderdetail.items_num
FROM
orders,
USER,
orderdetail
WHERE
orders.user_id
= user.id
AND orders.id
= orderdetail.orders_id
映射文件重发:=====================
extends="OrdersAndUserRstMap">
<!-- 订单明细信息(一对多) -->
<!-- collection:映射一对多关系 -->
SELECT
orders.id
,
orders.user_id
,
orders.number
,
user.username
,
user.sex
,
orderdetail.id
detailId,
orderdetail.items_id
,
orderdetail.items_num
FROM
orders,
USER,
orderdetail
WHERE
orders.user_id
= user.id
AND orders.id
= orderdetail.orders_id
<!-- OrdersAndDetailRstMap -->
<!-- extends:可以继承一个已有的resultMap,指定resultMap的唯一标示即可 -->
<!-- 注意:继承时,只能继承type类型是一样的resultMap -->
<resultMap type="com.itheima.mybatis.po.OrdersExt" id="OrdersAndDetailRstMap"
extends="OrdersAndUserRstMap">
<!-- 订单明细信息(一对多) -->
<!-- collection:映射一对多关系 -->
<collection property="detailList" ofType="com.itheima.mybatis.po.Orderdetail">
<id column="detailId" property="id" />
<result column="items_id" property="itemsId" />
<result column="items_num" property="itemsNum" />
</collection>
</resultMap>
<!-- 一对多映射 -->
<select id="findOrdersAndDetailRstMap" resultMap="OrdersAndDetailRstMap">
SELECT
orders.`id`,
orders.`user_id`,
orders.`number`,
user.`username`,
user.`sex`,
orderdetail.`id` detailId,
orderdetail.`items_id`,
orderdetail.`items_num`
FROM
orders,
USER,
orderdetail
WHERE
orders.`user_id` = user.`id`
AND orders.`id` = orderdetail.`orders_id`
</select>
不对我问题问的有问题,商品和标签应该是多对多,不建立中间表怎么实现呢,
多对多最简单的就是建立中间表,因为有了中间表后你要查询的话,只对中间表进行操作就行了,增删的时候会涉及到其他两个表,但在一般的操作中会通过创建中间表的方式管理多对多的关系,这样只需维护中间表就行了,没必要往这种费力还难实现的方向逼自己,我到现在都没有听过去配置这么难的关系,我在hibernate中见过这种多对多的关系,是配置双向多对多,但是一不小心就配置成停不下来的无限循环,人们都是想怎么简单怎么来,连一对多也要配置成多对一,你倒好,怎么难怎么来,哈哈
!表结构就是这样的了图片说明](https://img-ask.csdn.net/upload/201710/19/1508392475_792.png)
UPDATE categories
SET display_order = CASE id
WHEN 1 THEN 3
WHEN 2 THEN 4
WHEN 3 THEN 5
END,
title = CASE id
WHEN 1 THEN 'New Title 1'
WHEN 2 THEN 'New Title 2'
WHEN 3 THEN 'New Title 3'
END
WHERE id IN (1,2,3)
```没试过sql批量,只试过jdbc批量,写出来一定很刺激
ArrayList<GoodsTagEntity> list = new ArrayList<>();
List<String> listgGoodsIds = request.goodsIds;
for (String goodsId : listgGoodsIds) {
List<String> listTagIds = request.tagIds;
for (String tagId : listTagIds) {
GoodsTagEntity goodsTagEntity = new GoodsTagEntity();
goodsTagEntity.setGoodsId(Integer.parseInt(goodsId));
goodsTagEntity.setTagId(Integer.parseInt(tagId));
GoodsTagEntity goodsTag = goodsTagService.getGoodsTagById(goodsId, tagId);
if (goodsTag == null) {
list.add(goodsTagEntity);
} else {
errorCode = ErrorCode.ERR_ARCHIVES_PARAM.value();
}
}
}
response.errorCode = goodsTagService.batchSetGoodsTag(list);
<insert id="add" parameterType="java.util.List">
insert into dt_ec.goods_tag (goods_id,tag_id)
values
<foreach collection="list" item="item" index="index"
separator=",">
(#{item.goodsId},#{item.tagId})
</foreach>
</insert>