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注解