Mybatis关联查询之一
MyBatis的关联查询之一对多,多对一
在关系型数据库中,我们经常要处理一对多,多对一和多对多的关系。
一对多,多对一
一、entity 实体类
public class SmbmsRole {
private long rid;
private String roleCode;
private String roleName;
//泛型集合
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
public long getRid() {
return rid;
}
public void setRid(long rid) {
this.rid = rid;
}
public String getRoleCode() {
return roleCode;
}
public void setRoleCode(String roleCode) {
this.roleCode = roleCode;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
}
public class User {
private Integer uid;
private String userCode;
private String userName;
//关联一的一方
private SmbmsRole role;
public SmbmsRole getRole() {
return role;
}
public void setRole(SmbmsRole role) {
this.role = role;
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUserCode() {
return userCode;
}
public void setUserCode(String userCode) {
this.userCode = userCode;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
二、dao层
//一对多
//根据角色获取所对应的人
SmbmsRole getroleId(Integer rid); //多对一 查询所有用户信息
List<User> getUserList();
三、小配置 xml
<!--一对多-->
<!--由于是关联查询 返回的是多张表中的结果集,必须定义resultMap映射-->
<resultMap id="SmbmsRoleMaps" type="com.marketsys.entity.SmbmsRole">
<id column="rid" property="rid"></id>
<!--此处使用的是collection节点,由于在SmbmsRole类中插入的是List集合
ofType:为集合中的泛型-->
<collection property="users" ofType="User" select="getroleIdMutilSQL" column="rid">
<!--在collection中声明Provincial中的属性与表中列的映射-->
<!-- <id column="uid" property="uid"></id>-->
</collection>
</resultMap> <!--一对多 一条select-->
<!--<select id="getroleId" parameterType="int" resultMap="SmbmsRoleMaps">
select r.rid,roleName,u.uid,userName from smbms_role r inner join smbms_user u on r.rid=u.userRole where r.rid=#{rid}
</select>-->
<!--一对多 两条select-->
<select id="getroleId" resultMap="SmbmsRoleMaps">
select * from smbms.smbms_role where rid=#{rid}
</select>
<select id="getroleIdMutilSQL" resultType="com.marketsys.entity.User">
select * from smbms.smbms_user where userRole=#{rid}
</select> <!--多对一-->
<resultMap id="SmbmsRoleMap" type="com.marketsys.entity.User">
<id column="uid" property="uid"></id> <association property="role" javaType="com.marketsys.entity.SmbmsRole" select="getRole" column="userRole">
<id column="rid" property="rid"></id>
</association>
</resultMap>
<!-- 多对一 一条select-->
<!--<select id="getUserList" resultMap="SmbmsRoleMap">
select rid,roleName,uid,userName from smbms_role,smbms_user where smbms_role.rid=smbms_user.userRole
</select>-->
<!-- 多对一 二条select-->
<select id="getUserList" resultMap="SmbmsRoleMap">
select uid,userName,userRole from smbms.smbms_user
</select>
<select id="getRole" resultType="com.marketsys.entity.SmbmsRole">
select rid,roleName from smbms.smbms_role where rid=#{userRole}
</select>
四、test测试类
SqlSession sqlSession= MybatisUtil.getSqlSession();
URoleTestDao mapper=sqlSession.getMapper(URoleTestDao.class); //一对多
@Test
public void test1(){
SmbmsRole smbmsRole=mapper.getroleId(3);
System.out.println("身份为:"+smbmsRole.getRoleName()+"\n姓名为:");
for (User item:smbmsRole.getUsers()) {
System.out.println(item.getUserName());
}
} //多对一
@Test
public void test2(){
List<User> userList = mapper.getUserList();
for (User user:userList) {
System.out.println("用户:"+user.getUserName()+"\t角色:"+user.getRole().getRoleName());
}
}
Mybatis关联查询之一的更多相关文章
- Mybatis关联查询和数据库不一致问题分析与解决
Mybatis关联查询和数据库不一致问题分析与解决 本文的前提是,确定sql语句没有问题,确定在数据库中使用sql和项目中结果不一致. 在使用SpringMVC+Mybatis做多表关联时候,发现也不 ...
- MyBatis基础:MyBatis关联查询(4)
1. MyBatis关联查询简介 MyBatis中级联分为3中:association.collection及discriminator. ◊ association:一对一关联 ◊ collecti ...
- MyBatis关联查询,一对多关联查询
实体关系图,一个国家对应多个城市 一对多关联查询可用三种方式实现: 单步查询,利用collection标签为级联属性赋值: 分步查询: 利用association标签进行分步查询: 利用collect ...
- mybatis 关联查询实现一对多
场景:最近接到一个项目是查询管理人集合 同时每一个管理人还存在多个出资人 要查询一个管理人列表 每个管理人又包含了出资人列表 采用mybatis关联查询实现返回数据. 实现方式: 1 .在实体 ...
- MyBatis关联查询、多条件查询
MyBatis关联查询.多条件查询 1.一对一查询 任务需求; 根据班级的信息查询出教师的相关信息 1.数据库表的设计 班级表: 教师表: 2.实体类的设计 班级表: public class Cla ...
- Mybatis关联查询之二
Mybatis关联查询之多对多 多对多 一.entity实体类 public class Student { private Integer stuid; private String stuname ...
- mybatis关联查询基础----高级映射
本文链接地址:mybatis关联查询基础----高级映射(一对一,一对多,多对多) 前言: 今日在工作中遇到了一个一对多分页查询的问题,主表一条记录对应关联表四条记录,关联分页查询后每页只显示三条记录 ...
- MyBatis关联查询和懒加载错误
MyBatis关联查询和懒加载错误 今天在写项目时遇到了个BUG.先说一下背景,前端请求更新生产订单状态,后端从前端接收到生产订单ID进行查询,然后就有问题了. 先看控制台报错: org.apache ...
- Mybatis关联查询(嵌套查询)
上一篇文章介绍了基于Mybatis对数据库的增.删.改.查.这一篇介绍下关联查询(join query). 三张表:user article blog 表的存储sql文件: /* Navicat My ...
- MyBatis关联查询 (association) 时遇到的某些问题/mybatis映射
先说下问题产生的背景: 最近在做一个用到MyBatis的项目,其中有个业务涉及到关联查询,我是将两个查询分开来写的,即嵌套查询,个人感觉这样更方便重用: 关联的查询使用到了动态sql,在执行查询时就出 ...
随机推荐
- QT在linux下获取网络类型
开发中遇到这样一个需求,需要判断当前网络的类型(wifi或者4G或者网线),在这里给大家一块分享下: 1.这里有一个linux指令:nmcli(大家自行百度即可) 2.nmcli device sta ...
- VUE组件 之 Drawer 抽屉
注:因为项目中用的是 element-ui 框架,而这个框架并没有抽屉组件,所以自己实现一个. 一.源码地址 https://github.com/imxiaoer/DrawerForVue 二.效果 ...
- windows重装系统后grub引导菜单修复方法(亲自实验过)
问题: 电脑安装的是windows7+ubuntu 15.10双系统.windows重装后,grub引导界面消失. 解决方法有两大步: 1.进入ubuntu; 2.在ubuntu中修复grub. 一. ...
- angularjs中directive指令与component组件有什么区别?
壹 ❀ 引 我在前面花了两篇博客分别系统化介绍了angularjs中的directive指令与component组件,当然directive也能实现组件这点毋庸置疑.在了解完两者后,即便我们知道co ...
- 01-linux介绍
一.Linux简介 Linux内核最初只是由芬兰人林纳斯.托瓦兹在大学时出于爱好写出来的,是一套免费使用和自由传播的类Unix操作系统,是基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU ...
- windowsServer---- 在iis 上安装网站
1.找到信息服务IIS 管理器如图: 2.进入后进行配置 3.添加本地网站 配置网站 如果域名没有解析的话,可以在添加一个 端口用于测试 点击浏览就行查看 如果报错 解决:找到目录浏览,并启动 点击 ...
- C sharp #004# 进度条与Timer
饮水思源:金老师的自学网站 C#实现进度条异常简单,因为所有东西都已经封装好了. 只需要简单的拖拽: 写两行代码就完工了: private void timer1_Tick(object sender ...
- javascript ES6 新特性之 解构
解构的作用是可以快速取得数组或对象当中的元素或属性,而无需使用arr[x]或者obj[key]等传统方式进行赋值 var arr = [1, 2, 3]; //传统方式 var a = arr[0], ...
- Kubernetes的Job对象
Deployment.StatefulSet及DaemonSet三个主要用来进行长时间业务,不会退出. 而有一些离线业务,或者叫Batch Job(计算业务),计算完成后就直接退出 了,如果用Depl ...
- DataTable实现分组
有时候我们从数据库中查询出来数据之后,需要按照DataTable的某列进行分组,可以使用下面的方法实现,代码如下: using System; using System.Collections.Gen ...