sql - mybatis的动态字段insert和IFNULL结合where使用实践

有一个业务sql,它有一些任性,它还有一点麻烦.

首先这个sql的业务通过搜索到该条目上个时间点的一个字段的值,填充回要插入的数据的字段

整体是要根据不同的物品名或其他判定字段,来进行新插入数据的期初数量的填充

这里比如上图 ID 5 的篮球的期初数量是根据上一个时间点的结余数量来填充的

而不能是ID 1羽毛球的结余数量3,也不能是ID 3的不是挨着的上个时间点的结余5

这样再去统计库存的不同时间段区间搜索时就有效了

通过统计不同时间区间的GROUP BY下的物品,来看这个区间的库存量(包含上一个时间的期初数量)

所以上图中,如果搜索到的时间点是介于包含ID4,5,那么当时获取的期初库存就是5,即该物品的ID3时候的结余量

测试通过的SQL:

    <!--物料日志表,这些是可以重复物料名称(mingchengguige)的子数据(详细)-->
    <!--其中期初库存字段插入时,不用判断是否为空,值为写好的子sql,-->
    <!--fachuleixing根据正常发出(出库单),破损发出(破损单),维修发出(维修单)-->
    <!--qichukucun和jieyushuliang不需要判定为空与否,直接新增(首先进行了计算)-->
    <insert id="insertSelective" keyColumn="id" keyProperty="id"
            parameterType="com.tansuo365.test1.bean.WuliaoKucunRiZhi" useGeneratedKeys="true">
        insert into wuliaokucunrizhi
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="mingchengguige != null">
                mingchengguige,
            </if>
            qichukucun,
            <if test="shourushuliang != null">
                shourushuliang,
            </if>
            <if test="fachushuliang != null">
                fachushuliang,
            </if>
            <if test="tuihuishuliang != null">
                tuihuishuliang,
            </if>
            jieyushuliang,
            <if test="jiagongyigong != null">
                jiagongyigong,
            </if>
            <if test="danwei != null">
                danwei,
            </if>
            <if test="wuliaobianma != null">
                wuliaobianma,
            </if>
            <if test="dalei != null">
                dalei,
            </if>
            <if test="rukukufang != null">
                rukukufang,
            </if>
            <if test="xiangmuweihu != null">
                xiangmuweihu,
            </if>
            <if test="fachuleixing != null">
                fachuleixing,
            </if>
            <if test="createtime != null">
                createtime,
            </if>
            <if test="updatetime != null">
                updatetime,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            <if test="mingchengguige != null">
                #{mingchengguige},
            </if>
            IFNULL((select jie.jieyushuliang from
            (select jieyushuliang from wuliaokucunrizhi
            <where>
                <if test="mingchengguige != null and mingchengguige != ‘‘">
                    and mingchengguige = #{mingchengguige}
                </if>
                <if test="rukukufang != null and rukukufang != ‘‘ ">
                    and rukukufang = #{rukukufang}
                </if>
                <if test="dalei != null and dalei != ‘‘ ">
                    and dalei = #{dalei}
                </if>
                <if test="xiangmuweihu != null and xiangmuweihu != ‘‘ ">
                    and xiangmuweihu = #{xiangmuweihu}
                </if>
               and createtime &lt; (select now())
            </where>
            order by createtime desc limit 1) jie),0),
            <if test="shourushuliang != null">
                #{shourushuliang},
            </if>
            <if test="fachushuliang != null">
                #{fachushuliang},
            </if>
            <if test="tuihuishuliang != null">
                #{tuihuishuliang},
            </if>
                IFNULL((select jie.jieyushuliang from
                (select jieyushuliang from wuliaokucunrizhi where createtime &lt;(select now())
                order by createtime desc limit 1) jie),0)
                +IFNULL(#{shourushuliang},0)
                 -IFNULL(#{fachushuliang},0)
                +IFNULL(#{tuihuishuliang},0),
            <if test="jiagongyigong != null">
                #{jiagongyigong},
            </if>
            <if test="danwei != null">
                #{danwei},
            </if>
            <if test="wuliaobianma != null">
                #{wuliaobianma},
            </if>
            <if test="dalei != null">
                #{dalei},
            </if>
            <if test="rukukufang != null">
                #{rukukufang},
            </if>
            <if test="xiangmuweihu != null">
                #{xiangmuweihu},
            </if>
            <if test="fachuleixing != null">
                #{fachuleixing},
            </if>
            <if test="createtime != null">
                #{createtime},
            </if>
            <if test="updatetime != null">
                #{updatetime},
            </if>
        </trim>
    </insert>

注意其中的

 IFNULL((select jie.jieyushuliang from
            (select jieyushuliang from wuliaokucunrizhi
            <where>
                <if test="mingchengguige != null and mingchengguige != ‘‘">
                    and mingchengguige = #{mingchengguige}
                </if>
                <if test="rukukufang != null and rukukufang != ‘‘ ">
                    and rukukufang = #{rukukufang}
                </if>
                <if test="dalei != null and dalei != ‘‘ ">
                    and dalei = #{dalei}
                </if>
                <if test="xiangmuweihu != null and xiangmuweihu != ‘‘ ">
                    and xiangmuweihu = #{xiangmuweihu}
                </if>
               and createtime &lt; (select now())
            </where>
            order by createtime desc limit 1) jie),0),

这段代码是获取上个时间点的结余数量作为新数据的期初库存数量的

同时还有jieyushuliang

            jieyushuliang,

而这段代码是计算了当时的结余数量

                IFNULL((select jie.jieyushuliang from
                (select jieyushuliang from wuliaokucunrizhi where createtime &lt;(select now())
                order by createtime desc limit 1) jie),0)
                +IFNULL(#{shourushuliang},0)
                 -IFNULL(#{fachushuliang},0)
                +IFNULL(#{tuihuishuliang},0),

在下面代码

    <insert id="insertSelective" keyColumn="id" keyProperty="id"
            parameterType="com.tansuo365.test1.bean.WuliaoKucunRiZhi" useGeneratedKeys="true">
        insert into wuliaokucunrizhi
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="mingchengguige != null">
                mingchengguige,
            </if>
            qichukucun,

这里没有进行qichukucun字段的判空,而直接会选定这个字段要进行数据插入

执行结果

==>  Preparing: insert into wuliaokucunrizhi ( mingchengguige, qichukucun, shourushuliang, jieyushuliang, jiagongyigong, danwei, wuliaobianma, dalei, rukukufang, xiangmuweihu ) values ( ?, IFNULL((select jie.jieyushuliang from (select jieyushuliang from wuliaokucunrizhi WHERE mingchengguige = ? and rukukufang = ? and dalei = ? and xiangmuweihu = ? and createtime < (select now()) order by createtime desc limit 1) jie),0), ?, IFNULL((select jie.jieyushuliang from (select jieyushuliang from wuliaokucunrizhi where createtime <(select now()) order by createtime desc limit 1) jie),0) +IFNULL(?,0) -IFNULL(?,0) +IFNULL(?,0), ?, ?, ?, ?, ?, ? )
==> Parameters: 甲板(String), 甲板(String), A(String), 甲类(String), 甲项目1(String), 3.0(Double), 3.0(Double), null, null, 甲供(String), 吨(String), jb1101(String), 甲类(String), A(String), 甲项目1(String)
<==    Updates: 1

注意在这里的数值在数据库中都设定了默认值0

在获取不到期初库存(比如该物品第一条),和其它的字段数值时,会默认填0,也利于了结余的计算

原文地址:https://www.cnblogs.com/ukzq/p/12118380.html

时间: 2024-10-12 19:11:33

sql - mybatis的动态字段insert和IFNULL结合where使用实践的相关文章

mybatis 之动态 SQL

1.动态 SQL 简介: 动态 SQL 是 MyBatis 强大特性之一.极大的简化我们拼装 SQL 的操作. 动态 SQL 元素和使用 JSTL 或者其他类似基于 XML 的文本处理器相似. MyBatis 采用功能强大的基于 OGNL 的表达式来简化操作. - if - choose(when,otherwise) - trim(where,set) - foreach 2.if:判断(要求是携带了哪个字段查询条件,就带上这个字段的值): a.创建一个 EmployeeMapperDynam

(转)mybatis:动态SQL

概述:在mybatis中,动态语句是个非常强大和灵活的功能,并且动态语句可以放在sql的任何地方,利用该功能,我们可以写出非常灵活的代码.在mybatis的动态语句中常常可能会用到以下几个运算和逻辑判断符: 1,"!=" : 表示不等于 2,"=":表示等于.注意是一个等号. 3,"and" : 逻辑与(小写) 4,"or" : 逻辑或(小写) 1 if元素 该元素是我们经常会用到的,常用语判断传入的某个参数是否为null或者

mybatis 使用动态SQL

RoleMapper.java public interface RoleMapper { public void add(Role role); public void update(Role role); public void delete(Role role); public List<Role> getRoleList(Role role); } RoleMapper.xml <?xml version="1.0" encoding="UTF-8&

Mybatis系列---动态SQL

问题: 什么是动态SQL? 动态SQL有什么作用? 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个空格,都会导致错误.Mybatis的动态SQL功能正是为了解决这种问题, 其通过 if, choose, when, otherwise, trim, where, set, foreach,可组合成非常灵活的SQL语句,从而提高开发人员的效率. 下述可知道这四个操作节点中的子节点都是差不多是一样的,insert和update中多了一个selectK

MyBatis的动态SQL详解

MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑,本文详解mybatis的动态sql,需要的朋友可以参考下 MyBatis 的一个强大的特性之一通常是它的动态 SQL 能力.如果你有使用 JDBC 或其他 相似框架的经验,你就明白条件地串联 SQL 字符串在一起是多么的痛苦,确保不能忘了空 格或在列表的最后省略逗号.动态 SQL 可以彻底处理这种痛苦. 通常使用动态SQL不可能是独立的一部分,MyBatis当然使用一种强大的动态SQL语言来改进这种

MyBatis动态SQL————MyBatis动态SQL标签的用法

1.MyBatis动态SQL MyBatis 的强大特性之一便是它的动态 SQL,即拼接SQL字符串.如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦.拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号.利用动态 SQL 这一特性可以彻底摆脱这种痛苦. 通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中. 动态 SQL 元素和

Mybatis的动态Sql

基础部分可以查看我的另一篇博客:http://blog.csdn.net/elim168/article/details/40622491 MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑. MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set foreach if就是简单的条件判断,利用if语句我们可以实现某些简单的条件选择.先来看如下一个例子: Xml代码 <sele

MyBatis探究-----动态SQL详解

1.if标签 接口中方法:public List<Employee> getEmpsByEmpProperties(Employee employee); XML中:where 1=1必不可少 <select id="getEmpsByEmpProperties" resultType="com.mybatis.entity.Employee"> select * from t_employee where 1=1 <if test=&

Mybatis之动态构建SQL语句

今天一个新同事问我,我知道如何利用XML的方式来构建动态SQL,可是Mybatis是否能够利用注解完成动态SQL的构建呢?!!答案是肯定的,MyBatis 提供了注解,@InsertProvider,@UpdateProvider,@DeleteProvider 和@SelectProvider,来帮助构建动态 SQL 语句,然后让MyBatis 执行这些 SQL 语句. 1.@InsertProvider 1.1简单示例使用 创建一个 TutorDynaSqlProvider.java 类,以