resultType属性可以指定结果集的类型,它支持基本类型和实体类类型。
需要注意的是,它和parameterType一样,如果注册过类型别名的,可以直接使用别名。
没有注册过的必须使用全限定类名。
同时,当是实体类名称是,还有一个要求,实体类中的属性名称必须和查询语句中的列名保持一致,否则无法实现封装。
当实体类属性和数据库表的列名不一致时:
修改实体类代码:(此时的实体类属性和数据库表的列名已经不一致了)
public class User implements Serializable {
private Integer userId;
private String userName;
private Date userBirthday;
private String userSex;
private String userAddress;
.............
}
数据库列名:
此时若是还是使用原来的映射配置文件
<!-- 配置查询所有操作 -->
<select id="findAll" resultType="com.itheima.domain.User">
select * from user
</select>
执行查询后的结果:
为什么名称会有值呢?
因为 mysql在windows系统中不区分大小写! LInux系统下严格区分大小写
解决思路一:使用别名进行查询
此时 若修改映射配置 使用别名进行查询
<!-- 配置查询所有操作 -->
<select id="findAll" resultType="com.itheima.domain.User">
select id as userId,username as userName,birthday as userBirthday, sex as userSex,address as userAddress from user
</select>
此时可以将结果正常封装进去
解决思路二:resultMap结果类型
resultMap标签可以建立 查询的列名 和 实体类的属性名称 不一致时 建立对应关系。从而实现封装。
在select标签中使用resultMap属性指定引用即可。
同时resultMap可以实现将查询结果映射为复杂类型的pojo,比如在查询结果映射对象中包括pojo和list 实现一对一查询和一对多查询。
定义resultMap
resultMap标签中:
type属性:指定实体类的全限定类名
id属性:给定一个唯一标识,是给查询select标签引用用的。
id标签:用于指定主键字段
result标签:用于指定非主键字段
column属性:用于指定数据库列名
property属性:用于指定实体类属性名称
<!--配置 查询结果的列名 和 实体类的属性名 之间的对应关系--> <resultMap id="userMap" type="com.itheima.domain.User"> <!--主字段的对应--> <id property="UserID" column="id"></id> <!--非主字段的对应--> <result property="userName" column="username"></result> <result property="userBirthday" column="birthday"></result> <result property="userSex" column="sex"></result> <result property="userAddress" column="address"></result> </resultMap>
映射配置
<select id="findAll" resultMap="userMap"> select * from user </select>