加入公司差不多快四个月了,对目前手头上的工作内容基本已经熟悉了,现在要对我手头上的后台管理系统进行一个技术升级,后台管理系统前后端不分离,前端使用的是EXTJS框架,后端使用的事Struts2+spring4+hibetnate4框架,前后端数据交换使用的是JSON,现在要保留前端的框架,将后端的技术更改成springboot+SpringMVC+Spring+Mybatis plus,因为在之前的项目之中有很多地方对于单表的增删改查都用了都用到了hibernate的关系映射,所以如果使用mybatis的话,那么之前的很多方法,都要手写SQL语句,这么多的工作量显然是很难完成的,并且没有什么必要都是一些很简单的东西,没有不要浪费时间去做这些事情,一开始我想的是利用mybatis的逆向工程,但是考虑到项目还有二期、三期很不利维护,然后又同事告诉我可以用mybatis plus,我就去了解了一下,mybatis plus大致就是mybatis的加强版,对于mybatis之前的功能全部保留,并且加入了一些关系映射,专门针对对单表的操作,最主要的是有一个实现接口BaseMapper。

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//package com.baomidou.mybatisplus.core.mapper;import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;public interface BaseMapper<T> {int insert(T entity);int deleteById(Serializable id);int deleteByMap(@Param("cm") Map<String, Object> columnMap);int delete(@Param("ew") Wrapper<T> wrapper);int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);int updateById(@Param("et") T entity);int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);T selectById(Serializable id);List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);T selectOne(@Param("ew") Wrapper<T> queryWrapper);Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);IPage<T> selectPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper);
}

这里面有针对于单表的一些增删改查方法,基本都是根据主键ID来进行一个操作,当然还有以map集合来存储多条件查询的一些方法。有点类似于hibernate的

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.springframework.stereotype.Component;@Component
public class UserRoleDAOImpl extends GenericDAOImpl implements IUserRoleDAO {@Overridepublic void save(UserRole obj) {this.getHibernateTemplate().save(obj);}@Overridepublic void delete(UserRole obj) {this.delete(obj.getId());}@Overridepublic void delete(Integer id) {this.getHibernateTemplate().delete(find(id));}@Overridepublic void update(UserRole obj) {this.getHibernateTemplate().update(obj);}@Overridepublic UserRole find(Integer id) {return getHibernateTemplate().get(UserRole.class, id);}@SuppressWarnings("unchecked")@Overridepublic List<UserRole> find(final String number) {return (List<UserRole>)this.getHibernateTemplate().find("from UserRole j where j.number='" + number + "'");}@Overridepublic List<UserRole> findAll() {return (List<UserRole>)this.getHibernateTemplate().loadAll(UserRole.class);}@Overridepublic Long getRecordNumber() {return (Long)HibernateUtil.currentSession().createQuery("select count(*) from UserRole").uniqueResult();}@SuppressWarnings("unchecked")@Overridepublic List<UserRole> getByDetachedCriteria(DetachedCriteria dCriteria) {return  (List<UserRole>)getHibernateTemplate().findByCriteria(dCriteria);}@SuppressWarnings("unchecked")@Overridepublic List<Object> getObjectsByDetachedCriteria(DetachedCriteria dCriteria) {return (List<Object>)getHibernateTemplate().findByCriteria(dCriteria);}@SuppressWarnings("unchecked")@Overridepublic List<UserRole> getByDetachedCriteria(DetachedCriteria dCriteria,int start,int limit) {return (List<UserRole>)getHibernateTemplate().findByCriteria(dCriteria,start,limit);}@SuppressWarnings("unchecked")@Overridepublic List<UserRole> findByUserId(int id) {return (List<UserRole>)this.getHibernateTemplate().find("from UserRole ur where ur.user.id="+id);}@SuppressWarnings("unchecked")@Overridepublic List<UserRole> find(int roleId, int userId) {return (List<UserRole>)this.getHibernateTemplate().find("from UserRole ur where ur.user.id="+userId+" and ur.roleGroup.id="+roleId+" ");}

然后今天在对之前的技术进行更新的时候遇到了对象的嵌套,大致是有一个有一个角色类里面嵌套了另一个类,这个时候需要用到一对一映射关系,也就是mybatis里面的association标签

package com.yzcm.model;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
/***用户角色表*用户和角色表之间的中间表 * @author Administrator*/
@TableName("yzcm_user_role")
public class UserRole {@TableId(value="cmc_authorid",type= IdType.AUTO)private int id;@TableField("cmc_guid")private String guid;@TableField("cmc_user_id")private User user;            //用户@TableField("cmc_role_group_id")private RoleGroup roleGroup;//角色public int getId() {return id;}public void setId(int id) {this.id = id;}public User getUser() {return user;}public void setUser(User user) {this.user = user;}public RoleGroup getRoleGroup() {return roleGroup;}public void setRoleGroup(RoleGroup roleGroup) {this.roleGroup = roleGroup;}public String getGuid() {return guid;}public void setGuid(String guid) {this.guid = guid;}
}
public class User{@TableId(value="cmc_autoid",type= IdType.AUTO)private int id;@TableField("cmc_guid")private String guid;@TableField("cmc_number")private String number;     //用户编号@TableField("cmc_name")private String name;        //用户名称@TableField("cmc_pwd")private String pwd;          //用户密码@TableField("cmc_roleStr")private String roleStr;      //角色@TableField("cmc_phone")private String phone;        //手机号
@TableName("yzcm_role_group")
public class RoleGroup {@TableId(value="cmc_autoid",type= IdType.AUTO)private int id;@TableField("cmc_guid")private String guid;@TableField("cmc_name")private String name;      //角色名称@TableField("cmc_description")private String description;  //角色描述

在这个类里面有一个类似jpa的一些注解,如果使用mybatis的话,其实是不需要写这些标签的,就是一些字段在加上getset方法,如果使用了@Date标签的话,连getset都不用写,十分的简洁,现在需要这个标签其实就是我之前说的mybatis plus里面加入了一些类似于hibernate的映射关系,专门针对于对于单表的操作。

现在遇到的情况就是这个UserRole这个类对象里面还有一个不仅仅有主键ID和String类型的字段guid 还有一个User对象和RoleGroup对象,但是这只是项目中model的字段,在数据库中存储的是integer类型的id、userid、rolegroupid和String类型的guid,也就是说如果我们写的SQL语句是:select cmc_id,cmc_guid,cmc_userid,cmc_rolegroupid from yzcm_user_role的话我们是无法存储到项目中的UserRole这个对象之中去,而且还会报错,我看了下之前hibernate的写法大致是用映射HQL语句去写的

 @SuppressWarnings("unchecked")@Overridepublic List<UserRole> find(int roleId, int userId) {return (List<UserRole>)this.getHibernateTemplate().find("from UserRole ur where ur.user.id="+userId+" and ur.roleGroup.id="+roleId+" ");}

并且在model之中还有关于映射的标签

 @ManyToOne@JoinColumn(name="cmc_user_id")public User getUser() {return user;}public void setUser(User user) {this.user = user;}@ManyToOne@JoinColumn(name="cmc_role_group_id")public RoleGroup getRoleGroup() {return roleGroup;}public void setRoleGroup(RoleGroup roleGroup) {this.roleGroup = roleGroup;}

所以现在要用到resultMap这个标签

<select id="findByUserId" resultMap="UserRoleResultMap">selectur.cmc_authorid urid,ur.cmc_guid urguid,ur.cmc_role_group_id roleGroupid,ur.cmc_user_id userid,u.cmc_guid ugui,u.cmc_name uname,u.cmc_number unumber,u.cmc_phone uphone,u.cmc_pwd upwd,u.cmc_roleStr uroleStr,rg.cmc_description rgdescription,rg.cmc_guid rgguid,rg.cmc_name rgnamefromyzcm_user_role urleft joinyzcm_user u on u.cmc_autoid = ur.cmc_user_idleft joinyzcm_role_group rg on rg.cmc_autoid = ur.cmc_role_group_idwhereur.cmc_user_id=#{id}
</select>
<resultMap id="UserRoleResultMap" type="com.yzcm.model.UserRole"><id column="urid" property="id"/><result column="urguid" property="guid"/><association property="user" javaType="com.yzcm.model.User"><id column="userid" property="id" /><result column="ugui" property="guid" /><result column="unumber" property="number"/><result column="uname" property="name"/><result column="upwd" property="pwd"/><result column="uroleStr" property="roleStr"/><result column="uphone" property="phone"/></association><association property="roleGroup" javaType="com.yzcm.model.RoleGroup"><id column="roleGroupid" property="id"/><result column="rgguid" property="guid"/><result column="rgname" property="name"/><result column="rgdescription" property="description"/></association>
</resultMap>

1.首先我们要写SQL语句将我们需要的数据都查出来,比如说UserRole里面的id、guid、userid、rolegourpid,然后我们要根据userid和rolegroupid查询出user、rolegroup表里面的数据,我这里用的left join,UserRole里面userid对应user表里面的id,rolegroupid对应rolegroup表里面的id,这样就可以把我们的要的数据全部查询出来。
2.要注意的地方:select标签里面的resultMap要对应我们写resultMap标签里面的id,其次association标签里面的property应该对应的是UserRole里面User对象的对象名称,在我这里是小写的user,UserRole里面RoleGroup对象的对象名称是roleGrouop,而javaType对应的是相应的类的位置。
3.要注意的地方:在SQL语句中最好给不同类的字段起一个别名,比如说User里面的字段可以在前面加一个u,RoleGroup里面的字段可以在前面加一个rg这样的话可以避免出现字段重名的情况,避免mybatis报错,还有就是association表里面最重要的id标签,这个标签一定要写,我们在SQL语句中通过UserRole里面userid就可以查询到,那么left join 的时候就没必要再到user里面去查询了直接在column处写uruserid就行。property里面写我们项目里面的model的字段,不要写数据库里面的字段,利用getset方法或取到具体的参数。

第一次写博客,基本是想到哪就写到哪儿,有点乱,如果感觉文字部分有些不好理解的话,就直接把代码copy下来看吧,别看我的废话了。


今年6月中毕业,7月初找到工作,到目前为止差不多工作四月有余了。

可能是以前大学过的太悠闲了吧,现在有点累。

程序员要不断的学习才能存活下去,真是一刻也不能懈怠啊。

望诸君,共勉。

持久层框架Mybatis Plus的ResultMap标签里的association标签的用法相关推荐

  1. java持久层用文件_Java持久层框架MyBatis简单实例

    MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis .本文 ...

  2. 优秀的持久层框架-Mybatis(上)

    文章目录 前言 一.MyBatis概述 1.1传统JDBC编程 1.2 mybatis的历史 1.3 mybatis是什么? 1.4如何使用? 1.5Mybatis架构 二. MyBatis环境搭建 ...

  3. SSM持久层框架MyBatis,看这一篇就够了

    前言: 此篇仅为个人初期学习笔记,如有错误,请xd们指正 你这么好看,还.... MyBatis 前言 一.MyBatis简介 二.搭建MyBatis项目 1. 开发环境 2. 创建maven工程 3 ...

  4. Java数据持久层框架 MyBatis之背景知识一

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  5. java持久层框架mybatis如何防止sql注入

    2019独角兽企业重金招聘Python工程师标准>>> sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如"or ...

  6. Spring 从入门到精通 (二十) 持久层框架 MyBatis

    关键词:Spring | 整合 | 持久层 | MyBatis 本专栏通过理论和实践相结合,系统学习框架核心思想及简单原理,原创不易,如果觉得文章对你有帮助,点赞收藏支持博主 ✨ 目录 一.MyBat ...

  7. Java数据持久层框架 MyBatis之API学习六(Mapper XML 文件详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  8. Java数据持久层框架 MyBatis之API学习八(Java API详解)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

  9. Java数据持久层框架 MyBatis之API学习五(Mapper XML 文件)

    对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...

最新文章

  1. Spring boot日志使用
  2. 在 .NET Framework 4.0 的程序中使用 .NET Framework 2.0 的程序集
  3. qt串口采用队列_基于STM32的RGB调色器——STM32程序和Qt上位机全开源
  4. toad导入数据_利用TOAD实现EXCEL数据在oracle的导入导出
  5. 光子 量子 DNA计算机的发展情况,科研萌新关于非冯诺依曼结构计算机的一些知识mewo~~...
  6. python学习笔记(自定义库文件路径)
  7. 多线程之线程池-各个参数的含义- 阿里,美团,京东面试题目
  8. linux每日命令(5):mkdir命令
  9. [转] linux下shell中使用上下键翻出历史命名时出现^[[A^[[A^[[A^[[B^[[B的问题解决,Linux使用退格键时出现^H解决方法
  10. linux服务器知识学习:了解Linux系统的启动过程
  11. dpkg-buildpackage: error: debian/rules binary subprocess was killed by signal 2
  12. android 自定义键盘长按事件,Android触发事件总结(触摸屏事件,手势识别,键盘事件,模拟鼠标/按键事件)...
  13. Ubuntu 18.04 安装 Moodle
  14. 【计算机毕业设计】题库管理系统的设计与实现
  15. html css手册,CSS 参考手册
  16. Analyze 命令的使用方法
  17. 天啦噜,项目上使用InputStream,我被坑了一把!
  18. 总结:项管成本管理计算公式
  19. 初二数学勾股定理,八年级上册思维导图简单清晰
  20. DiskGenius 5.4.6.1441 Portable

热门文章

  1. 实现米思齐按键控制LED灯
  2. RTOS 系统篇-统计任务的 CPU 使用率
  3. docker启动sqlserver_使用docker部署SqlServer
  4. 使用share SDK实现腾讯微博授权登录分享(1.x版本)
  5. 设计模式-原型模式与模板方法模式的对比总结
  6. 常用电子元器件知识总结-贴片式
  7. 西安电子科技大学-电磁场与电磁波大作业-生活中的电磁场与电磁波
  8. 扫描电镜下的人体感官结构,超震撼
  9. 有关iOS学习方法拙见
  10. seo优化 什么是关键词密度和关键词堆砌