序言:
昨天做一个项目,看到很多刚开始用mybatis的同事对于resultType和resultMap的理解与使用含糊不清,这里我试图用最好理解的说法写一写,欢迎大家勘误。
两者异同:
相同点:resultType和resultMap都是映射结果集到Javabean用的
不同点:
- resultType属于自动映射到javabean,而resultMap是手动映射到Javabean的,其中简单的映射关系可以使用resultType,复杂映射关系的推荐使用resultMap。
- 使用resultMap需要先在mapper.xml中定义resultMap。而resultType则无需定义。
下面我举两个正例、两个反例:
需要映射的JavaBean:User
1 package com.github.hellxz.entity;
2
3 /**
4 * @Author : Hellxz
5 * @Description: 被映射的Javabean,常见的User
6 * @Date : 2018/3/9 8:25
7 */
8 public class User {
9
10 private Long userId;
11 private String username;
12 private String password;
13
14 public String getUsername() {
15 return username;
16 }
17
18 public void setUsername(String username) {
19 this.username = username;
20 }
21
22 public String getPassword() {
23 return password;
24 }
25
26 public void setPassword(String password) {
27 this.password = password;
28 }
29
30 public Long getUserId() {
31 return userId;
32 }
33
34 public void setUserId(Long userId) {
35 this.userId = userId;
36 }
37 }
UserMapper接口定义:
1 package com.github.hellxz.dao;
2
3 /**
4 * @Author : Hellxz
5 * @Description: User的dao接口
6 * @Date : 2018/3/9 8:44
7 */
8 public interface UserMapper {
9
10 User selectByUsername(String username);
11 }
正例:
【resultType正例】:resultType指向具体类型或别名 ✔
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
3 <mapper namespace="com.github.hellxz.dao.UserMapper" >
4 <sql id="Base_Column_List" >
5 user_id, user_name, password
6 </sql>
7 <select id="selectByUsername" resultType="com.github.hellxz.entity.User" parameterType="string" >
8 select
9 <include refid="Base_Column_List" />
10 from user
11 where user_name = #{username}
12 </select>
13
14 </mapper>
【resultMap正例】:resultMap引用定义好的resultMap的id ✔
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
3 <mapper namespace="com.github.hellxz.dao.UserMapper" >
4 <resultMap id="BaseResultMap" type="com.github.hellxz.entity.User" >
5 <id column="user_id" property="userId" jdbcType="BIGINT" />
6 <result column="user_name" property="username" jdbcType="VARCHAR" />
7 <result column="password" property="password" jdbcType="VARCHAR" />
8 </resultMap>
9 <sql id="Base_Column_List" >
10 user_id, user_name, password
11 </sql>
12 <select id="selectByUsername" resultMap="BaseResultMap" parameterType="string" >
13 select
14 <include refid="Base_Column_List" />
15 from user
16 where user_name = #{username}
17 </select>
18
19 </mapper>
反例:
【resultType反例】:使用resultType去引用定义的resultMap ✘
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
3 <mapper namespace="com.github.hellxz.dao.UserMapper" >
4 <resultMap id="BaseResultMap" type="com.github.hellxz.entity.User" >
5 <id column="user_id" property="userId" jdbcType="BIGINT" />
6 <result column="user_name" property="username" jdbcType="VARCHAR" />
7 <result column="password" property="password" jdbcType="VARCHAR" />
8 </resultMap>
9 <sql id="Base_Column_List" >
10 user_id, user_name, password
11 </sql>
12 <select id="selectByUsername" resultType="BaseResultMap" parameterType="string" >
13 select
14 <include refid="Base_Column_List" />
15 from user
16 where user_name = #{username}
17 </select>
18
19 </mapper>
【resultMap反例】:使用resultType去引用定义的resultMap或者引用没有定义的resultMap ✘
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
3 <mapper namespace="com.github.hellxz.dao.UserMapper" >
4 <sql id="Base_Column_List" >
5 user_id, user_name, password
6 </sql>
7 <select id="selectByUsername" resultMap="com.github.hellxz.entity.User" parameterType="string" >
8 select
9 <include refid="Base_Column_List" />
10 from user
11 where user_name = #{username}
12 </select>
13
14 </mapper>