作者: whooyun发表于: 2023-03-10 00:05
体验几种复杂动态SQL的使用
场景:查询某一个级别下的所有子集(cat_no具有特征01 01 01 特征)
SELECT
*
FROM
acv_gds_category
WHERE
corp_id = ?
AND is_deleted = ?
AND (
cat_no LIKE CONCAT( '',?, '%' )
OR cat_no LIKE CONCAT( '',?, '%' )
OR cat_no LIKE CONCAT( '',?, '%' )
)
xml
<select id="selectLikeCatNos" resultType="com.zbw.saas.data.archives.goods.entity.AcvGoodsCategory">
select * from acv_gds_category where corp_id = #{corpId} and is_deleted = #{isDeleted}
<foreach collection="list" item="item" open="AND (" close=")" separator="or" >
cat_no like CONCAT('',#{item},'%')
</foreach>
</select>
##############################################################################
Mybatis数据插入
场景:门店A商品同步给门店B,方便门店B迅速开店
方案:批量插入
SQL代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.whooyun.mapper.OrgGoods">
<insert id="insertOrgGoods">
INSERT INTO org_goods(id, name)
VALUES
<foreach collection ="goodsList" item="goods" separator =",">
(#{goods.name}, #{goods.name})
</foreach>
</insert>
</mapper>
优点:减少了数据库连接资源的消耗,网络的消耗(为了平衡数据库资源,网络资源,内存资源性价比,建议还是需要限制批量插入条数)
Mybatis数据更新
场景:门店夏季商品在冬季下架禁卖,某些分类id更新成上架,某些分类更新成下架
方案:批量更新,这种方式最简单,就是用foreach组装成多条update语句,但Mybatis映射文件中的sql语句默认是不支持以" ; " 结尾的,也就是不支持多条sql语句的执行。所以需要在连接mysql的url上加 &rewriteBatchedStatements=true 这个才可以执行。
SQL代码
<update id="updateBatchById">
<foreach collection="list" item="item" separator=";">
update
`org_goods`
set
`status` = #{item.status},
`update_time` = #{item.updateTime}
where
cat_id= #{item.id}
</foreach>
</update>
优点:减少了数据库连接资源的消耗,网络的消耗(为了平衡数据库资源,网络资源,内存资源性价比,建议还是需要限制条数,毕竟条数越多,涉及事务越大,容易影响数据库性能)
场景:根据多品牌,单分类id,修改机构商品生命周期及状态 结构:俩层for循环
update org_goods set status = #{item.status} where `cat_id` = #{item.catId} and `brand` in #{brand}
jdbc:mysql://127.0.0.1:3306/user_demo?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=false&useUnicode=true&useSSL=false&serverTimezone=UTC 业务应用需要缓存批量的SQL语句到内存中,最明显的特征就是jvm的堆内存会大幅度上升,容易造成jvm的频繁GC,SWT,影响业务应用的稳定性,尤其是没设置jvm参数,更加可能导致整个服务器崩溃
启用:批处理语句 rewriteBatchedStatements=true