作者: 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