There is no getter for property named '_goods' i报错

There is no getter for property named '_goods' i报错

接口类:

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进行别名的命名。

http://img1.sycdn.imooc.com//climg/5f24e48109da723817560203.jpg

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

http://img1.sycdn.imooc.com//climg/5f24e625094eac2409690210.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

提问者 小老哥丶 2020-08-01 11:14:39

加了Param才不报错

http://img1.sycdn.imooc.com//climg/5f24de10091d9a2d11600643.jpg

提问者 小老哥丶 2020-08-01 11:12:08

参数名一致也报错:

http://img1.sycdn.imooc.com//climg/5f24dd7e09cef63c12330568.jpg

好帮手慕小班 2020-08-01 10:37:00

同学你好,1、要添加@Param,为什么老师不添加

因为@Param相当于指定sql语句中参数的别名,同学传入的参数是goods,在sql中是_goods,参数名称不一致,需要使用@Param来指定sql中的参数名,老师不用@Param是因为参数名内容是一致的。

    2、为什么返回主键是null

同学因为参数不一致,使用了@Param来指定sql中的参数名,对应在主键对应时,也要加上_goods,比如:

http://img1.sycdn.imooc.com//climg/5f24d53d09ab27aa03070092.jpg

如上所示,再来试试。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

提问者 小老哥丶 2020-07-31 23:37:24

还有为什么返回主键是null

提问者 小老哥丶 2020-07-31 23:28:55

找到解决办法了,要添加@Param,为什么老师不添加?

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师