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,为什么老师不添加?
相似问题