前提需求
在最近几天的业务需求中,遇到了将list数据插入到数据库中,或者是将list中的数据查询出来,查询的话,我第一个想法就是写个简单的sql语句,在循环中执行sql语句,但是这样会消耗很大,不能这样使用,那么就只能将循环写到sql语句中。自然就想到用mybatis中动态sql,foreach。
具体的代码讲解
InventoryDetail
@Table(name = "t_inventory_detail")
public class InventoryDetail {
/**
* 主键ID
*/
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
/**
* 盘点头表ID
*/
@Column(name = "inventory_header_id")
private Integer inventoryHeaderId;
/**
* 盘点履历表ID
*/
@Column(name = "inventory_resume_id")
private Integer inventoryResumeId;
/**
* 商品ID
*/
@Column(name = "product_id")
private Integer productId;
/**
* 在库数量
*/
@Column(name = "stock_quantity")
private Integer stockQuantity;
/**
* 在库单价
*/
@Column(name = "stock_price")
private Long stockPrice;
/**
* 创建时间
*/
@Column(name = "create_date")
private Date createDate;
/**
* 创建人ID
*/
@Column(name = "create_user_id")
private Integer createUserId;
/**
* getter 和 setter 方法
*/
}
mapper
public interface InventoryDetailMapper {
/**
* 插人数据到盘点详情表
*
*/
@Insert("<script> " +
"insert into t_inventory_detail (inventory_header_id, product_id, stock_quantity, stock_price, create_date, create_user_id)" +
" values " +
" <foreach collection='list' item='inventoryDetail' separator=','>" +
" (#{inventoryDetail.inventoryHeaderId}," +
" #{inventoryDetail.productId}," +
" #{inventoryDetail.stockQuantity}," +
" #{inventoryDetail.stockPrice}," +
" #{inventoryDetail.createDate}," +
" #{inventoryDetail.createUserId})" +
"</foreach> " +
"</script>")
Integer insertInventoryDetail(@Param("list") List<InventoryDetail> list);
}
这是用注释写的sql,你也可以改成用xml文件写的。语句都差不多。如下:
<insert id="insertInventoryDetail" parameterType="java.util.List" useGeneratedKeys="false">
insert into t_inventory_detail
( inventory_header_id, product_id, stock_quantity, stock_price, create_date, create_user_id)
values
<foreach collection="list" item="inventoryDetail" separator=",">
(
#{
inventoryDetail.inventoryHeaderId},
#{
inventoryDetail.productId},
#{
inventoryDetail.stockQuantity},
#{
inventoryDetail.stockPrice},
#{
inventoryDetail.createDate},
#{
inventoryDetail.createUserId}}
)
</foreach>
</insert>
</mapper>
注意:foreach中的条件与你的sql语句相对应。
小结
查询跟插入是差不多的。看着语句进行改写即可。