There is no getter for property named '_goods' i报错
来源:7-2 Mybatis注解开发方式(下)
小老哥丶
2020-07-31 23:26:03
接口类:
package com.imooc.mybatis.dao;
import com.imooc.mybatis.entity.Goods;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.SelectKey;
import java.util.List;
public interface GoodsDAo {
//使用Select注释编写sql语句并将@Param映射的变量名称以#{变量名称}填写
@Select("select * from t_goods where current_price between #{min} and #{max} limit 0,#{limit}")
//定义需要传入的变量,并用@Param映射给一个名称,方法的返回类型,就是select语句的返回类型
public List<Goods> selectByPriceRange(@Param("min") float a, @Param("max") float z, @Param("limit") int limit);
@Insert("insert t_goods(title,sub_title,original_cost,current_price,discount,is_free_delivery,category_id) values(#{_goods.title},#{_goods.subTitle},#{_goods.originalCost},#{_goods.currentPrice},#{_goods.discount},#{_goods.isFreeDelivery},#{_goods.categoryId})")
// * SelectKey数据回显查询主键
//statement代表执行用来查询的语句
//before代表执行的顺序是在sql语句之前(true)还是之后(false)
//keyProperty="goodsId",代表那个属性是主键
//resultType=Integer.class,代表返回的主键类型,要写包装对象的类对象
@SelectKey(statement = "select last_insert_id()",before = false,keyProperty="goodsId",resultType=Integer.class)
public int insert(Goods goods);
}测试类:
@Test
public void testInsert() throws Exception {
SqlSession sqlSession=null;
try{
sqlSession=MyBatisUtils.openSession();
Goods goods1=new Goods();
goods1.setTitle("注释添加");
goods1.setSubTitle("副标题");
goods1.setOriginalCost(180f);
goods1.setCurrentPrice(160f);
goods1.setDiscount(0.5f);
goods1.setIsFreeDelivery(1);
goods1.setCategoryId(43);
// 执行后返回本次插入的记录数
GoodsDAo goodsDao=sqlSession.getMapper(GoodsDAo.class);
int num=goodsDao.insert(goods1);
System.out.println(num);
sqlSession.commit();
System.out.println(goods1.getGoodsId());
}catch (Exception e){
if(sqlSession!=null){
sqlSession.rollback();
}
throw e;
}finally {
MyBatisUtils.closeSession(sqlSession);
}
}6回答
同学你好,非常抱歉前面是老师没有表达清楚意思,导致理解有些小误差。
当参数只有一个请求是一个Java Bean的时候是可以不写@Param注解的。就像这里的insert方法,其参数Goods就是一个JavaBean。JavaBean可以看成一种类,对其属性和方法进行了封装。
此时Goods对象直接对属性进行解析,不用再加@Param进行别名的命名。

但是同学在解析属性时,加上了goods,相当于别名的内容,所以要加上@Param进行别名的命名

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
小老哥丶
提问者
2020-08-01
加了Param才不报错

小老哥丶
提问者
2020-08-01
参数名一致也报错:

好帮手慕小班
2020-08-01
同学你好,1、要添加@Param,为什么老师不添加
因为@Param相当于指定sql语句中参数的别名,同学传入的参数是goods,在sql中是_goods,参数名称不一致,需要使用@Param来指定sql中的参数名,老师不用@Param是因为参数名内容是一致的。
2、为什么返回主键是null
同学因为参数不一致,使用了@Param来指定sql中的参数名,对应在主键对应时,也要加上_goods,比如:

如上所示,再来试试。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
小老哥丶
提问者
2020-07-31
还有为什么返回主键是null
小老哥丶
提问者
2020-07-31
找到解决办法了,要添加@Param,为什么老师不添加?
相似问题