MyBatis update 标签用于定义更新语句,执行更新操作。当 MyBatis 执行完一条更新语句后,会返回一个整数,表示受影响的数据库记录的行数。
下面我们通过一个示例演示 update 标签的用法。
1. 在 WebsiteMapper.xml 中添加以下更新语句,代码如下。
- <!--update 标签-->
- <update id="updateWebsite" parameterType="string">
- update website set name = #{name}
- </update>
2. 在 WebsiteMapper 接口中增加一个 updateWebsite() 方法,代码如下。
- int updateWebsite(String name);
参数为 String 类型的字符串;返回值为 int 类型,表示执行 sql 语句后受影响的记录的行数。
3. 测试代码如下。
- int i = websiteMapper.updateWebsite("C语言中文网");
- System.out.println("共更新了 " + i + " 条记录");
4.执行测试代码,控制台输出如下。
共更新了 9 条记录
通过控制台输出可知,该更新语句执行后,共影响了 9 条数据库记录。
update 标签常用属性
update 标签常用属性如下表。
属性名称 | 描述 | 备注 |
---|---|---|
id | 它和 Mapper 的命名空间组合起来使用,是唯一标识符,供 MyBatis 调用 | 如果命名空间+ id 不唯一,那么 MyBatis 抛出异常 |
parameterType | 传入 SQL 语句的参数类型的全限定名或别名,它是一个可选属性。 | 支持基本数据类型和 JavaBean、Map 等复杂数据类型 |
flushCache | 该属性用于设置执行该操作后,是否会清空二级缓存和本地缓存,默认值为 true。 | - |
timeout | 该属性用于设置 SQL 执行的超时时间,如果超时,就抛异常。 | - |
statementType | 执行 SQL 时使用的 statement 类型, 默认为 PREPARED,可选值:STATEMENT,PREPARED 和 CALLABLE。 | - |
注意:update 标签中没有 resultType 属性,只有查询操作才需要对返回结果类型进行相应的指定。
传递多个参数
在上面的示例中,我们在更新语句中只使用了一个 String 类型的参数,而在实际的开发过程中,大多数时候,我们的更新语句都需要使用多个参数,Mybatis 为我们提供以下 3 种方式,来实现给映射器传递多个参数:
- 使用 Map 传递参数
- 使用注解传递参数
- 使用 JavaBean 传递参数
使用 Map 传递参数
我们可以将参数封装到一个 Map 对象中,然后传递给 MyBatis 的映射器,示例如下。
1. 在 WebsiteMapper 接口中,定义一个 updateWebsiteByMap() 方法,并使用 Map 传递参数,代码如下。
- int updateWebsiteByMap(Map<String, Object> params);
2. 在 WebsiteMapper.xml 使用 update 标签定义一个 update 语句,并接收通过 Map 传递的参数,代码如下。
- <!--更新语句接收 Map 传递的参数-->
- <update id="updateWebsiteByMap" parameterType="map">
- update website set name = #{name},url= #{url} where id = #{id}
- </update>
3. 测试代码如下。
- //使用 Map 向 update 标签传递参数
- Map<String, Object> params = new HashMap<>();
- params.put("id", 1);
- params.put("name", "编程帮");
- params.put("url", "www.biancheng.net");
- int i = websiteMapper.updateWebsiteByMap(params);
- System.out.println("通过 Map 传递参数,共更新了 " + i + " 条记录");
4. 执行测试代码,控制台输出如下。
通过 Map 传递参数,共更新了 1 条记录
使用注解传递参数
我们还可以使用 MyBatis 提供的 @Param 注解给注解器传递参数,示例如下。
1. 在 WebsiteMapper 接口中,定义一个 updateWebsiteByParam() 方法,并使用 @Param 注解传递参数,方法如下。
- int updateWebsiteByParam(@Param("name") String name, @Param("url") String url, @Param("id") Integer id);
2. 在 WebsiteMapper.xml 中使用 update 标签定义一个 update 语句,并接收通过 @Param 注解传递的参数,配置如下。
- <!--更新语句接收 @Param 注解传递的参数-->
- <update id="updateWebsiteByParam">
- update website set name = #{name},url= #{url} where id = #{id}
- </update>
3. 测试代码如下。
- // 使用@Param 注解传递参数到更新语句中
- String name = "编程帮2";
- String url = "www.biancheng.net";
- Integer id = 2;
- int i = websiteMapper.updateWebsiteByParam(name, url, id);
- System.out.println("通过 @Param 注解传递参数,共更新了 " + i + " 条记录");
4. 执行测试代码,控制台输出如下。
通过 @Param 注解传递参数,共更新了 1 条记录
使用 JavaBean 传递参数
在参数过多的情况下,我们还可以将参数通过 setter 方法封装到 JavaBean(实体类)对象中传递给映射器。
1. 在 WebsiteMapper 接口中,定义一个 updateWebsiteByJavaBean() 方法,并使用 JavaBean 传递参数,方法如下。
- int updateWebsiteByJavaBean(Website website);
2. 在 WebsiteMapper.xml 中使用 update 标签定义一个 update 语句,并接收通过 JavaBean 传递的参数,配置如下。
- <!--更新语句接收 JavaBean 传递的参数-->
- <update id="updateWebsiteByJavaBean" parameterType="net.biancheng.www.po.Website">
- update website set name = #{name},url= #{url} where id = #{id}
- </update>
3. 测试代码如下。
- //使用 JavaBean 传递参数到更新语句中
- Website website = new Website();
- website.setName("编程帮3");
- website.setUrl("www.biancheng.net");
- website.setId(3);
- int i = websiteMapper.updateWebsiteByJavaBean(website);
- System.out.println("通过 JavaBean 传递参数,共更新了 " + i + " 条记录");
4. 执行测试代码,控制台输出如下。
通过 JavaBean 传递参数,共更新了 1 条记录
区别
以上 3 种方式的区别如下:
- 使用 Map 传递参数会导致业务可读性的丧失,继而导致后续扩展和维护的困难,所以在实际应用中我们应该果断废弃该方式。
- 使用 @Param 注解传递参数会受到参数个数的影响。当 n≤5 时,它是最佳的传参方式,因为它更加直观;当 n>5 时,多个参数将给调用带来困难。
- 当参数个数大于 5 个时,建议使用 JavaBean 方式。
本站推荐
-
549
-
526
-
521
-
512
-
503