在开发中,有可能我们表中的字段名和表对应实体类的属性名称不一致!如何解决字段名与实体类属性名不相同的冲突。
一、表及数据
create table USERINFOS
(
id NUMBER(8) not null,
uname VARCHAR2(20) not null,
upass VARCHAR2(8) not null
)
alter table USERINFOS add primary key (ID)
insert into USERINFOS (id, uname, upass)
values (1, '冒泡', '8888');
insert into USERINFOS (id, uname, upass)
values (3, '大白熊', '000');
insert into USERINFOS (id, uname, upass)
values (6, 'John', '000');
commit;
二、实体类Userinfo
package com.hlx.entzity;
public class Userinfo {
//Userinfo实体类中属性名和Userinfos表中的字段名是不一样的
private int myid; // id
private String myuname; // uname
private String myupass; // upass
public int getMyid() {
return myid;
}
public void setMyid(int myid) {
this.myid = myid;
}
public String getMyuname() {
return myuname;
}
public void setMyuname(String myuname) {
this.myuname = myuname;
}
public String getMyupass() {
return myupass;
}
public void setMyupass(String myupass) {
this.myupass = myupass;
}
public Userinfo(int myid, String myuname, String myupass) {
super();
this.myid = myid;
this.myuname = myuname;
this.myupass = myupass;
}
public Userinfo() {
super();
}
public Userinfo(int myid) {
super();
this.myid = myid;
}
@Override
public String toString() {
return "Userinfo [myid=" + myid + ", myuname=" + myuname + ", myupass="
+ myupass + "]";
}
}
三、编写代码
1)UserinfoMapper.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.hlx.dao.UserinfoMapper">
<!--1) 根据ID查询用户对象,使用这个查询查询出数据是null
因为实体类的属性名和数据库的字段名对应不上的原因,因此无法查询出对应的记录 -->
<select id="getByid" parameterType="int" resultType="Userinfo">
select * from userinfos where id=#{myid}
</select>
<!--(a)写个sql语句字段别名与属性名一致 OK!-->
<select id="getByidA" parameterType="int" resultType="Userinfo">
select id myid,uname myuname,upass myupass from userinfos where id=#{myid}
</select>
<!--(b) 可以通过<resultMap>映射实体类属性名和表的字段名一一对应关系
-->
<select id="getByidB" parameterType="int" resultType="Userinfo" resultMap="UserinfoMap">
select * from userinfos where id=#{myid}
</select>
<!--通过<resultMap>映射实体类属性名和表的字段名对应关系 -->
<resultMap type="com.hlx.entity.Userinfo" id="UserinfoMap">
<!-- 用id属性来映射主键字段 -->
<id property="myid" column="id"/>
<!-- 用result属性来映射非主键字段 property属性,column列名字段 -->
<result property="myuname" column="uname"/>
<result property="myupass" column="upass"/>
</resultMap>
</mapper>
<typeAliases>
<package name="com.hlx.pojo" />
<package name="com.hlx.entity" /> <!-- 可以配置多个 -->
</typeAliases>
<!-- 将mapper文件加入到配置文件中 -->
<mappers>
<mapper resource="com/hlx/dao/UserinfosMapper.xml" />
<mapper resource="com/hlx/dao/UserinfoMapper.xml" />
</mappers>
3)测试
public class UserTest {
// 日志对象
private Logger logger = Logger.getLogger(UserTest.class);
@Test
public void getId() {
SqlSession session = null;
try {
// 获得会话
session = MyBatisUtil.getSqlSession(true);
/**
* 映射sql的标识字符串, com.hlx.dao.UserinfosMapper是userinfosMapper.
* xml文件中mapper标签的namespace属性的值,
* getUserinfo是select标签的id属性值,通过select标签的id属性值就可以找到要执行的SQL
*/
// 映射sql的标识字符串
String statement = "com.hlx.dao.UserinfoMapper.getByid";
// 执行插入操作
Userinfo userinfos = session.selectOne(statement, 23);
logger.debug("查询数据!");
System.out.println(userinfos);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
session.close(); // 对应一次数据库会话,会话结束必须关闭
}
}
}
执行后的效果:
1、getById方法执行查询后返回一个null。
2、getByIdA方法和getByIdB方法执行查询后可以正常得到想要的结果。
四、总结
解决办法一: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致,这样就可以表的字段名和实体类的属性名一一对应上了,这种方式是通过在sql语句中定义别名来解决字段名和属性名的映射关系的。
解决办法二: 通过<resultMap>来映射字段名和实体类属性名的一一对应关系。这种方式是使用MyBatis提供的解决方式来解决字段名和属性名的映射关系的。