package com.demo.sys.mapper;
import java.util.List;
import com.demo.sys.entity.Menu;
public interface MenuMapper {
public List<Menu> queryRootMenu(String locale);
public List<Menu> queryChildMenuByRoot(int parentId,String locale);
public Menu queryMenu(Menu menu);
public int addMenu(Menu menu);
}
<select id="queryChildMenuByRoot" resultMap="menuMap">
select a.id,d.language_content as menu_name,a.url,a.module_id,a.isactive,a.createDate,a.updateDate,a.bak1,a.bak2,a.bak3,a.parent_id,a.type,a.orderNum,b.id module_id, b.module_name, b.remark module_remark, b.createdate module_createdate, b.updatedate module_updatedate,c.id parent_id, c.menu_name parent_name, c.url parent_url, c.isactive parent_isactive, c.createdate parent_createdate, c.updatedate parent_,
c.bak1 parent_bak1, c.bak2 parent_bak2, c.bak3 parent_bak3, c.parent_id
from sys_menu a left join sys_module b on a.module_id=b.id left join sys_menu c on a.parent_id=c.id,sys_language_content d
where a.parent_id = #{id}
and a.menu_name = d.language_key
and d.locale = #{locale}
order by a.orderNum asc
</select>
当被调用时, 从日志打印如下:
select a.id,d.language_content as menu_name,a.url,a.module_id,a.isactive,a.createDate,a.updateDate,a.bak1,a.bak2,a.bak3,a.parent_id,a.type,a.orderNum,b.id module_id, b.module_name, b.remark module_remark, b.createdate module_createdate, b.updatedate module_updatedate,c.id parent_id, c.menu_name parent_name, c.url parent_url, c.isactive parent_isactive, c.createdate parent_createdate, c.updatedate parent_,
c.bak1 parent_bak1, c.bak2 parent_bak2, c.bak3 parent_bak3, c.parent_id
from sys_menu a left join sys_module b on a.module_id=b.id left join sys_menu c on a.parent_id=c.id,sys_language_content d
where a.parent_id = NULL
and a.menu_name = d.language_key
and d.locale = NULL
order by a.orderNum asc; (0 milliseconds)
从上面发现a.parent_id = NULL,其实a.parent_id 应该是有值,但是Mybatis映射器没有将参数映射进去。
当我去掉一个参数,如下:
package com.demo.sys.mapper;
import java.util.List;
import com.demo.sys.entity.Menu;
public interface MenuMapper {
public List<Menu> queryRootMenu(String locale);
public List<Menu> queryChildMenuByRoot(String locale);
public Menu queryMenu(Menu menu);
public int addMenu(Menu menu);
}
当调用时候,控制台打印如下:
<select id="queryChildMenuByRoot" resultMap="menuMap">
select a.id,d.language_content as menu_name,a.url,a.module_id,a.isactive,a.createDate,a.updateDate,a.bak1,a.bak2,a.bak3,a.parent_id,a.type,a.orderNum,b.id module_id, b.module_name, b.remark module_remark, b.createdate module_createdate, b.updatedate module_updatedate,c.id parent_id, c.menu_name parent_name, c.url parent_url, c.isactive parent_isactive, c.createdate parent_createdate, c.updatedate parent_,
c.bak1 parent_bak1, c.bak2 parent_bak2, c.bak3 parent_bak3, c.parent_id
from sys_menu a left join sys_module b on a.module_id=b.id left join sys_menu c on a.parent_id=c.id,sys_language_content d
where a.parent_id = 1
and a.menu_name = d.language_key
and d.locale = #{locale}
order by a.orderNum asc
</select>
而这时发现a.parent_id = 1
Mybatis多个参数输入必须为实体对象或者为HashMap类型。 一旦涉及多参数总是要把参数压入到对象或者HashMap中,太麻烦了。
经过多番查找,终于发现解决方法。
多参数传入的时候需要加入:@Param("xxx") int xxx
比如
public List<Menu> queryChildMenuByRoot(int parentId,String locale);
public List<Menu> queryChildMenuByRoot(@Param("parentId") int parentId,(@Param("locale") String locale);
官方文档:
你可以传递多个参数给一个映射器方法。如果你这样做了,默认情况下它们将会以它们
在参数列表中的位置来命名,比如:#{1},#{2}等。如果你想改变参数的名称(只在多参数
情况下),那么你可以在参数上使用@Param(“paramName”)注解。
多参数传入的时候需要加入:@Param("xxx") int xxx
比如
public List<Menu> queryChildMenuByRoot(int parentId,String locale);
public List<Menu> queryChildMenuByRoot(@Param("parentId") int parentId,(@Param("locale") String locale);
官方文档:
你可以传递多个参数给一个映射器方法。如果你这样做了,默认情况下它们将会以它们
在参数列表中的位置来命名,比如:#{1},#{2}等。如果你想改变参数的名称(只在多参数
情况下),那么你可以在参数上使用@Param(“paramName”)注解。