一、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>
解释:
- 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>