Mybatis学习笔记之---多表查询(2)
Mybatis多表查询(2)
(一)举例
用户和角色
一个用户可以有多个角色,一个角色可以赋予多个用户
(二)步骤
1、建立两张表:用户表,角色表,让用户表和角色表具有多对多的关系。需要使用中间表,中间表中包含各自的主键,在中间表中是外键。
2、建立两个实体类:用户实体类和角色实体类,让用户和角色的实体类能体现出来多对多的关系各自包含对方一个集合引用
3、建立两个配置文件用户的配置文件角色的配置文件
4、实现配置:当我们查询用户时,可以同时得到用户所包含的角色信息当我们查询角色时,可以同时得到角色的所赋子的用户信息
(三)代码实现

1.pom.xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.41</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency> </dependencies>
2.Role.java
package entity;
import java.util.List;
public class Role {
private int rid;
private String rolename;
//多对多的关系映射,一个角色可以赋予多个用户
private List<Users> users;
public int getRid() {
return rid;
}
public void setRid(int rid) {
this.rid = rid;
}
public String getRolename() {
return rolename;
}
public void setRolename(String rolename) {
this.rolename = rolename;
}
public List<Users> getUsers() {
return users;
}
public void setUsers(List<Users> users) {
this.users = users;
}
@Override
public String toString() {
return "Role{" +
"rid=" + rid +
", rolename='" + rolename + '\'' +
", users=" + users +
'}';
}
}
3.Users.java
package entity;
import java.util.List;
public class Users {
private int uid;
private String username;
private String password;
//多对多的关系映射,一个用户可以赋予多个角色
private List<Role> roles;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
@Override
public String toString() {
return "Users{" +
"uid=" + uid +
", username='" + username + '\'' +
", password='" + password + '\'' +
", roles=" + roles +
'}';
}
}
4.SqlMapperConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPEconfiguration
PUBLIC"-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--mybatis的主配置文件-->
<configuration>
<!--配置环境-->
<environments default="mysql">
<!--配置mysql环境-->
<environment id="mysql">
<!--配置事务的类型-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源(连接池)-->
<dataSource type="POOLED">
<!--配置连接数据库的4个基本信息-->
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/zml01?useUnicode=true&characterEncoding=utf-8"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置,映射配置文件指的是每个dao独立的配置文件-->
<mappers>
<mapper resource="dao/UserDao.xml"></mapper>
<mapper resource="dao/RoleDao.xml"></mapper>
</mappers>
</configuration>
5.UserDao.java
package dao;
import entity.Users;
import java.util.List;
public interface UserDao {
List<Users> findAll();
Users find(int id);
}
6.UserDao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPEmapper
PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.UserDao">
<resultMap id="urMap" type="entity.Users">
<id property="uid" column="uid"></id>
<result property="username" column="username"></result>
<result property="password" column="password"></result>
<collection property="roles" ofType="entity.Role">
<id property="rid" column="rid"></id>
<result property="rolename" column="rolename"></result>
</collection>
</resultMap>
<!--查询所有-->
<select id="findAll" resultMap="urMap">
select * from users u LEFT OUTER JOIN users_role ur on u.uid=ur.uid LEFT OUTER JOIN role r on r.rid=ur.rid
</select>
<!--根据ID查询-->
<select id="find" resultType="entity.Users">
select * from users where id=#{id}
</select>
</mapper>
7.UserTest.java
package test;
import dao.UserDao;
import entity.Users;
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.IOException;
import java.io.InputStream;
import java.util.List;
public class UserTest {
private InputStream in;
private SqlSession sqlSession;
private UserDao UserDaoImpl;
@Before
public void init() throws IOException {
//1.读取配置文件
in= Resources.getResourceAsStream("SqlMapperConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
SqlSessionFactory factory=builder.build(in);
//3.使用工厂生产SqlSession对象
sqlSession=factory.openSession();
//4.使用SqlSession创建dao接口的代理对象
UserDaoImpl=sqlSession.getMapper(UserDao.class);
}
@After
public void destroy() throws IOException {
//提交事务
sqlSession.commit();
//6.释放资源
sqlSession.close();
in.close();
}
/**
* 查询所有
* @throws IOException
*/
@Test
public void findall() throws IOException {
//5.使用代理对象执行方法
List<Users> users=UserDaoImpl.findAll();
for(Users u:users){
System.out.println(u);
}
}
}
8.RoleDao.java
package dao;
import entity.Role;
import java.util.List;
public interface RoleDao {
List<Role> findAll();
}
9.RoleDao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPEmapper
PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.RoleDao">
<resultMap id="ruMap" type="entity.Role">
<id property="rid" column="rid"></id>
<result property="rolename" column="rolename"></result>
<collection property="users" ofType="entity.Users">
<id property="uid" column="uid"></id>
<result property="username" column="username"></result>
<result property="password" column="password"></result>
</collection>
</resultMap>
<!--查询所有-->
<select id="findAll" resultMap="ruMap">
select * from role r LEFT OUTER JOIN users_role ur on r.rid=ur.rid LEFT OUTER JOIN users u on u.uid=ur.uid
</select>
</mapper>
10.RoleTest.java
package test;
import dao.RoleDao;
import dao.UserDao;
import entity.Role;
import entity.Users;
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.IOException;
import java.io.InputStream;
import java.util.List;
public class RoleTest {
private InputStream in;
private SqlSession sqlSession;
private RoleDao roleDaoImpl;
@Before
public void init() throws IOException {
//1.读取配置文件
in= Resources.getResourceAsStream("SqlMapperConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
SqlSessionFactory factory=builder.build(in);
//3.使用工厂生产SqlSession对象
sqlSession=factory.openSession();
//4.使用SqlSession创建dao接口的代理对象
roleDaoImpl=sqlSession.getMapper(RoleDao.class);
}
@After
public void destroy() throws IOException {
//提交事务
sqlSession.commit();
//6.释放资源
sqlSession.close();
in.close();
}
/**
* 查询所有
* @throws IOException
*/
@Test
public void findall() throws IOException {
//5.使用代理对象执行方法
List<Role> roles=roleDaoImpl.findAll();
for(Role r:roles){
System.out.println(r);
}
}
}
Mybatis学习笔记之---多表查询(2)的更多相关文章
- Mybatis学习笔记之---多表查询(1)
Mybatis多表查询(1) (一)举例(用户和账户) 一个用户可以有多个账户 一个账户只能属于一个用户(多个账户也可以属于同一个用户) (二)步骤 1.建立两张表:用户表,账户表,让用户表和账户表之 ...
- MyBatis学习总结——实现关联表查询(转)
原文链接:孤傲苍狼 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关 ...
- mybatis学习 十二 多表查询
Mybatis 实现多表查询方式: (1)业务装配.对两个表编写单表查询语句,在业务(Service)把查询的两个结果进行关联. (2)使用Auto Mapping特性,在实现两表联合查询时通过别名完 ...
- MyBatis学习总结(五)——关联表查询的实现
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- Oracle学习笔记_04_多表查询
一.概念: 1.多表连接有以下几种分法: (1)内连接 vs 外连接 (左.右.满) (2)等值连接 vs 不等值连接 (3)非自连 ...
- MySQL学习笔记8——多表查询
多表查询 多表查询 *合并结果集 *连接查询 *子查询 合并结果集 *要求被合并的表中,列的类型和列数相同(实际上是查询的结果集列类型和列数相同即可) *UNION,去除重复行 *UNION ALL, ...
- MySQL数据库学习笔记----MySQL多表查询之外键、表连接、子查询、索引
本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...
- MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)
mysql> create table test5( -> id int, ) -> )engine myisam charset utf8; Query OK, rows affe ...
- Mybatis学习——一对多关联表查询
1.实体类 public class Student { private int id; private String name; } public class Classes { private i ...
随机推荐
- CDH6.2中capacity队列的分配
配置: yarn.scheduler.capacity.root.queues
- WebMagic 抓取图片并保存至本地
1.近期接触到java 爬虫,开源的爬虫框架有很多,其中WebMagic 是国产的,文档也是中文的,网上资料很多,便于学习,功能强大,可以在很短时间内实现一个简单的网络爬虫.具体可参考官网 http: ...
- (2.2)【转】mysql的SQL笔记
一千行 MySQL 详细学习笔记 IT技术思维 4月1日 ↑↑↑点上方蓝字关注并星标⭐「IT技术思维」 一起培养顶尖技术思维 作者:格物 原文链接:https://shockerli.net/post ...
- 通过node指令自动创建一个package.json文件,并封装发布使用
通过node指令自动创建一个package.json文件,并封装发布使用:https://blog.csdn.net/scu_cindy/article/details/78208268
- HDUST-1245 Interpreter(模拟)
1245: Problem E: Interpreter 时间限制: 1 Sec 内存限制: 128 MB提交: 4 解决: 2[提交][状态][讨论版] 题目描述 Problem E: Inte ...
- 搜索专题:Balloons
搜索专题:Balloons 这道题一看与时间有关,第一想到的就是BFS,定义一个状态,包含每一个状态的剩余气球数,已经进行的时间和每一个志愿者上一次吹气球的时间: 每一次状态转换时,检查是否有没有使用 ...
- 使用Jenkins结合Gogs和SonarQube对项目代码进行测试、部署、回滚,以及使用keepalived+haproxy调度至后端tomcat
0 环境说明 主tomcat:192.168.0.112 备tomcat:192.168.0.183 haproxy+keepalived-1:192.168.0.156 haproxy+keepal ...
- 单元测试 - tox 使用
1. 问题一 $ tox -e pep8 -- testdemo.server pep8 installed: alembic==,amqp==,appdirs==,Babel==,beautiful ...
- webpack4导入jQuery的新方案
本文的目的 拒绝全局导入jQuery!! 拒绝script导入jQuery!! 找到一种只在当前js组件中引入jQuery,并且使用webpack切割打包的方案! 测试环境 以下测试在webpack3 ...
- httprunner如何提取数据串联上下游接口
httprunner进行接口测试时,从上一个接口提取参数传递给下游接口,如何获取数据里最后一个值? 突然被学员问道一个httprunner的问题,惭愧的是大猫之前没有是通过httprunner,又不好 ...