在Hibernate中,如果想要更新某一个对象,就需要发送所有的字段给持久化对象,然而实际应用中,大多数情况下都是更新的某一个或几个字段。如果更新的每一条数据都要将其所有的属性都更新一遍,那么其执行效率是非常差的。
有没有办法让程序只更新需要更新的字段呢?
为了解决上述情况中的问题,MyBatis中提供了< set>元素来完成这一工作。
< set>元素主要用于更新操作,其主要作用是在动态包含的SQL语句前输出一个SET关键字,并将SQL语句中最后一个多余的逗号去除。
代码
<update id="updateCustomer" parameterType="com.po.Customer"> update t_customer <set> <if test="username!=null and username!=''"> username=#sername, </if> <if test="jobs!=null and jobs!=''"> jobs=#{jobs}, </if> <if test="phone!=null and phone!=''"> phone=#{phone}, </if> </set> where id=#{id} </update>
在上述配置的SQL语句中,使用了< set>和< if>元素相结合的方式来组装update语句。
其中< set>元素会动态前置SET关键字,同时也会消除SQL语句中最后一个多余的逗号;
< if>元素用于判断相应的字段是否传入值,如果传入的更新字段非空,就将此字段进行动态 SQL 组装,并更新此字段,否则此字段不执行更新。
测试
/** * 更新客户 */ @Test public void updateCustomerTest() { // 获取SqlSession SqlSession sqlSession = MybatisUtils.getSession(); // 创建Customer对象,并向对象中添加数据 Customer customer = new Customer(); customer.setId(3); customer.setPhone("13311111234"); // 执行SqlSession的更新方法,返回的是SQL语句影响的行数 int rows = sqlSession.update("com.itheima.mapper" + ".CustomerMapper.updateCustomer", customer); // 通过返回结果判断更新操作是否执行成功 if (rows > 0) { System.out.println("您成功修改了" + rows + "条数据!"); } else { System.out.println("执行修改操作失败!!!"); } //提交事务 sqlSession.commit(); // 关闭SqlSession sqlSession.close() }
效果图:
