mybatis mysql int 返回结果为null的解决

错误信息

org.apache.ibatis.binding.BindingException: Mapper method 'com.*******Mapper.countByExample attempted to return null from a method with a primitive return type (int).

对于这个问题,一般情况下在百度找到的答案可参考以下

http://blog.csdn.net/just_lion/article/details/9700793
http://houseyoung.cn/?p=73

原因大多为

  1. mapper.xml文件中配置了select返回值为int,但实际的sql查询结果为null (问题出在mapper.xml的情况)
  2. mapper.xml中对应select语句的返回值为Integer,而mapper.java中接口方法的返回值为int,所以查不到值时,Integer对应的返回值为null无法转换成int (问题出在mapper.java的情况)

总的来说解决方案有两个

  1. 修改mapper.xml文件,对select语句或者返回值进行修改
  2. 修改mapper.java源码,修改出错语句对应的接口方法返回值为可接收null的类型,再于service代码中进行处理

mybatis与pagehelper的组合使用中出现以上异常

参考信息

http://www.jb51.net/article/99537.htm

里面有说到

//获取第1页,10条内容,默认查询总数count
PageHelper.startPage(1, 10);
//紧跟着的第一个select方法会被分页
List list = countryMapper.selectIf(1);

于是乎调用了

PageHelper.startPage(1, 10); 

语句后,下一条select语句将不会时执行mapper.xml中原本的语句,而是被修改后的select语句

于是,若一位粗心的程序员使用了

PageHelper.startPage(1, 10); 

这句分页代码,接下来却以这样的习惯编码,而没有使用PageHelper的page对象

//分页
PageHelper.startPage(page, rows);
//获取结果总数
Integer total = countByExample(example);
//获取当前页结果
List rows = selectByExample(example);

就会导致分页代码对countByExample进行了分页,而没有对selectByExample分页,这样导致的后果就是若总数为零时会报错,同时将无法实现分页功能

MyBatis是一个支持面向对象的持久层框架,可以与各种关系型数据库(如MySQL、Oracle、SQL Server等)结合使用。MySQL是一种常用的关系型数据库管理系统,支持触发器(Trigger)功能。 在MyBatis中使用MySQL触发器可以实现一些特定的业务需求,例如在数据库中插入或更新数据时,触发器可以自动执行一些操作,如记录日志、更新其他表等。 下面是一个简单的示例,演示了如何在MyBatis中使用MySQL触发器。 首先,我们需要在MySQL中创建一个表和一个触发器,用于记录用户的登录信息。 CREATE TABLE user_login ( id INT(11) NOT NULL AUTO_INCREMENT, username VARCHAR(50) NOT NULL, login_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TRIGGER user_login_trigger AFTER INSERT ON user_login FOR EACH ROW BEGIN INSERT INTO log_table (username, action, time) VALUES (NEW.username, 'login', NOW()); END; 上面的触发器定义了在user_login表中插入一条数据时,自动向log_table表中插入一条记录。 接下来,我们需要在MyBatis的Mapper XML文件中配置插入数据的SQL语句。 <insert id="insertUserLogin" parameterType="com.example.UserLogin"> INSERT INTO user_login (username) VALUES (#{username}) </insert> 在Java代码中,我们可以使用MyBatis的SqlSession对象执行insertUserLogin方法。 UserLogin userLogin = new UserLogin(); userLogin.setUsername("john"); sqlSession.insert("insertUserLogin", userLogin); 当执行上面的代码时,MySQL触发器会自动执行,向log_table表中插入一条记录。 总结: 使用MySQL触发器可以在数据库中实现一些自动化的操作,如记录日志、更新其他表等。在MyBatis中使用MySQL触发器需要在MySQL中创建触发器,然后在Mapper XML文件中配置插入数据的SQL语句。执行插入数据的方法时,MySQL触发器会自动执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值