Mybatis批量插入或删除操作可能会遇到的问题以及解决方法

1 篇文章 0 订阅
1 篇文章 0 订阅

一、删除操作

下面是我的dao层,这里插入的是字符数组

在对应的mapper.xml文件中

写入如下语句

其中parameterType是你传入参数的类型,下面的foreach语句是循环输出数组中的数据,主要是collection,因为传入的是数组,所以用的是array,如果用的是传入参数list,parameterType就要写出下面这样,

 

parameterType="java.util.List"

collection改为list

 

二、批量插入操作

这里以Mysql数据库为例,这里先给几个我用到的类,以及定义属性情况

//订单表
@Data
public class Order {
    private String oid; // 主键
    private String ordertime;// 下单时间
    private double total;// 总计金额
    private int status;// 订单状态:1.未付款,2.已付款未发货,3.已发货未确认收货,4.确认收货,交易完成,5.已取消(只要未付款能取消),6.完成全部评价,查看评价;
    private String address;// 收货地址
    private User owner;// 订单所有者
    private List<OrderItem> orderItemList; // 所有订单
}
//订单细节表
@Data
public class OrderItem {
    private String orderItemId;//主键
    private int quantity; //数量
    private double subtotal; //小计
    private Book book; //关联图书
    private int ostatus=0;//该图书是否被评价,0.没有被评价,1.被评价了
    private Order order; //关联订单
}
//图书类
@Data
public class Book {
    private String bid; //主键
    private String bname; //书名
    private String author; //作者
    private double discount; //折扣
    private double price;  //市场价
    private double currPrice; //商城价
    private int viewCount;//浏览次数
    private int sellCount;//销售次数
    private String press; //出版社
    private int pageNum; //页数
    private int wordNum; //字数
    private String printtime;//出版时间
    private String cid;
    private Category category; //所属分类(cid是关联对象的属性)
    private String image_w; //封面大图路径
    private String image_b; //封面小图路径
}

首先我插入的是OrderItem的数据链表,也就是订单详细信息链表,该表有两个关联类,Book和Order,可以用下面方法解决数据库批量插入操作

 @Transactional注解代表事物,意思是让该方法传递给事物管理,订单下有个订单详细信息的List

  /**
     * 创建购物车
     */
    @Transactional
    public void createOrder(Order order) {
        //创建购物车
        orderDao.createOrder(order,order.getOwner().getUid());

        //批量插入购物车详细数据
        List<OrderItem> orderItems=order.getOrderItemList();
        orderDao.addOrderItems(orderItems,order.getOid());
    }

这里是Dao层定义的两个方法,注意第二个方法,链表最好用@Param注解定义好,方便后面<foreach>循环

这里着重展示第二个方法在mapper.xml文件中如何书写

 <!--添加购物车详细信息-->
    <insert id="addOrderItems">
        insert into b_orderitem (orderItemId,quantity,subtotal,bid,bname,currPrice,image_b,oid,ostatus) values
        <foreach collection="orderItems" item="orderItem" separator=",">
            (
            #{orderItem.orderItemId,jdbcType=VARCHAR},
            #{orderItem.quantity,jdbcType=INTEGER},
            #{orderItem.subtotal,jdbcType=DECIMAL},
            #{orderItem.book.bid,jdbcType=VARCHAR},
            #{orderItem.book.bname,jdbcType=VARCHAR},
            #{orderItem.book.currPrice,jdbcType=DECIMAL},
            #{orderItem.book.image_b,jdbcType=VARCHAR},
            #{oid,jdbcType=VARCHAR},
            #{orderItem.ostatus,jdbcType=INTEGER}
            )
        </foreach>
    </insert>

这里有几个注意的点,<foreach>标签中的collection属性就不是上面的array数组了,而是你用@Param注解定义好的属性名,item代表每次循环用的属性名

注意这么一段属性#{orderItem.book.bid,jdbcType=VARCHAR},这里的book,是OrderItem类的引用类型Book的属性名,当你写这个标签是,Mybatis会自动使用orderItem.getBook().getBid()方法,自动帮你获取值,后面的jdbcType请最好写上,防止出问题,等于号后面注意必须全大写,这也是Mybatis规范之一。养成良好的规范,有助于我们的编写的代码优美。

本次分享就到这里啦,谢谢大家观看,也希望能相互学习,在成长道路上,互相勉励。

如果感觉不错的话,请点个赞哦~~~~~~~~~

参考链接:

https://www.jianshu.com/p/a18192e2de32

https://www.cnblogs.com/spiders/p/5835955.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值