MyBatic,主从表同时写入键值传递
一.抛出问题,在有主从表的结构中,从表的外键引用了主表的主键,在主表插入数据后,需要将主键值传递给从表才能完成从表数据的写入
业务举例:有订单表(主) 和 订单明细表(从),订单表有主键 Id ,订单明细表有外键 “订单Id"
二.解决方案
1.在主表插入数据时,在MyBatis中 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键,而后映射到实体类属性
<!--要有主从表键值传递,useGeneratedKeys必填,置为true,表示插入后返回主键--> <!--keColumn指定数据库主键,代表取出的主键值所在列名,如果当主键列不是表中的第一列的时候,是必须设置--> <!--keyProperty实体类中对应的主键(此处是映射Order表中的id)--> <insert id="add" parameterType="Order" useGeneratedKeys="true" keyColumn="id" keyProperty="id"> insert into mall_order(userid,orderno,orderdate,consignee,phonenum,recaddress,cost,status,paytype,paydate,recdate,onshow) values(#{userId},#{orderNo},#{orderDate},#{consignee},#{phoneNum},#{recAddress},#{cost},#{status},#{payType},#{payDate},#{recDate},#{onShow}) </insert>
2.从表插入不需多余设置
3.使用键值传递
OrderDAO orderDAO = MallUtils.getDAO(OrderDAO.class); //调用add方法时,主键被取出映射到实体中 orderDAO.add(order); OrderDetilsDAO orderDetilsDAO=MallUtils.getDAO(OrderDetilsDAO.class); for (OrderDetils detils:orderDetils){ //取实体中保存的主表主键,赋值给从表中的对它的引用外键 //Order.id---> OrderDetils.orderId detils.setOrderId(order.getId()); orderDetilsDAO.add(detils); }