数据库有emp表如下:
假如我想要实现根据eid修改ename的操作。对于此需求,也是修改操作,但是可以明确方法的传入参数只有2个:职员id和新名字。若按照以前的封装成Emp对象的方式进行传参,并不是很合适,可以用更灵活的方式处理:直接进行多参数入参即可,代码可读性高,可以清晰的看到这个方法所需的参数是什么。
当方法参数有多个时,每个参数前都需要增加@Param注解:
public int updateEname(@Param("eid")int id,@Param("ename")String name);
使用注解@Param来传入多个参数,如@Param(“eid”)int id,相当于将该参数id重命名为eid,在映射的SQL中需要 #{注解名称} , 如 #{eid}。
修改EmpMapper.xml,增加id为updateEname的SQL映射,示例如下:
<!-- 根据职员id修改职员名称 -->
<update id="updateEname">
update emp set ename=#{ename} where eid=#{eid}
</update>
最后修改测试类,进行职员名称的修改测试,示例如下:
@org.junit.Test
public void testUpdateEname() {
SqlSession session =null;
try {
session= MyBatisUtils.getSqlSession();
EmpDao ed = session.getMapper(EmpDao.class);
int i = ed.updateEname(45,"竹子");
System.out.println(i>0?"修改成功":"修改失败");
//手动提交事务
session.commit();
} catch (Exception e) {
e.printStackTrace();
}finally {
MyBatisUtils.closeSqlSession(session);
}
}
运行结果如下:
若不使用@Param注解,则会报错,报错信息如下:
探究原因,需要深入MyBatis源码,MyBatis的参数类型为Map,若使用@Param注解参数,那么就会记录指定的参数为key;若参数前没有加@Param,那么就会使用“param”+它的序号作为Map的key。 故在进行多参数入参时,若没有使用@Param指定参数,那么在映射的SQL语句中获取不到#{参数名},从而报错。