文章目录
5.1、问题
要解决的问题:属性名和字段名不一致
环境:新建一个项目,将之前的项目拷贝过来
1、数据库user表原有字段
2、Java中的实体类设计
public class User {
private int id; //id
private String name; //姓名
private String password; //密码和数据库不一样!
//构造方法
//set/get
//toString
}
3、接口
User getUserById(int id);
4、mapper映射文件
<select id="getUserById" resultType="com.chen.pojo.User" parameterType="int">
select * from user where id = #{id};
</select>
5、测试
@Test
public void getUserLike(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out.println(user);
sqlSession.commit();
sqlSession.close();
}
结果出现问题:User{id=1, name='张三', password='null'}
分析:
- select * from user where id = #{id} 可以看作
- select id,name,pwd from user where id = #{id}
- MyBatis会根据这些查询的列名(会将列名转化成小写,数据库不区分大小写),去对应的实体类中查找相应列名的set方法设置,由于找不到setPwd(),所以password返回null;【自动映射】
解决方案:
- 方案一:起别名
<select id="getUserById" resultType="com.chen.pojo.User" parameterType="int">
select id,name,pwd as password from user where id = #{id};
</select>
- 方案二:使用结果映射集–>ResultMap【推荐】
<!-- 结果集映射 -->
<resultMap id="UserMap" type="User">
<!-- column对应数据库中的字段,property对应实体类中的属性 -->
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="getUserById" resultMap="UserMap">
select * from user where id = #{id};
</select>
注意:
这里实体类属性和数据库字段不一致的那个property,IDEA可能报红,但是能正常运行,其原因是安装了Mybatis plugin,MybatisX等插件,删掉就正常了。
5.2、resultMap
自动映射
- ResultMap 元素是MyBatis中最重要最强大的元素。它可以让你从90%的JDBC代码中解放出来。
- 实际上,在为一些比如连接的复杂语句编写映射代码的时候,一份ResultMap能够替代实现相同功能的长达数千行的代码。
- ResultMap 的设计思想是,对于简单的语句根本不需要配置显示的结果映射,而对于复杂一点的语句只需要描述它们的关系就行了。
你已经见过简单映射语句的示例了,但并没有显示指定ResultMap。比如:
<select id="selectUserById" resultType="map">
select id , name , pwd
from user
where id = #{id}
</select>
上述语句只是简单地将所有的列映射到HashMap的键上,这由resultType属性指定。虽然在大部分情况下都够用,但是HashMap不是一个很好的模型。你的程序更可能会使用JavaBean或POJO(Plain Old Java Objects,普通老式Java对象)作为模型。
ResultMap最优秀的地方在于,虽然你已经对它相当了解了,但是根本就不需要显式地用到他=们。
手动映射
1、返回值类型为resultMap
<select id="getUserById" resultMap="UserMap">
select * from user where id = #{id};
</select>
2、编写ResultMap,实现手动映射!
<resultMap id="UserMap" type="User">
<!-- column对应数据库中的字段,property对应实体类中的属性 -->
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
id对应的是数据库中的主键字段