学习MyBatis过程中的记录之实体类与表的对应关系

原创 2016年05月31日 14:38:02

之前在网上看到的一个MyBatis做的开源项目,在学习过程中,一直对它的表与实体类之间的对应关系比较困惑。之前一直的印象是数据库中的表与实体类间的关系都是一一对应的,但是这个开源项目中,与表对应的实体包下面,有很多实体类,在动手做了一些修改之后,对此有了一点新的认识,在此记录下来,有不对的地方欢迎大家指正。

在数据库中添加一个培训表sys_train,表中有如下字段

train_id 主键
user_id 外键
position_id 外键
department_id 外键
status 培训状态

当我想在页面上对这个培训表中的数据进行列表展示的时候,如果此时只有一个与表对应的实体类SysTrain.java(在包com.gx.os.entity.train下),代码如下:

<span style="font-family:Microsoft YaHei;font-size:12px;">/**
 * 培训表
 * @author gx
 * @date 创建时间:2016年5月28日 下午4:28:14
 * @version 1.0
 */
@Data
@EqualsAndHashCode(callSuper=false)
public class SysTrain implements Serializable {

	private static final long serialVersionUID = 1L;
	
	/** 培训人员编号 */
	private int trainId;
	/** 用户ID */
	private int userId;
	/** 职位编号(所在职位) */
	private int positionId;
	/** 部门编号(所属部门) */
	private int id;
	/** 培训状态 */
	private int status;

}</span>

那么我在SysTrainMapper.xml中的sql语句可以这样写,先定义一个resultMap,如下

<span style="font-family:Microsoft YaHei;font-size:12px;"><span style="white-space:pre">	</span><resultMap id="SysTrainResult" type="SysTrain">
		<result property="trainId" column="train_id" />
		<result property="userId" column="user_name" />
		<result property="positionName" column="position_name" />
		<result property="id" column="id" />
		<result property="status" column="status" />
<span style="white-space:pre">	</span></resultMap></span>
接着,写SQL语句

<span style="font-family:Microsoft YaHei;font-size:12px;"><span style="white-space:pre">	</span><!-- 查询所有培训职员 -->
	<select id="queryAllSysTrainUser" resultMap="SysTrainResult">
	select * from
	sys_train st
	ORDER BY st.user_id DESC
	</select></span>
下一步在相应的controller中,首先将页面转向trainStaff-list.jsp这个页面,然后调用queryAllSysTrainUser()这个方法,用trainList这个引用来向页面传数据,

<span style="font-family:Microsoft YaHei;font-size:12px;"><span style="white-space:pre">	</span>@RequestMapping("/trainingStaff")
	public ModelAndView queryAllSysTrainUser(HttpServletRequest request,PageEntity page){
		ModelAndView mav = new ModelAndView();
		try {
			page.setPageSize(10);
			mav.setViewName(getViewPath("/admin/system/trainStaff-list"));
			//查询培训人员
			List<SysTrainVo> trainList = sysTrainService.queryAllSysTrainUser();
			//向页面传数据
			mav.addObject("trainList", trainList);
			mav.addObject("page", page);
		} catch (Exception e) {
			logger.error("queryAllSysTrainUser()--error", e);
			mav.setViewName(this.setExceptionRequest(request, e));
		}
		return mav;
	}</span>
现在,我在trainStaff-list.jsp这个页面中,就能通过${trainList.**}这种方式来取得数据库中的数据了,不过由于我们在SysTrainMapper.xml中定义的是resultMap的type是“SysTrain”这个类型的,所以,我们只能取得像${trainList.positionId}、${trainList.departmenId}这样的数据,也就是各种ID,这样的以ID的方式在页面中显示的用户体验很糟糕!

那么,我们能不能取得与这些ID对应的表中的name属性呢?

用职位名称、部门名称来取代职位ID、部门ID来展现在页面中,让人一目了然呢?

答案是肯定的!这个时候就需要另外的一些实体类了,一些看似“多余的”实体类了!

为了让上面的想法实现,我们在同一个实体包com.gx.os.entity.train下再次新建一个实体类SysTrainVo.java类:

<span style="font-family:Microsoft YaHei;font-size:12px;">/** 
 * @author  gx 
 * @date 创建时间:2016年5月29日 下午12:53:49 
 * @version 1.0 
 */
@Data
@EqualsAndHashCode(callSuper=false)
public class SysTrainVo {
	/** 培训人员编号 */
	private int trainId;
	/** 用户名*/
	private String loginName;
	/** 职位名称 */
	private String positionName;
	/** 部门名称 */
	private String name;
	/** 培训状态 */
	private int status;
}</span>
在这个实体类中,用相应表中的name字段来取代id字段,接着,我们在SysTrainMapper.xml中定义一个新的resultMap:

<span style="font-family:Microsoft YaHei;font-size:12px;"><span style="white-space:pre">	</span><resultMap id="SysTrainVoResult" type="SysTrainVo">
		<result property="trainId" column="train_id" />
		<result property="loginName" column="login_name"  />
		<result property="positionName" column="position_name" />
		<result property="name" column="name" />
		<result property="status" column="status" />
	</resultMap></span>
其type为SysTrainVo,property的值、对应类中的属性、对应数据库中的字段名三者都一一对应,这时候,我们的SQL语句可以这样写:

<span style="font-family:Microsoft YaHei;font-size:12px;"><span style="white-space:pre">	</span><!-- 查询所有培训职员 -->
	<select id="queryAllSysTrainUser" resultMap="SysTrainVoResult">
	select train_id,login_name,position_name,name,st.status from
	Sys_Train st
	left join sys_user su on su.user_id = st.user_id
	left join sys_position sp on sp.position_id = st.position_id
	left join sys_department sd on sd.id = st.id
	ORDER BY st.user_id DESC
	</select></span>
用左连接的方式,取得对应表中的name字段的值,同样的,我们在controller中以相同的方式(代码同上),转到trainStaff-list.jsp这个页面,用trainList这个引用来传值,不过不同的是,此时在页面中,我们取到的是${trainList.positionName}、${trainList.departName}这些对应表中的name属性了,在页面上的显示也会以“name”的形式展现,而不是以“ID”这种不直观的方式,附上以“name”形式展示的图:

写到这里,基本上想表达的也差不多了,总的来说,主要有两个方面的收获:

一是,对于多个实体类作用有了进一步的认识;

二是,复习了简单的多表连接查询取数据。





版权声明:本文为博主原创文章,未经博主允许不得转载。

MyBatis之实体类属性与表字段不一致的处理

MyBatis处理表字段与实体类属性不一致
  • u013142248
  • u013142248
  • 2017年02月23日 15:49
  • 3042

MyBatis 笔记(四)——实体类属性和表字段的映射

之前的章节将的实体类属性名和表字段名都是相同的,MyBatis 会自动去映射。那么问题来了,如果实体类属性名和表字段名不相同时,MyBatis 能智能地去映射到吗?答案是:不能。这里用两种解决方案: ...
  • u010376788
  • u010376788
  • 2017年08月23日 22:49
  • 1451

ssm框架学习---mybatis中处理一对一对应关系

1,对于一对一对应关系,有两种方式来实现 (1)一种是使用resultType,这个有一个要求就是查询出来的列和返回的java对象的列的名称需要对应,这里我们想要实现依据订单来查询对应订单的下单用户的...
  • whu_zcj
  • whu_zcj
  • 2016年12月19日 17:16
  • 1233

Mybatis实体类和表映射

Mybatis实体类和表映射在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突。一、准备演示需要使用的表和...
  • u012849872
  • u012849872
  • 2016年06月07日 22:50
  • 15687

MyBatis实体类属性名与数据库字段名不同的解决方案

在使用MyBatis的使用,应该注意实体类的属性名尽量和表的字段名尽量相同,如果不同将会导致MyBatis无法完成数据的封装,但是在软件开发过程中,数据库的创建和软件环境的搭建不可能是同一个人,实体类...
  • CharlesYooSky
  • CharlesYooSky
  • 2017年05月05日 10:22
  • 1137

MySQL 实体间的对应关系

1.单一对应关系 一个实体对应一个实体 例如:一个人的姓名对应一个人的其他不常用信息 设计 : 两个实体表内,存在相同的主键值。 如果记录内的主键值等于另一个关系表内记录的主键值, 则两条...
  • ZzZz_ing
  • ZzZz_ing
  • 2016年10月22日 17:36
  • 523

mybatis(四)——mybatis解决数据库表字段名与实体类属性名不同的冲突

在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体类属性名不相同的冲突。 一、准备演示需要使用的表和数据 CREATE TA...
  • LoveYaozu
  • LoveYaozu
  • 2015年07月21日 22:01
  • 5326

使用Mybatis时实体类属性名和表中的字段名不一致导致结果无法映射到实体类的解决办法

开发中,实体类中的属性名和对应的表中的字段名不一定都是完全相同的,这样可能会导致用实体类接收返回的结果时导致查询到的结果无法映射到实体类的属性中,那么该如何解决这种字段名和实体类属性名不相同的冲突呢?...
  • lsq_java_4
  • lsq_java_4
  • 2017年03月07日 09:31
  • 2265

SpringBoot + Mybatis实体类属性与数据库表列名对应规则

原本是将实体类属性名和数据库表列名保持一致,但是部分列返回null,这些列类似于这种 user_name 在实体类中应该按照如下方式命名属性名 数据库表列:user_name 实体类属性:userNa...
  • lxg2015
  • lxg2015
  • 2017年05月08日 11:25
  • 2074

mybatis框架表与表的关联(一)

自己总结: mybatis和hibernate都有对表与表的支持,对于hibernate有的一些关联方式,比如hibernate的红包吗hbm2ddl(自动更新表结构)对于mybatis是不支持该方...
  • li_Sponge_Crazy_
  • li_Sponge_Crazy_
  • 2016年11月22日 20:40
  • 1348
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学习MyBatis过程中的记录之实体类与表的对应关系
举报原因:
原因补充:

(最多只允许输入30个字)