mybatis的dao层接口方法需要设置返回值类型吗?

例如
int insertUser
int updateUser
int deleteUser
我试过了,如果这些操作失败,例如insertUser时ID重复,会直接抛异常的,根本不会返回0.所以这里的int还有必要吗?

阅读 1.4k
avatarAI BotBETA

是的,MyBatis的DAO层接口方法通常需要设置明确的返回值类型,即使这些操作(如insertupdatedelete)在大多数数据库操作库中通常返回受影响的行数。

在MyBatis中,对于insertupdatedelete操作,返回值通常是一个整数(int),表示受影响的行数。这个返回值对于判断操作是否成功执行非常有用。例如,如果你尝试插入一个用户,但是由于ID重复导致插入失败,理论上数据库操作应该返回0(表示没有行被影响),而不是直接抛出异常。然而,是否抛出异常还取决于你的MyBatis配置和数据库的行为。

  • 返回0的情况:如果操作没有成功影响任何行(如ID重复导致插入失败),则应该返回0。
  • 异常处理:MyBatis本身可能不会直接因为操作失败(如ID重复)而抛出异常,但这取决于你的SQL配置和数据库的错误处理机制。有些情况下,数据库可能会因为违反约束(如唯一约束)而抛出异常,MyBatis会将这个异常传递给调用者。
  • 使用返回值进行判断:即使MyBatis可能因为操作失败而抛出异常,使用返回值进行判断仍然是一个好习惯。它可以帮助你更精确地了解操作的结果,尤其是在你不确定数据库或MyBatis配置是否会抛出异常的情况下。

因此,即使你的操作可能会因为某些原因失败,并且MyBatis可能会抛出异常,设置明确的返回值类型(如int)仍然是有必要的。这样,你可以通过返回值来判断操作是否成功执行了预期的数据库更改。

public interface UserMapper {
    int insertUser(User user); // 返回插入的行数
    int updateUser(User user); // 返回更新的行数
    int deleteUser(int userId); // 返回删除的行数
}

在调用这些方法时,你可以检查返回值来确认操作是否按预期执行。如果返回值与预期不符(例如,insert操作返回了0),你可以根据应用的需要进行相应的错误处理。

1 个回答
✓ 已被采纳

对于<insert></insert>标签来说,返回的int值一般这么几个范围,这是sql规范,与MyBatis无关

  • >0 新增的行数,尤其是批量新增时
  • 0 表示未命中,无操作,例如INSERT INTO table_name (column1, column2) VALUES (value1, value2) ON DUPLICATE KEY UPDATE column1 = column1;未新增未更新,未命中
  • <0 取决于JDBC驱动具体实现,一般-1是唯一性约束

<update></update>还有<delete></delete>类似

至于你说的报错,那是因为JDBC侧,将异常往上抛了,被MyBatis包装了,实际返回值还是有的,你如果单纯从MyBatis侧讨论,除了updatedelete时的是否命中有点用,其他基本没用,但是在sql层面,写SQL脚本,存储过程,这些返回值都有有很大作用的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏