package com.itheima.dao;import com.itheima.domain.Role;import java.util.List;/*** @author 黑马程序员* @Company http://www.ithiema.com*/
public interface IRoleDao {/*** 查询多对多 : 获取角色下 有几人及其信息* @return*/List<Role> findAll();
}
 package com.itheima.domain;import java.io.Serializable;
import java.util.List;/*** @author 黑马程序员* @Company http://www.ithiema.com*/
public class Role implements Serializable {private Integer roleId;private String roleName;private String roleDesc;//多对多的关系映射:一个角色可以赋予多个用户private List<User> users;public List<User> getUsers() {return users;}public void setUsers(List<User> users) {this.users = users;}public Integer getRoleId() {return roleId;}public void setRoleId(Integer roleId) {this.roleId = roleId;}public String getRoleName() {return roleName;}public void setRoleName(String roleName) {this.roleName = roleName;}public String getRoleDesc() {return roleDesc;}public void setRoleDesc(String roleDesc) {this.roleDesc = roleDesc;}@Overridepublic String toString() {return "Role{" +"roleId=" + roleId +", roleName='" + roleName + '\'' +", roleDesc='" + roleDesc + '\'' +'}';}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.dao.IRoleDao"><!--定义role表的ResultMap domian实体类属性名和数据库的列名不一致 所以要取别名--><resultMap id="roleMap" type="role"><id property="roleId" column="rid"></id><result property="roleName" column="role_name"></result><result property="roleDesc" column="role_desc"></result><!--javaType :要封装到什么类型中 com.itheima.domain.User 在SqlMapConfig.xml中起了别名 所以可以不写全限定类名--><!--主键使用id标签;column对应的是数据库中的列名,property对应的是实体类中的属性名--><collection property="users" ofType="user"><id column="id" property="id"></id><result column="username" property="username"></result><result column="address" property="address"></result><result column="sex" property="sex"></result><result column="birthday" property="birthday"></result></collection></resultMap><!--查询多对多 角色下 有 几人 --><select id="findAll" resultMap="roleMap"><!--通过一个中间表 user_role 建立联系 r.id = ur.rid 两个左连接 --><!--sql语句 过长 换行 最后末尾 要加上 一个空格 否则 sql语句进行拼接的时候 将会连在一块 导致单词粘连 出错-->select u.*,r.id as rid,r.role_name,r.role_desc from role rleft outer join user_role ur  on r.id = ur.ridleft outer join user u on u.id = ur.uid</select>
</mapper>
 package com.itheima.test;import com.itheima.dao.IRoleDao;
import com.itheima.domain.Role;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.InputStream;
import java.util.List;/*** @author 黑马程序员* @Company http://www.ithiema.com*/
public class RoleTest {private InputStream in;private SqlSession sqlSession;private IRoleDao roleDao;@Before//用于在测试方法执行之前执行public void init()throws Exception{//1.读取配置文件,生成字节输入流in = Resources.getResourceAsStream("SqlMapConfig.xml");//2.获取SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);//3.获取SqlSession对象sqlSession = factory.openSession(true);//4.获取dao的代理对象roleDao = sqlSession.getMapper(IRoleDao.class);}@After//用于在测试方法执行之后执行public void destroy()throws Exception{//提交事务// sqlSession.commit();//6.释放资源sqlSession.close();in.close();}/*** 测试查询所有* 查询每个角色身份下 有几个人 比如:校长 有几人 及他们的信息;院长 分别是谁谁谁*/@Testpublic void testFindAll(){List<Role> roles = roleDao.findAll();for(Role role : roles){System.out.println("---每个角色的信息----");System.out.println(role);System.out.println(role.getUsers());}}}

 package com.itheima.dao;import com.itheima.domain.User;import java.util.List;/*** @author 黑马程序员* @Company http://www.ithiema.com** 用户的持久层接口*/
public interface IUserDao {/*** 查询所有用户,同时获取到用户下所有角色身份的信息* @return*/List<User> findAll();}
package com.itheima.domain;import java.io.Serializable;
import java.util.Date;
import java.util.List;/*** @author 黑马程序员* @Company http://www.ithiema.com*/
public class User implements Serializable {private Integer id;private String username;private String address;private String sex;private Date birthday;//多对多的关系映射:一个用户可以具备多个角色private List<Role> roles;public List<Role> getRoles() {return roles;}public void setRoles(List<Role> roles) {this.roles = roles;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", address='" + address + '\'' +", sex='" + sex + '\'' +", birthday=" + birthday +'}';}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.itheima.dao.IUserDao"><!-- 定义User的resultMap--><resultMap id="userMap" type="user"><id property="id" column="id"></id><result property="username" column="username"></result><result property="address" column="address"></result><result property="sex" column="sex"></result><result property="birthday" column="birthday"></result><!-- 配置角色集合的映射 --><collection property="roles" ofType="role"><id property="roleId" column="rid"></id><result property="roleName" column="role_name"></result><result property="roleDesc" column="role_desc"></result></collection></resultMap><!-- 查询用户 对应角色身份  --><select id="findAll" resultMap="userMap"><!--采取 right left -->
--        select u.*,r.id as rid,r.role_name,r.role_desc from role r
--         right outer join user_role ur  on r.id = ur.rid
--         right outer join user u on u.id = ur.uidselect u.*,r.id as rid,r.role_name,r.role_desc from user uleft outer join user_role ur  on u.id = ur.uidleft outer join role r on r.id = ur.rid</select></mapper>
package com.itheima.test;import com.itheima.dao.IUserDao;
import com.itheima.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.InputStream;
import java.util.List;/*** @author 黑马程序员* @Company http://www.ithiema.com*/
public class UserTest {private InputStream in;private SqlSession sqlSession;private IUserDao userDao;@Before//用于在测试方法执行之前执行public void init()throws Exception{//1.读取配置文件,生成字节输入流in = Resources.getResourceAsStream("SqlMapConfig.xml");//2.获取SqlSessionFactorySqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);//3.获取SqlSession对象sqlSession = factory.openSession(true);//4.获取dao的代理对象userDao = sqlSession.getMapper(IUserDao.class);}@After//用于在测试方法执行之后执行public void destroy()throws Exception{//提交事务// sqlSession.commit();//6.释放资源sqlSession.close();in.close();}/*** 测试查询 某个人user 对应几个角色身份*/@Testpublic void testFindAll(){List<User> users = userDao.findAll();for(User user : users){System.out.println("-----每个用户的信息------");System.out.println(user);System.out.println(user.getRoles());}}}

Mybatis_多对多相关推荐

  1. MyBatis 一对多、多对一的处理~

    目录 1.多对一处理 1.1.打个比方 1.2.实例环境搭建 1.3.目标:查询所有的学生信息以及对应的老师信息 方式一:查询嵌套 方式二:结果嵌套 2.一对多处理 2.1.目标:获取指定老师下的所有 ...

  2. Django框架(十)--常用字段、参数、元信息、多对多关联关系

    一.ORM字段 # AutoField() int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列# IntegerField() ...

  3. Django --ORM常用的字段和参数 多对多创建形式

    1 ORM字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型 ...

  4. 如何使用JPA注解标注多对多的关系

    假设应用场景如下:Teacher与Student是多对多的关系,其中,Teacher类对应teacher表如下: CREATE TABLE `teacher` (   `id` bigint(20) ...

  5. NHibernate从入门到精通系列(7)——多对一关联映射

    内容摘要 多对一关联映射概括 多对一关联映射插入和查询 多对一关联映配置介绍 一.多对一关联映射概括 关联关系是实体类与实体类之间的结构关系,分别为"多对一"."一对一& ...

  6. mysql 多表关联建模_(四)多对多模式 - 数据库模型设计专栏 - CSDN博客

    连载之5 原创:胖子刘(转载请注明出处及作者,谢谢.)(四)多对多模式 多对多模式,也是比较常见的一种数据库设计模式,它所描述的两个对象不分主次.地位对等.互为一对多的关系.对于A表来说,一条记录对应 ...

  7. ORM操作models一对多、多对多关系

    ORM操作 单表.一对多表操作 1 from django.db import models 2 3 4 class UserGroup(models.Model): 5 title = models ...

  8. 关于一对多,多对多的多表查询的控制

    一.一对多 以班级Classes和学生Student为例: 回忆sql语句: //内链接,两种方式效果一样,查询的是两边都有的数据 SELECT c.*,s.* FROM classes c,stud ...

  9. Hibernate annotation多对多配置

    角色(用户组),用户多对多. 角色实体配置: private Set<TAuthUser> users;@ManyToMany@JoinTable(name="t_auth_us ...

最新文章

  1. 用Jquery控制文本框只能输入数字和字母及jquery自定义方法$.fn
  2. C#编程利器之五:集合对象(Collections)
  3. 一篇文章梳理完虚拟现实相关的核心技术 | 收藏
  4. hive的错误编码+解决方案汇总(持续更新中)
  5. pandas中expand的作用
  6. 深度学习(2)回归问题
  7. 【C++grammar】继承与构造test1代码附录
  8. 女性最容易动心的21种时刻
  9. VMware 虚拟化平台规划设计方案
  10. eslint配置及rule解释
  11. [转载]备忘:oh my zsh 的安装、更新、删除
  12. 视频教程-Linux从入门到精通(全套系列)-Linux
  13. PHP和js做分页功能,php+js实现分页
  14. myd导入mysql_数据库是.frm,.myd,myi备份如何导入mysql
  15. 枚举——数组中的最长山脉
  16. 智能陈桥五笔输入法 for linux,科技教程:在Linux下安装陈桥五笔输入法
  17. Python爬取Facebook公共主页帖子
  18. html 页眉选项卡,连续两个奇数页页眉 再选择插入菜单——分页,执行2次
  19. html动画如何延迟,css3animation延迟
  20. 《人性的弱点》-[美]戴尔·卡耐基

热门文章

  1. 2018大公司面试分享(百度,京东,搜狗,小米等)
  2. 卷径计算(厚度累计法/膜厚叠加法)
  3. 即刻报名|汽车制造行业如何玩转大数据分析?
  4. 捕食搜索算法(PS)-求解TSP问题
  5. ping不丢包,但延迟高的问题记录
  6. postman测试restful接口
  7. Mobileye计划独立上市,500亿美元估值背后的故事
  8. 《iBoard 电子学堂》SPI Flash烧写方法
  9. 讲解人工智能在现代科技中的应用和未来发展趋势
  10. python列表输出奇数_Python程序在列表中打印奇数