`

MyBatis中Association联合select使用

 
阅读更多

Association联合select使用容易出差问题地方

 

mapper配置:

 

	<resultMap type="com.demo.sys.entity.Menu" id="menuMap">
		<id property="id" column="id" />
		<result property="name" column="menu_name" />
		<result property="url" column="url" />
		<result property="active" column="isactive" />
		<result property="createDate" column="createdate" />
		<result property="updateDate" column="updatedate" />
		<result property="bak1" column="bak1" />
		<result property="bak2" column="bak2" />
		<result property="bak3" column="bak3" />
		<result property="locale" column="locale" />
		<result property="orderNum" column="ordernum" />
		<association property="module" column="module_id"  resultMap="moduleMap" select="queryModule">
				</association>
	</resultMap>

 

	<resultMap type="com.demo.sys.entity.Module" id="moduleMap">
		<id property="id" column="id" />
		<result property="name" column="module_name" />
		<result property="remark" column="remark" />
		<result property="createDate" column="createdate" />
		<result property="updateDate" column="updatedate" />
	</resultMap>

 

	<select id="queryModule" resultMap="moduleMap" >
		select * from sys_module where id =#{id}
	</select>

 

 

这种配置导致问题:

Menu.module的属性很多都是为null,除了id不为空。

 

经过调试发现问题出在:

<association property="module" column="module_id"  resultMap="moduleMap" select="queryModule">
				</association>

 

去掉resultMap,修改为:

<association property="module" column="module_id"  select="queryModule">
				</association>

 

 

结果Menu.module的属性可以正确被mybaties设置进去,都有值了。

 

 

 

 

Association联合select使用值得注意的细节地方:

这是我使用mybatis的Association联合select使用存着问题的地方,

 

 

<association property="module" column="module_id"   select="queryModule">
		
		</association>

 

    mybatis会根据类似resultSet.getInt("module_id")的值,压入到select 为queryModule 的SQL输入参数里面。

	<select id="queryModule" resultMap="moduleMap" >
		select * from sys_module where id =#{id}
	</select>

 

  我以前一直纠结于#{id}是指Menu.id还是module的主键或外键id属性。

 

   而select 为queryModule的SQL输入参数可以随便给名称,只要是输入参数与压入进去的值类型相同就行了,可以写成:

  

		select * from sys_module where id =#{jjjasdasdid}

 

不管输入参数名称是什么,mybatis最终会执行:

 效果为:select * from sys_module where id =resultSet.getInt("module_id");

 

 

 

分享到:
评论
8 楼 nnxiaod 2016-12-03  
hackpro 写道
如果你这里有多个参数,怎么传值了
select * from sys_module where id =#{id}  and col2=?


什么场景会这样用啊,对应关系不就应该是通过一个字段关联吗?如果要过滤,是不是应该在外层sql过滤啊。。
7 楼 nnxiaod 2016-12-03  
引用

不管输入参数名称是什么,mybatis最终会执行:
效果为:select * from sys_module where id =resultSet.getInt("module_id");



  
6 楼 a942010 2015-01-07  
哪里调用了返回的结果集是menuMap啊?只有后面一点。
5 楼 Java-feifeiok 2014-08-25  
弄个全点的例子啊!@
4 楼 Java-feifeiok 2014-08-25  
弄个全点的例子啊
3 楼 hackpro 2014-01-17  
hackpro 写道
如果你这里有多个参数,怎么传值了
select * from sys_module where id =#{id}  and col2=?

我找到答案了?

<association property="children" column="parentId=pid,parentLadder=ladder" select="selectByParentId"/>
2 楼 hackpro 2014-01-17  
如果你这里有多个参数,怎么传值了
select * from sys_module where id =#{id}  and col2=?
1 楼 davidhuang 2013-05-30  
select * from sys_module where id =#{jjjasdasdid}  这个sql语句我要传递别的参数咋办,参数不是上一个的结果集获取的,而是外部传来的

相关推荐

Global site tag (gtag.js) - Google Analytics