复制代码

为懒人提供无限可能,生命不息,code不止

人类感性的情绪,让我们知难行难
我思故我在
日拱一卒,功不唐捐
  • 首页
  • 前端
  • 后台
  • 数据库
  • 运维
  • 资源下载
  • 实用工具
  • 接口文档工具
  • 登录
  • 注册

mybatis

【原创】mybatis 几种动态SQL复杂使用

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