CatalogDao中方法参数的疑问

CatalogDao中方法参数的疑问

以下是CatalogDao.java代码,其中最后一个方法( List<Catalog> selectByPid(int pid);)的参数在业务层是

如何拿到的,业务层并没有显示调用该方法。请详细解释一下该方法的执行机制,谢谢!


package com.imooc.icake.dao;

import com.imooc.icake.entity.Catalog;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface CatalogDao {
   @Insert("<script>" +
           "insert catalog(title,pid,info) values"+
           "<foreach collection='list' item='catalog' separator=',' >" +
           "(#{catalog.title},#{catalog.pid},#{catalog.info})"+
           "</foreach>"+
           "</script>")
   @Options(useGeneratedKeys = true,keyProperty = "id")
   void batchInsert(List<Catalog> list);

   @Delete("delete from catalog where id=#{id}")
   void delete(int id);

   @Select("select * from catalog where id=#{id}")
   @Results(id = "all",value = {
           @Result(column = "id",property ="id",id = true),
           @Result(column = "title",property = "title"),
           @Result(column = "pid",property = "pid"),
           @Result(column = "info",property = "info"),
           @Result(column = "id",property = "children",many=@Many(select = "selectByPid") )

})
   Catalog select(int id);

   @Select("select * from catalog where pid=#{pid}")
   @ResultMap("all")
   List<Catalog> selectByPid(int pid);
}

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

4回答
好帮手慕阿满 2020-01-21 14:25:55

同学你好,where查询提交中的pid是指参数pid。 这里的pid是select()方法中的id,如:

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

在运行过程中,mybatis会自动获取column的id给where中pid赋值,所以测试如果去掉selectByPid()方法的参数也是可以正常运行的,但是不建议去掉。

祝:学习愉快~

  • 提问者 慕沐8221787 #1
    mybatis官方文档似乎写得并不详细,除了官方文档外,还有其他的资料可参考吗?麻烦老师推荐一下,谢谢!
    2020-01-21 15:20:22
  • 我会看星星 回复 提问者 慕沐8221787 #2
    mybatis官方文档应该是最权威的说明了,或者你可以看一下这个:https://www.iteye.com/blogs/subjects/mybatis
    2020-01-21 16:44:57
好帮手慕阿满 2020-01-21 10:19:13

同学你好,去掉selectByPid()方法的参数应该是如下形式:

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

在查询时是不一样的,如果有参数,在查询分类时,应该是如下所示:

父分类下只显示该父类的子分类:

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

如果去掉参数,查询分类是如下所示:

父分类下显示所有的分类信息。

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

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

  • 提问者 慕沐8221787 #1
    不是这样的,我的意思是只去掉方法中的形参,注释部分不改动,如下所示: @Select("select * from catalog where pid=#{pid}") @ResultMap("all") List<Catalog> selectByPid(); 这样查询结果与有形参时的查询结果是一样的,请问这是为什么?
    2020-01-21 10:28:03
好帮手慕柯南 2020-01-20 11:00:59

同学你好!

在进行关联查询时,mybatis会将下面的这一列,当做参数传递过去

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

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


  • 提问者 慕沐8221787 #1
    如果主查询用到的条件是title,也就是select * from catalog where title=#{title},此时这个嵌套查询还能正常执行吗?换句话说,如果主查询中的id不是已知的,而是通过主查询得到的,子查询中还能拿到实参吗?
    2020-01-20 12:05:30
  • 好帮手慕柯南 回复 提问者 慕沐8221787 #2
    可以找到的。关联查询时的id并不是service传过来的,而是直接select这个语句的查询结果中的id。祝学习愉快~
    2020-01-20 13:46:34
  • 提问者 慕沐8221787 #3
    我试了一下,去掉子查询List<Catalog> selectByPid(int pid)中的参数项,改为List<Catalog> selectByPid(),结果仍然正确,这是为什么?
    2020-01-20 21:08:41
好帮手慕柯南 2020-01-18 14:17:03

同学你好!

在调用select(int id);方法时,在查询的过程中会调用selectByPid(int pid)方法,这里相当于是关联查询

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

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


  • 提问者 慕沐8221787 #1
    我问的是 List<Catalog> selectByPid(int pid)方法中的实参是从哪里取到的,这个参数传递机制是什么,希望不要经常答非所用。
    2020-01-20 08:19:43
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
Java数据库开发与实战应用2018版
  • 参与学习           人
  • 提交作业       277    份
  • 解答问题       4297    个

Java数据库开发的必备技能,从流行的MySQL数据库开始,到Java原生的数据库管理接口JDBC的使用,再到常用的数据持久化框架MyBatis,让你向Java工程师的目标又迈进了一步!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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