mybatis使用if 和foreach, mybatis插入数据返回主键

mybatis使用if进行选择性操作:

我们在修改数据库字段的时候,有可能需要对多个字段同时操作,也又可能需要操作某一个字段,这就需要我们编写多个不同的sql片段进行数据操作,这样就会造成代码的重复编写:
所以这时我们可以使用if进行判断组装sql片段:代码如下:

<update id="updateGoodsByIdAll" parameterType="java.util.HashMap">
        UPDATE `test`.`goods`
            SET 
             <if test="id != null and id != ''">
                `id` = #{id}
             </if>
             <if test="num != null and num != 0">
                ,`num` = #{num}
             </if>
             <if test="price != null">
                ,`price` = #{price}
             </if>

             <if test="statu != null">
                ,`statu` = #{statu}
             </if>

             <if test="name != null">
                ,`name` = #{name}
             </if>

            WHERE
                (`id` = #{id})
    </update>

foreach语法:我们使用使用mybatis的foreach语句主要因为我们传递的参数有可能是一个数组,
语法如下:

<update id="updateGoodsByIdAll2">
        update goods set name='zhangsan' where id in 
        <foreach collection="list" open="(" close=")" separator="," item="ids">
            #{ids}
        </foreach>
    </update>

collection = list : 传输类型为集合
open: 循环以 ( 开始
close: 循环以 ) 结束
separator = “,”: 表示数组元素遍历出来以逗号隔开

ArrayList zhangsan = new ArrayList();
        zhangsan.add(5);
        zhangsan.add(6);
        zhangsan.add(7);
        zhangsan.add(8);
        session.update("com.xingxue.dao.GoodsMapper.updateGoodsByIdAll2", zhangsan);
        session.commit();

我们传入的数组名和sql片段没有任何关系。

对于mybatis来说,还提供了很多比较实用的标签,但是实际实用不多,

where标签就是用于替换我们sql的where的关键字的
<select id="selectGoodsById2" parameterType="java.util.HashMap" resultType="java.util.HashMap">
        select * from goods 
        <where>
            id = #{id}
        </where>
    </select>

set标签就是用于替换我们sql的set关键字的

<update id="updateGoodById3" parameterType="java.util.HashMap">
        UPDATE `test`.`goods`
            <set>
             <if test="id != null and id != ''">
                `id` = #{id}
             </if>
             <if test="num != null and num != 0">
                ,`num` = #{num}
             </if>
             <if test="price != null">
                ,`price` = #{price}
             </if>
             <if test="statu != null">
                ,`statu` = #{statu}
             </if>
             <if test="name != null">
                ,`name` = #{name}
             </if>
            </set> 
            WHERE
                (`id` = #{id})
    </update>

trim用户替换特殊标记:

<update id="updateGoodById4" parameterType="java.util.HashMap">
        UPDATE `test`.`goods`
            <trim  prefix="SET" prefixOverrides=",">

             <if test="num != null and num != 0">
                ,`num` = #{num}
             </if>
             <if test="price != null">
                ,`price` = #{price}
             </if>
             <if test="statu != null">
                ,`statu` = #{statu}
             </if>
             <if test="name != null">
                ,`name` = #{name}
             </if>
            </trim>

            WHERE
                (`id` = #{id})
    </update>

choose就是一个升级版本的if..else

   <choose>     
            <when test="studentName!=null and studentName!='' ">     
                    ST.STUDENT_NAME LIKE CONCAT(CONCAT('%', #{studentName}),'%')      
            </when>     
            <when test="studentSex!= null and studentSex!= '' ">     
                    AND ST.STUDENT_SEX = #{studentSex}      
            </when>     
            <when test="studentBirthday!=null">     
                AND ST.STUDENT_BIRTHDAY = #{studentBirthday}      
            </when>     
           <otherwise>     

            </otherwise>     
        </choose>     

注意if是每个都要判断,choose是满足了一个,其他就不是进行判断。

mybatis插入数据返回主键

mysql返回主键

<insert id="insertGoodsGetId" parameterType="java.util.HashMap">
<!-- 
        ketProperty:返回主键存入的字段名,如果是实体类,在参数对象里面一定要提前准备好goodsI对这个属性,否则就无法获取
        order: 这个id是在数据插入之前获取,还是插入之后获取

     -->
        <selectKey keyProperty="goodsId" order="AFTER" resultType="int">
            SELECT LAST_INSERT_ID() 
        </selectKey>
        INSERT INTO `test`.`goods` (
            `id`,
            `name`,
            `price`,
            `num`,
            `statu`,
            `typeid`,
            `createdate`
        )
        VALUES
            (
                null,
                #{name},
                '300.00',
                '300',
                '1',
                '2',
                '2018-07-10 18:10:13'
            );
    </insert>

java代码:

param.put("goodsId", null);
        param.put("name", "shuyunhao");
        int result = session.insert("com.xingxue.dao.GoodsMapper.insertGoodsGetId", param);
        System.out.println(result);
        System.out.println(param);
        session.commit();

oracle的方式:

<selectKey keyProperty="goodsId" order="AFTER" resultType="int">
            select goods_seq.nextval from dua;
        </selectKey>
        INSERT INTO `test`.`goods` (
            `id`,
            `name`,
            `price`,
            `num`,
            `statu`,
            `typeid`,
            `createdate`
        )
        VALUES
            (
                null,
                #{name},
                '300.00',
                '300',
                '1',
                '2',
                '2018-07-10 18:10:13'
            );
    </insert>

注意,oracle和mysql获取时,执行的sql不一样。

猜你喜欢

转载自blog.csdn.net/sky274548769/article/details/81335596
今日推荐