官方文档:
https://mybatis.net.cn/getting-started.html
1. ResultMap结果集映射
我们之前的实体类UserMapper中属性的名字和数据库字段名是一致的,所以不需要映射,但是当我们实体类中属性名字和数据库中字段不一致的时候,就需要用到ResultMap结果集映射。
1.1 不一致时出现的问题
数据库字段名为id,name,pwd,我现在在实体类中将pwd写成了password,看看会出现什么情况。
User.java,这里省略get和set方法,以及构造器,自行补充完整。
public class User {
private int id;
private String name;
private String password;
}
UserMapper.xml为:
<select id="getUserById" parameterType="int" resultType="user">
select * from user where id = #{id}
</select>
通过id查询用户的时候返回值为:
User{id=4, name='李五', password='null'}
发现password返回值为null。
1.2 解决方式一(不推荐)
改造UserMapper.xml
<select id="getUserById" parameterType="int" resultType="user">
select id,name,pwd as password from user where id = #{id}
</select>
这里使用起别名的方式将pwd转为了password。这样问题即可解决。
1.3 解决方式二(ResultMap结果集映射)
梳理:
数据库中的字段名:id,name,pwd
实体类中的属性名:id,name,password
发现pwd和password不一致,那么我们将pwd映射成password就好了。
修改我们的UserMapper.xml。
<resultMap id="userMap" type="user">
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserById" parameterType="int" resultMap="userMap">
select * from user where id = #{id}
</select>
说明:column对应数据库中的列。property对应实体类中的属性名。
我们之前用的是resultType,返回值是一个类型,这里用的是resultMap,结果集映射。问题也能解决。
重点:这里的id和name本身和数据库一致,其实并不需要映射,我们只需要映射不一致的pwd即可。
最终UserMapper.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxc.dao.UserMapper">
<resultMap id="userMap" type="user">
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserById" parameterType="int" resultMap="userMap">
select * from user where id = #{id}
</select>
</mapper>
2. ResultMap高级结果集映射
ResultMap高级结果集映射通常用于一对多和多对一的场景中。参照我写的这一片文章。
https://blog.csdn.net/weixin_45842494/article/details/122764536