在 SSM 项目中,经常能在 Controller 方法参数中看到类似 mq 这样的变量名,例如 SongerQuery mq、AlbumQuery mq。很多人在项目做到一半时会突然产生疑问:mq 到底是什么?为什么每个模块都有,但类型又不一样?
其实,mq 本质上只是一个普通的 Query 对象变量名,它并不是某种特殊类型,也不存在任何隐藏机制。mq 的类型通常是某个 XxxQuery,例如 SongerQuery、AlbumQuery、SongQuery 等,而 mq 只是这个对象在 Controller 方法中的变量名。
在 SpringMVC 中,当请求到达 Controller 时,请求参数会自动按照名称映射到方法参数对象中。例如访问 /songer/dofindAll?tid=1&isHot=1,SpringMVC 会自动创建一个 SongerQuery 对象,并将 tid 和 isHot 封装进去,这个对象就是 mq。
从职责上看,mq 在项目中通常承担三个角色。第一,它是请求参数的接收者,用来统一接收分页条件和筛选条件,避免 Controller 方法参数过多。第二,它作为查询条件对象被传入 Service 或 Mapper,用于数据库查询。第三,它会被重新放入 model 中,用于页面状态回显,让 JSP 能够知道当前筛选条件是什么。
因此,mq 并不是"歌手""专辑"这样的业务对象,而是一个技术层面的查询上下文对象。不同模块的 mq 类型不同,只是因为查询条件不同,但它们在架构中的位置和作用是完全一致的。
可以把 mq 理解为"当前页面查询状态的载体"。它既参与后端查询逻辑,又承担页面回显的职责,是一种典型的 Query Object 使用模式。