学习MyBatis过程中的记录之实体类与表的对应关系
来源:互联网 发布:淘宝卖家微淘入口 编辑:程序博客网 时间:2024/05/02 04:44
之前在网上看到的一个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 * fromsys_train stORDER 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 fromSys_Train stleft join sys_user su on su.user_id = st.user_idleft join sys_position sp on sp.position_id = st.position_idleft join sys_department sd on sd.id = st.idORDER BY st.user_id DESC</select></span>用左连接的方式,取得对应表中的name字段的值,同样的,我们在controller中以相同的方式(代码同上),转到trainStaff-list.jsp这个页面,用trainList这个引用来传值,不过不同的是,此时在页面中,我们取到的是${trainList.positionName}、${trainList.departName}这些对应表中的name属性了,在页面上的显示也会以“name”的形式展现,而不是以“ID”这种不直观的方式,附上以“name”形式展示的图:
写到这里,基本上想表达的也差不多了,总的来说,主要有两个方面的收获:
一是,对于多个实体类作用有了进一步的认识;
二是,复习了简单的多表连接查询取数据。
0 0
- 学习MyBatis过程中的记录之实体类与表的对应关系
- ###### 有关联关系的【多表对应实体类的编写步骤】+ssh注解。实例:crm实体编写过程
- mybatis 中的 jdbcType与javaType的对应关系
- mapping文件的编写(以及实体类与xml中类型的对应关系)
- MyBatis学习之解决字段名与实体类属性名不相同的冲突
- Hibernate 中的表与实体域模型的关系
- 框架学习之hibernate-02实体与实体之间的关系
- Hibernate总结之二实体与表的映射关系
- Mybatis学习笔记:(二) java中的实体(对象、List、Set)关系怎样与数据库关联映射
- abap学习笔记-SAP字段与表的对应关系
- Mybatis中JDBC type与Java type的对应关系
- 数据库中实体的对应关系
- MySQL 实体间的对应关系
- Hibernate的实体对应关系总结
- 【Mybatis】 JdbcType 与 JavaType对应关系
- mybatis中javaType与jdbcType对应关系
- Hibernate 之实体类之间的关系
- Access 中的数据类型与 ADO中的数据类型的 对应关系
- ReactNative图片
- 第12周课后实践(1)
- 关于FM1208之类的CPU卡的总结说明
- 新眼保操
- Linux下安装配置FastDFS
- 学习MyBatis过程中的记录之实体类与表的对应关系
- Codeforces Round #353 (Div. 2) E. Trains and Statistic
- ARM平台device tree是如何工作的?(一)
- 总结libevent安装方法
- 第十四周项目一 排序函数模板
- shell 两数相减取正值
- 【JAVA】JAVA调用浏览器打开链接代码
- ViewPager小圆点的绘制及用法
- 【JavaWeb开发】HTML/JSP中嵌入CSS样式表(相对路径)