首页 > 技术文章 > 【6】mybatis update标签

ywjwest 2021-10-02 16:53 原文

一、update标签

MyBatis update 标签用于定义更新语句,执行更新操作。当 MyBatis 执行完一条更新语句后,会返回一个整数,表示受影响的数据库记录的行数。

如以下xml文件中的语句

 update 标签常用属性

 注意:update 标签中没有 resultType 属性,只有查询操作才需要对返回结果类型进行相应的指定。

二、传递参数

Mybatis提供以下 3 种方式,来实现给映射器传递多个参数:

  • 使用 Map 传递参数
  • 使用注解传递参数
  • 使用 JavaBean 传递参数

2.1 使用 Map 传递参数

1》复制【mybatis尝鲜】这节中的项目代码mybatisDemoA2,生成项目mybatisDemoA5,打开net.biancheng.mapper包下的WebsiteMapper接口类,添加以下方法:

public int updateWebsiteByMap(Map<String, Object> params);

2》打开net.biancheng.mapper包下的WebsiteMapper.xml 中,添加以下配置内容,注意原来内容不要动:

<!--更新语句接收 Map 传递的参数-->
<update id="updateWebsiteByMap" parameterType="map">
update website set name = #{name},url= #{url} where id = #{id}
</update>

3》在net.biancheng.test包添加testMap类,代码如下:

package net.biancheng.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import net.biancheng.mapper.WebsiteMapper;
import net.biancheng.po.Website;

public class testMap {

public static void main(String[] args) {
InputStream config;
try {
// 读取配置文件
config = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder()
.build(config);
// 创建sqlsession对象
SqlSession ss = ssf.openSession();
// 获取指定对象
WebsiteMapper websiteMapper = ss.getMapper(WebsiteMapper.class);
System.out.println("更新前:");
// 调用对象方法
Website websitelist0 = websiteMapper.selectAllWebsite().get(0);
System.out.println(websitelist0.show());

// 使用 Map 向 update 标签传递参数
Map<String, Object> params = new HashMap<>();
params.put("id", 3);
params.put("name", "菜鸟果");
params.put("url", "www.cai.net");
int i = websiteMapper.updateWebsiteByMap(params);
if (i > 0) {
System.out.println("通过 Map 传递参数,共更新了 " + i + " 条记录");
}
System.out.println("更新后:");
// 调用对象方法
Website websitelist1 = websiteMapper.selectAllWebsite().get(0);
System.out.println(websitelist1.show());
ss.commit();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}

}

}

更新前数据库记录如下:

 程序执行结果如下:

 更新后数据库记录如下:

 id为3的记录发生了更新,执行成功.

 2.2 使用注解传递参数

可以使用 MyBatis 提供的 @Param 注解给注解器传递参数

1》打开net.biancheng.mapper包下的WebsiteMapper接口类,添加以下方法,注意原有代码不要动:

public int updateWebsiteByParam(@Param("name") String name,
@Param("url") String url, @Param("id") Integer id);

2》在WebsiteMapper.xml 中,添加以下配置内容,注意原来内容不要动:

<!--更新语句接收 @Param 注解传递的参数 -->
<update id="updateWebsiteByParam">
update website set name = #{name},url= #{url} where id = #{id}
</update>

3》在net.biancheng.test包添加testPara类,代码如下:

package net.biancheng.test;

import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import net.biancheng.mapper.WebsiteMapper;
import net.biancheng.po.Website;

public class testPara {

public static void main(String[] args) {
InputStream config;
try {
// 读取配置文件
config = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder()
.build(config);
// 创建sqlsession对象
SqlSession ss = ssf.openSession();
// 获取指定对象
WebsiteMapper websiteMapper = ss.getMapper(WebsiteMapper.class);
System.out.println("更新前:");
// 调用第3条记录
Website websitelist0 = websiteMapper.selectAllWebsite().get(2);
System.out.println(websitelist0.show());
// 使用@Param 注解传递参数到更新语句中
String name = "果果铺";
String url = "www.ggp.net";
Integer id = 5;
int i = websiteMapper.updateWebsiteByParam(name, url, id);
if (i > 0) {
System.out.println("通过para传递参数,共更新了 " + i + " 条记录");
}
System.out.println("更新后:");
// 调用第3条记录
Website websitelist1 = websiteMapper.selectAllWebsite().get(2);
System.out.println(websitelist1.show());
ss.commit();
ss.close();
} catch (IOException e) {
e.printStackTrace();
}

}

}

4》程序执行结果

更新前数据库记录如图:

  

 

 更新后数据库记录如图所示:

 id为5的记录名称和url更新成功。

 2.3 使用 JavaBean 传递参数

在参数过多的情况下,我们还可以将参数通过 setter 方法封装到 JavaBean(实体类)对象中传递给映射器

方法过程与insert中使用javabean传递参数相同,思路是先在接口类中创建方法,然后在WebsiteMapper.xml文件中创建id为刚才方法名称的sql语句,最后在test类中测试执行,在此不详细写了。

以上 3 种方式的区别如下:

  • 使用 Map 传递参数会导致业务可读性的丧失,继而导致后续扩展和维护的困难,所以在实际应用中我们应该果断废弃该方式。
  • 使用 @Param 注解传递参数会受到参数个数的影响。当 n≤5 时,它是最佳的传参方式,因为它更加直观;当 n>5 时,多个参数将给调用带来困难。
  • 当参数个数大于 5 个时,建议使用 JavaBean 方式。

本节代码mybatisDemoA5,下节继续。

推荐阅读