mapper.xml中的添加和修改和删除和参数传递

一、添加

1.遇到能添加但是在在数据库中并没有显示出来:

是因为在以下代码中,会开启事物,要想在数据库中添加到数据,要手动提交事务,

SqlSession sqlSession = sqlSessionFactory.openSession();

手动提交事务:

sqlSession.commit();

还有一种方法就是可以设置自动提交事务,就是将语句写成这个样子,就不需要手动提交事务了。(关闭事务)

SqlSession sqlSession = sqlSessionFactory.openSession(true);

2.如何在数据添加成功后,把id的值也获取出来呢(如何主键返回)

因为在添加数据的时候,并没有设立id值,但是在添加数据的时候,这个id值就会建立了,这时候如何可以获取id值呢:可以用以下方法。(添加属性)

    <insert id="add" useGeneratedKeys="true" keyProperty="uid">
        insert into tb_user (uname,upwd,uage)
        values (#{uname},#{upwd},#{uage});
    </insert>
        userMapper.add(user);
        int uid=user.getUid();
        System.out.println(uid);

二、修改

1.修改全部字段:

    <update id="update1">
        update tb_user set
                uname=#{uname},
                upwd=#{upwd},
                uage=#{uage}
        where uid=#{uid};
    </update>

2.修改动态字段(<set>标签):

主要处理用户可能只想修改单一数据,而其他数据不填写就会为null,但是为null的数据不想再数据库中被修改的问题。

    <update id="update2">
        update tb_user
        <set>
            <if test="uname != null and uname!=''">
                uname=#{uname},
            </if>
            <if test="upwd !=null and upwd!=''">
                upwd=#{upwd},
            </if>
            <if test="uage !=null">
                uage=#{uage}
            </if>
        </set>
         where uid=#{uid};
    </update>

三、删除

1.删除一个

    <delete id="deleteByUid">
        delete from tb_user where uid=#{uid};
    </delete>

2.批量删除

需要一个uid数组作为参数

delete from tb_user where uids in (?,?,?)

但是我们并不知道有多少个uid,不知道要写多少个问号

用foreach遍历:collection属性:指定要遍历的数组,item:遍历出来的每一个元素

separator:分隔符 

<!--注意:mybatis会将数组参数封装成一个Map集合
    默认:array=数组
    如果想修改:可以使用@Param注解,就可以使用uids了
-->
<!--不使用注解的情况:public void deleteByUids(int[] uids);-->
    <delete id="deleteByUids">
        delete from tb_user where uid
        in(
            <foreach collection="array" item="uid" separator=",">
                #{uid}
            </foreach>
                                      )

    </delete>
<!--使用注解的情况:public void deleteByUids(@Param("uids")int[] uids);-->
    <delete id="deleteByUids">
        delete from tb_user where uid
        in(
            <foreach collection="uids" item="uid" separator=",">
                #{uid}
            </foreach>
                                      )

    </delete>

优化代码界面:可以用open="("  close=")"这样就可以不需要原本的括号了

    <delete id="deleteByUids">
        delete from tb_user where uid
        in
            <foreach collection="uids" item="uid" separator="," open="(" close=")">
                #{uid}
            </foreach>

    </delete>

四、参数传递

MyBatis提供ParamNameResolver类来进行参数封装

1.单个参数:

1.POJO类型:直接使用,属性名和参数占位符名称一致

2.Map集合:直接使用,键名和参数占位符名称一致

3.Collection:封装为Map集合

  map.put("arg0",collection集合)

  map.put("collection",collection集合);

4.List:封装为Map集合

  map.put("arg0",list集合);

  map.put("collection",list集合);

  map.put("list",list集合);

5.Array:封装为Map集合

  map.put("arg0",数组);

  map.put("array",数组);

6.其他参数类型:直接使用

2.多个参数:封装为Map集合

情况1:

        /**
     * 多个参数:封装成Map集合
     * map.put("arg0",参数值1)
     * map.put("param1",参数值1)
     * map.put("arg1",参数值2)
     * map.put("param2",参数值2)
     */
    //不写注解的情况
    public User selectBytiaojian2(String uname,String upwd);

<!--Mapper.xml中-->
    <select id="selectBytiaojian2" resultType="com.xxxx.entity.User">
        select * from tb_user
            where uname=#{arg0}
            and upwd=#{param2}
    </select>

如果使用@Param注解,则arg0等相应的名称就会改成@Param中设置的名称。

 建议:都使用@Param注解

 

posted on 2022-10-27 11:19  201812  阅读(1761)  评论(0编辑  收藏  举报