mybatis映射器配置细则之一(重点:resultMap的使用,特定字段查询)

一、select中字段的映射问题

我们在使用Select的时候可以自定义元素自定义结果集等,非常灵活,比如

<select id="getUser" resultType="user" parameterType="Integer">
        select * from user where id = #{id}
</select>

我们直接从user表中查询一条数据出来,查询的结果是一个user对象,即mybatis会自动帮我们把查询的结果转为一个user对象,那么mybatis在转化的过程中怎么知道数据库的哪个字段对应JavaBean中的哪个属性呢?很简单,只要两者的名称一样,系统就能就能自动识别出来.
在数据库中创建的user表的字段分别为id,username,password,address这三个,实体类的属性也是这四个一模一样,所以系统会自动将查询结果给我们转为User对象,那么在实际开发中,JavaBean中的属性命名我们习惯于驼峰命名法,在数据库中我们更常用下划线命名法,比如我现在创建一个新的实体类User:

public class User {
    private Long id;
    private String userName;
    private String password;
    private String address;
    //省略getter/setter
}

然后创建一个user表,如下:
在这里插入图片描述

注意这个表中有一个字段和实体类的属性名称不一样,就是数据库的user_name字段对应了实体类的userName属性,这样的话,在Select查询结果中,mybatis就没法帮我们自动将查询结果转为user对象了。对于这种非常常见的需求,我们有三种不同的解决方案,分别如下:

1.使用SQL语句中的别名功能

我们可以在查询的时候自动将相关的列名进行修改,如下:

<select id="getUser" resultType="u" parameterType="Long">
        select id,user_name as userName,password,address from user2 where id = #{id}
</select>

2.使用resultMap来解决

我们可以在Mapper中定义resultMap来解决映射问题,比如还是上面那个问题,我可以在userMapper中这样来定义一个resultMap:

<resultMap id="userMap" type="org.sang.bean.User">
        <id property="id" column="id" javaType="long" jdbcType="NUMERIC"/>
        <result property="userName" column="user_name" javaType="string" jdbcType="VARCHAR"/>
        <result property="password" column="password" javaType="string" jdbcType="VARCHAR"/>
        <result property="address" column="address" javaType="string" jdbcType="VARCHAR"/>
 </resultMap>

解释:

  1. resultMap的标签属性中的id是resultMap的唯一标识符,我们后面会在
<select id="getUser" resultMap="userMap">

中引用这个resultMap的标签属性id,然后还定义了type属性,type属性指明了这个resultMap它对应的是哪个JavaBean,这个时候,resultMap每个子标签的property的值对应User类的属性名.
2. 在resultMap子标签中,id表示哪个字段代表这主键,result节点定义了普通的映射关系,这里的property表示JavaBean中的属性名称,column表示数据库中的字段名称,javaType代表JavaBean中该属性的类型,jdbcType则表示数据库中该字段的类型

完整select语句

<select id="getUser" resultMap="userMap" parameterType="Long">
        select * from user2 where id = #{id}
</select>

二、使用resultMap获取表的特定字段

要获得user表中某些字段而不是全部
比如根据id返回password和username只需要修改把resultMap为

<resultMap id="userMap" type="java.util.HashMap">
        <result property="password" column="password" javaType="string" jdbcType="VARCHAR"></result>
        <result property="username" column="username" javaType="string" jdbcType="VARCHAR"></result>

</resultMap>

这里的type改为java.util.HashMap
查询语句为

<select id="findNameAndPassword" resultMap="userMap" parameterType="Integer">
        select username,password from user where id=#{id}
</select>
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会为你提供关于MyBatis使用association标签实现嵌套查询的详细解释。 在MyBatis,association标签常用于处理一对一关系的数据,它允许我们在查询结果嵌套查询其它表的数据。下面是一个使用association标签实现嵌套查询的示例: ``` <resultMap id="userResultMap" type="User"> <id property="id" column="user_id" /> <result property="username" column="username" /> <result property="email" column="email" /> <association property="profile" javaType="Profile"> <id property="id" column="profile_id" /> <result property="firstName" column="first_name" /> <result property="lastName" column="last_name" /> </association> </resultMap> ``` 在上面的示例,我们定义了一个resultMap来映射查询结果到User对象。在这个resultMap,我们使用了association标签来处理User和Profile表之间的一对一关系。具体来说,我们在User对象定义了一个名为profile的属性,它的类型是Profile。然后我们使用association标签来定义Profile对象的映射规则,包括它的id和firstName、lastName等属性。这样,在查询User表时,MyBatis会自动关联查询Profile表,并将查询结果映射到User对象的profile属性。 需要注意的是,在使用association标签时,我们需要确保查询语句包含了所有需要的字段,包括User表和Profile表的字段。否则,MyBatis将无法正确地进行嵌套查询。 希望这个解释对你有所帮助,如果你还有其它问题,可以继续向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值