Mybatis_多对多
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_多对多相关推荐
- MyBatis 一对多、多对一的处理~
目录 1.多对一处理 1.1.打个比方 1.2.实例环境搭建 1.3.目标:查询所有的学生信息以及对应的老师信息 方式一:查询嵌套 方式二:结果嵌套 2.一对多处理 2.1.目标:获取指定老师下的所有 ...
- Django框架(十)--常用字段、参数、元信息、多对多关联关系
一.ORM字段 # AutoField() int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列# IntegerField() ...
- Django --ORM常用的字段和参数 多对多创建形式
1 ORM字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型 ...
- 如何使用JPA注解标注多对多的关系
假设应用场景如下:Teacher与Student是多对多的关系,其中,Teacher类对应teacher表如下: CREATE TABLE `teacher` ( `id` bigint(20) ...
- NHibernate从入门到精通系列(7)——多对一关联映射
内容摘要 多对一关联映射概括 多对一关联映射插入和查询 多对一关联映配置介绍 一.多对一关联映射概括 关联关系是实体类与实体类之间的结构关系,分别为"多对一"."一对一& ...
- mysql 多表关联建模_(四)多对多模式 - 数据库模型设计专栏 - CSDN博客
连载之5 原创:胖子刘(转载请注明出处及作者,谢谢.)(四)多对多模式 多对多模式,也是比较常见的一种数据库设计模式,它所描述的两个对象不分主次.地位对等.互为一对多的关系.对于A表来说,一条记录对应 ...
- ORM操作models一对多、多对多关系
ORM操作 单表.一对多表操作 1 from django.db import models 2 3 4 class UserGroup(models.Model): 5 title = models ...
- 关于一对多,多对多的多表查询的控制
一.一对多 以班级Classes和学生Student为例: 回忆sql语句: //内链接,两种方式效果一样,查询的是两边都有的数据 SELECT c.*,s.* FROM classes c,stud ...
- Hibernate annotation多对多配置
角色(用户组),用户多对多. 角色实体配置: private Set<TAuthUser> users;@ManyToMany@JoinTable(name="t_auth_us ...
最新文章
- 用Jquery控制文本框只能输入数字和字母及jquery自定义方法$.fn
- C#编程利器之五:集合对象(Collections)
- 一篇文章梳理完虚拟现实相关的核心技术 | 收藏
- hive的错误编码+解决方案汇总(持续更新中)
- pandas中expand的作用
- 深度学习(2)回归问题
- 【C++grammar】继承与构造test1代码附录
- 女性最容易动心的21种时刻
- VMware 虚拟化平台规划设计方案
- eslint配置及rule解释
- [转载]备忘:oh my zsh 的安装、更新、删除
- 视频教程-Linux从入门到精通(全套系列)-Linux
- PHP和js做分页功能,php+js实现分页
- myd导入mysql_数据库是.frm,.myd,myi备份如何导入mysql
- 枚举——数组中的最长山脉
- 智能陈桥五笔输入法 for linux,科技教程:在Linux下安装陈桥五笔输入法
- Python爬取Facebook公共主页帖子
- html 页眉选项卡,连续两个奇数页页眉 再选择插入菜单——分页,执行2次
- html动画如何延迟,css3animation延迟
- 《人性的弱点》-[美]戴尔·卡耐基