Mybatis实体类属性名与字段名不相同冲突_4

本文介绍了解决数据库字段名与实体类属性名不一致的问题,提供了两种解决方案:一是通过SQL语句定义字段别名;二是利用MyBatis的<resultMap>标签进行映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开发中,有可能我们表中的字段名和表对应实体类的属性名称不一致!如何解决字段名与实体类属性名不相同的冲突。

一、表及数据

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>

2)mybatis-config.xml文件
	<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提供的解决方式来解决字段名和属性名的映射关系的。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值