mybatis中resultmap用法问题
代码如下:--------------------------------------------------------------------------------...
代码如下:
---------------------------------------------------------------------------------------------------------------------------------
<resultMap type="Comment" id="CommentResult">
<association property="blog" select="selectBlog" column="blog" javaType="Blog"/>
</resultMap>
<select id="selectComment" parameterType="int" resultMap="CommentResult">
select * from t_Comment where id = #{id}
</select>
<select id="selectBlog" parameterType="int" resultType="Blog">
select * from t_Blog where id = #{id}
</select>
---------------------------------------------------------------------------------------------------------------------------------
问题:在第二个select中的查询条件是where id=#{id}而这个#{id}从哪获得的?根据什么条件把Blog查出来再传给CommentResult中的column的。
类之间的的关系:
Comment类中的属性有“Blog”这个类,而表中Comment和Blog之间关系是以Blog的id关联。
我是想:
先通过Comment_id查到Comment的数据,再在找到的Comment中的blog_id找到blog,最后接口的返回值是一个Comment(这时的Comment类中已经有blog类了)。这样,我需要在接口中传入什么参数? 展开
---------------------------------------------------------------------------------------------------------------------------------
<resultMap type="Comment" id="CommentResult">
<association property="blog" select="selectBlog" column="blog" javaType="Blog"/>
</resultMap>
<select id="selectComment" parameterType="int" resultMap="CommentResult">
select * from t_Comment where id = #{id}
</select>
<select id="selectBlog" parameterType="int" resultType="Blog">
select * from t_Blog where id = #{id}
</select>
---------------------------------------------------------------------------------------------------------------------------------
问题:在第二个select中的查询条件是where id=#{id}而这个#{id}从哪获得的?根据什么条件把Blog查出来再传给CommentResult中的column的。
类之间的的关系:
Comment类中的属性有“Blog”这个类,而表中Comment和Blog之间关系是以Blog的id关联。
我是想:
先通过Comment_id查到Comment的数据,再在找到的Comment中的blog_id找到blog,最后接口的返回值是一个Comment(这时的Comment类中已经有blog类了)。这样,我需要在接口中传入什么参数? 展开
4个回答
展开全部
使用现有的Service接口,或者自己在编写一些用到的接口,手动使用Java代码来分别调用Service接口来查出各个model,然后在业务层将model转换为vo,最后返回给前端json串。
为需求相关的页面定义自己的vo,在vo中只定义前端用到的字段。而不是像第一种方式一样vo中一层一层的嵌套model。然后使用sql语句进行表关联,查询用到的字段。组装为vo直接返回
<resultMap id="checkAccountReturn" type="java.util.HashMap">
<id property="account_id" column="account_id" />
<result property="sub_account_id" column="sub_account_id"/>
<result property="status" column="status"/>
<result property="account_status" column="account_status"/>
<result property="total_count" column="total_count"/>
<result property="sms_sign" column="sms_sign"/>
</resultMap>
<select id="checkSub_account" resultMap="checkAccountReturn">
SELECT account_id,sub_account_id,status,account_status,total_count,sms_sign
FROM sub_account
<where>
<if test="account_id!=null">
account_id=#{account_id}
</if>
<if test="sub_account_id!=null">
and sub_account_id = #{sub_account_id} and status=1 and total_count!=0 and account_status=1
</if>
</where>
</select>
为需求相关的页面定义自己的vo,在vo中只定义前端用到的字段。而不是像第一种方式一样vo中一层一层的嵌套model。然后使用sql语句进行表关联,查询用到的字段。组装为vo直接返回
<resultMap id="checkAccountReturn" type="java.util.HashMap">
<id property="account_id" column="account_id" />
<result property="sub_account_id" column="sub_account_id"/>
<result property="status" column="status"/>
<result property="account_status" column="account_status"/>
<result property="total_count" column="total_count"/>
<result property="sms_sign" column="sms_sign"/>
</resultMap>
<select id="checkSub_account" resultMap="checkAccountReturn">
SELECT account_id,sub_account_id,status,account_status,total_count,sms_sign
FROM sub_account
<where>
<if test="account_id!=null">
account_id=#{account_id}
</if>
<if test="sub_account_id!=null">
and sub_account_id = #{sub_account_id} and status=1 and total_count!=0 and account_status=1
</if>
</where>
</select>
展开全部
难道#{id}不是在mapper里定义的嘛?
接口里写意的这个对应id="selectBlog" 的方法里会定义一个参数
resultMap="CommentResult"
对应<resultMap type="Comment" id="CommentResult">的ID
怎么放进去的 那是mybatis的事
接口里写意的这个对应id="selectBlog" 的方法里会定义一个参数
resultMap="CommentResult"
对应<resultMap type="Comment" id="CommentResult">的ID
怎么放进去的 那是mybatis的事
追问
可能我忘记写类之间的关系了:Comment类中的属性有“Blog”这个类,而表中Comment和Blog之间关系是以Blog的id关联。
我是想:先通过Comment_id查到Comment的数据,再在找到的Comment中的blog_id找到blog,最后接口的返回值是一个Comment(这时的Comment类中已经有blog类了)。这样,我需要在接口中传入什么参数?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你上边贴出来的那段配置应该是没有问题的配置吧?不知道是否已经实现你的目的:查询以后comment类中已经封装好blog类,如果上述配置可以实现此目的,应该是这样实现的association配置里指明了将来属性blog的封装要采用selectblog这句sql执行后的结果,所以实现了你想要的结果。如果上述配置达不到你要的结果,你可以这样配置:
<resultMap type="Comment" id="CommentResult">
<association property="blog" javaType="Blog">
在这里配置你blog类中的各个属性信息
</association>
</resultMap>
这样配置后下边select语句这样配:
<select id="selectComment" parameterType="int" resultMap="CommentResult">
select * from t_Comment where id = #{id}
</select>
此时就不需要在配置selectBlog这条sql语句了,只需要这样就能达到你要的结果。
最后说明一下#{id},id是如何获得的。当你parameterType后面只传递一个参数时,并且该参数是基本数据类型,此时在sql语句的条件位置会自动取这个传过来的参数为值,#{id}并无多大的实际意义。当需要传递多个参数时,此时parameterType="map",此时取值就需要根据map中的key来取值了。
<resultMap type="Comment" id="CommentResult">
<association property="blog" javaType="Blog">
在这里配置你blog类中的各个属性信息
</association>
</resultMap>
这样配置后下边select语句这样配:
<select id="selectComment" parameterType="int" resultMap="CommentResult">
select * from t_Comment where id = #{id}
</select>
此时就不需要在配置selectBlog这条sql语句了,只需要这样就能达到你要的结果。
最后说明一下#{id},id是如何获得的。当你parameterType后面只传递一个参数时,并且该参数是基本数据类型,此时在sql语句的条件位置会自动取这个传过来的参数为值,#{id}并无多大的实际意义。当需要传递多个参数时,此时parameterType="map",此时取值就需要根据map中的key来取值了。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
batis resultMap空值映射问题解决
【南京·10月17日】OSC源创会开始报名:Swift、大型移动项目构架分享 »
Mybatis在使用resultMap来映射查询结果中的列,如果查询结果中包含空值的列(不是null),则Mybatis在映射的时候,不会映射这个字段,例如 查询 name,sex,age,数据库中的age字段没有值,Mybatis返回的map中只映射了 name和sex字段,而age字段则没有包含。
那么如何将age字段映射到map中呢。提供两种解决方法:
使用Mybatis config配置
创建configuration.xml
?
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL MAP Config 3.1//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="callSettersOnNulls" value="true"/>
</settings>
</configuration>
配置Mybatis的SqlSessionFactoryBean
?
1
2
3
4
5
6
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:/META-INF/spring/configuration. xml" />
<property name="mapperLocations"
value="classpath:/META-INF/spring/mybatis/modelMap/*.xml" />
</bean>
在这种配置中,age将以null值映射到map中。
如果想要配置age的默认值,则可以建立一个类,实现Mybatis的TypeHandler接口
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class EmptyStringIfNull implements TypeHandler<String> {
@Override
public String getResult(ResultSet rs, String columnName) throws SQLException {
return (rs.getString(columnName) == null) ? "" : rs.getString(columnName);
}
@Override
public String getResult(ResultSet rs, int columnIndex) throws SQLException {
return (rs.getString(columnIndex) == null) ? "" : rs.getString(columnIndex);
}
<span></span>@Override
public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
return (cs.getString(columnIndex) == null) ? "" : cs.getString(columnIndex);
}
@Override
public void setParameter(PreparedStatement ps, int arg1, String str, JdbcType jdbcType) <span></span><span style="font-size:9pt;line-height:1.5;">throws SQLException {</span><span style="font-size:9pt;line-height:1.5;"> }</span><span style="font-size:9pt;line-height:1.5;">}</span>
继续在resultMap中使用,即可配置age的默认值(上述代码中age的默认值为"")
?
1
2
3
4
5
<resultMap id="list" type="java.util.LinkedHashMap">
<result property="name" column="name" />
<result property="sex" column="sex" />
<result property="age" column="age" typeHandler="com.demo.EmptyStringIfNull"/>
</resultMap>
网上有些资料中提到可以使用 defaultValue 和 nullValue的配置,但是这中配置是ibatis的用法,在Mybatis中已经移除。
参考链接http://stackoverflow.com/questions/22852383/how-to-change-valuenull-to-empty-string-from-query-when-using-mybatis
【南京·10月17日】OSC源创会开始报名:Swift、大型移动项目构架分享 »
Mybatis在使用resultMap来映射查询结果中的列,如果查询结果中包含空值的列(不是null),则Mybatis在映射的时候,不会映射这个字段,例如 查询 name,sex,age,数据库中的age字段没有值,Mybatis返回的map中只映射了 name和sex字段,而age字段则没有包含。
那么如何将age字段映射到map中呢。提供两种解决方法:
使用Mybatis config配置
创建configuration.xml
?
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL MAP Config 3.1//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="callSettersOnNulls" value="true"/>
</settings>
</configuration>
配置Mybatis的SqlSessionFactoryBean
?
1
2
3
4
5
6
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:/META-INF/spring/configuration. xml" />
<property name="mapperLocations"
value="classpath:/META-INF/spring/mybatis/modelMap/*.xml" />
</bean>
在这种配置中,age将以null值映射到map中。
如果想要配置age的默认值,则可以建立一个类,实现Mybatis的TypeHandler接口
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class EmptyStringIfNull implements TypeHandler<String> {
@Override
public String getResult(ResultSet rs, String columnName) throws SQLException {
return (rs.getString(columnName) == null) ? "" : rs.getString(columnName);
}
@Override
public String getResult(ResultSet rs, int columnIndex) throws SQLException {
return (rs.getString(columnIndex) == null) ? "" : rs.getString(columnIndex);
}
<span></span>@Override
public String getResult(CallableStatement cs, int columnIndex) throws SQLException {
return (cs.getString(columnIndex) == null) ? "" : cs.getString(columnIndex);
}
@Override
public void setParameter(PreparedStatement ps, int arg1, String str, JdbcType jdbcType) <span></span><span style="font-size:9pt;line-height:1.5;">throws SQLException {</span><span style="font-size:9pt;line-height:1.5;"> }</span><span style="font-size:9pt;line-height:1.5;">}</span>
继续在resultMap中使用,即可配置age的默认值(上述代码中age的默认值为"")
?
1
2
3
4
5
<resultMap id="list" type="java.util.LinkedHashMap">
<result property="name" column="name" />
<result property="sex" column="sex" />
<result property="age" column="age" typeHandler="com.demo.EmptyStringIfNull"/>
</resultMap>
网上有些资料中提到可以使用 defaultValue 和 nullValue的配置,但是这中配置是ibatis的用法,在Mybatis中已经移除。
参考链接http://stackoverflow.com/questions/22852383/how-to-change-valuenull-to-empty-string-from-query-when-using-mybatis
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询