mybatis解决属性名和字段名不一致的问题
提示:这里简述项目相关背景:
例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大)
问题描述:
属性名称和数据库中的字段名称不一致,查询出来的结果为null
Java中的实体类设计:
public class User {
private int id; //id
private String name; //姓名
private String password; //密码和数据库不一样!
//构造
//set/get
//toString()
}
数据库中的表设计:
create table `user`(
`id` INT(20) not null primary key ,
`name` varchar(30) default null,
`pwd` varchar(30) default null
)ENGINE =INNODB default CHARSET =UTF8;
接口
/根据id查询用户
User selectUserById(int id);
mapper映射文件
<select id="selectUserById" resultType="user">
select * from user where id = #{id}
</select>
测试
@Test
public void testSelectUserById() {
SqlSession session = MybatisUtils.getSession(); //获取SqlSession连接
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectUserById(1);
System.out.println(user);
session.close();
}
结果:
-
User{id=1, name=‘狂神’, password=‘null’}
-
查询出来发现 password 为空 . 说明出现了问题!
原因分析:
-
select * from user where id = #{id} 可以看做
-
select id,name,pwd from user where id = #{id}
-
mybatis会根据这些查询的列名(会将列名转化为小写,数据库不区分大小写) , 去对应的实体类中查找相应列名的set方法设值 , 由于找不到setPwd() , 所以password返回null ; 【自动映射】
解决方案:
方案一:为列名指定别名 , 别名和java实体类的属性名一致 .
<select id="selectUserById" resultType="User">
select id , name , pwd as password from user where id = #{id}
</select>
方案二:使用结果集映射->ResultMap 【推荐】
<resultMap id="UserMap" type="User">
<!-- id为主键 -->
<id column="id" property="id"/>
<!-- column是数据库表的列名 , property是对应实体类的属性名 -->
<result column="name" property="name"/>
<result column="pwd" property="password"/>
</resultMap>
<select id="selectUserById" resultMap="UserMap">
select id , name , pwd from user where id = #{id}
</select>