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,在执行查询时就出 ...
随机推荐
- Android TeaPickerView数据级联选择器
数据级联选择器.三级联动.二级联动.层级联动.多数据筛选.必藏 (Data Cascade Selector, Hierarchical Structure, Multiple Data Screen ...
- 20190608_浅谈go&java差异(三)
20190608_浅谈go&java差异(三) 转载请注明出处https://www.cnblogs.com/funnyzpc/p/10990703.html 第三节内容概览 多线程通讯(线程 ...
- 安装CentOS 6.x报错"Disk sda contains BIOS RAID metadata"解决方法
今天在安装CentOS 6.2的时候,当进到检测硬盘的时候,总是过不去,报错如下: Disk sda contains BIOS RAID metadata, but is not part of a ...
- Java向上下转型中的陷阱{详细}
1: 多态 多态时继承下面的产物,之所以存在向上向下转型的目的,就是解决参数传递的不变形,体现面向接口编程的重要性, 1.1 方法的多态性 ①. 方法的重载:同一个方法名称可以根据参数的类型或 ...
- CH-0304 IncDec Sequence
0304 IncDec Sequence 0x00「基本算法」例题 描述 给定一个长度为 n(n≤10^5 ) 的数列 {a_1,a_2,…,a_n},每次可以选择一个区间 [l,r],使下标在这个区 ...
- DNS解析服务结构图
1.DNS(domain name system) 域名 <==> IP地址 DNS解析过程:
- maven修改运行环境配置
maven中自带的tomcat是6版本,比如我们想用tomcat7,jdk1.8,我们就要通过配置来改变. 改变方式如下 <build> <plugins> <plugi ...
- C# HttpClient设置cookies的两种办法
前言:最近公司使用HttpClient对象在发送请求,抛弃了之前的HttpWebRequest,使用httpClient有个好处:就是可以只使用一个HttpClient的实例,去完成发送所有的请求数据 ...
- centos添加用户并赋予管理员权限
用centos时,root用户一般都是超级管理员使用的,一般不轻易给别人,但是有时候同事安装软件时需要root账号,又不得不给,只能重新建一个用户,并赋予管理员权限.下面介绍创建用户并赋予管理员权限的 ...
- 前端vuex基础入门
vuex简介 是一个专门为vue.应用程序开的状态管理模式 它采用集中式存储管理应用的所有组件的状态 (类似于全局变量) 并以相应的规则保证以一种可预测的方式发生改变(相应式变化) 应用场景 多个视图 ...