6 字段和属性不一致的问题
6.1 问题展示
在JDBC中,我们遇到过数据库表名和Java的类的属性不一致问题,接下来我们修改一下项目,重现这个问题:
我们知道我们数据库表user
字段为:id
、name
、pwd
mysql> SHOW COLUMNS FROM user;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | varchar(30) | YES | | NULL | |
| pwd | varchar(30) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
接下来我们来修改对应类User的属性,将pwd
改为password
public class User {
private int id;
private String name;
private String password;
}
执行我们的测试方法
public class UserMappingTest {
@Test
public void test() {
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserMapping mapper = sqlSession.getMapper(UserMapping.class);
User user = mapper.getUserById(1);
System.out.println(user);
sqlSession.close();
}
}
结果为
User{id=1, name='狂神', password=null}
可以看到password
这一列的值为null
,那么我们该如何解决这个问题呢?
执行SQL语句的时候利用别名
<select id="getUserById" resultType="com.cap.pojo.User" parameterType="int">
SELECT id, name, pwd password FROM mybatis.user
WHERE id = #{id};
</select>
这种方式相信你在学习JDBC的时候也用过,那么接下来来介绍MyBatis中的另外种方式!
6.2 结果映射 ResultMap
- ResultMap在MyBatis是一种很强大而且十分好用的元素。它的设计理念是:
The design of the ResultMaps is such that simple statements don’t require explicit result mappings at all, and more complex statements require no more than is absolutely necessary to describe the relationships. ResultMap 的设计思想是,对简单的语句做到零配置,对于复杂一点的语句,只需要描述语句之间的关系就行了。
下面我们来使用ResultMap来解决字段和属性不一致的问题
首先创建resultMap
<resultMap id="userResultMap" type="user">
<!-- column对应数据库表中字段,property对应实体类中属性 -->
<result column="id" property="id"></result>
<result column="name" property="name"></result>
<result column="pwd" property="password"></result>
</resultMap>
id
:当前命名空间的唯一标识符,可以用来引用当前的resultMap
type
:一个Java类的全限定类名,或者一个类的别称
创建resultMap
后就在<select>
中直接引用了,并且去掉原来的resultType
<select id="getUserById" resultMap="userResultMap" parameterType="int">
SELECT id, name, pwd FROM mybatis.user
WHERE id = #{id};
</select>