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&amp;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)的更多相关文章

  1. Mybatis学习笔记之---多表查询(1)

    Mybatis多表查询(1) (一)举例(用户和账户) 一个用户可以有多个账户 一个账户只能属于一个用户(多个账户也可以属于同一个用户) (二)步骤 1.建立两张表:用户表,账户表,让用户表和账户表之 ...

  2. MyBatis学习总结——实现关联表查询(转)

    原文链接:孤傲苍狼 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关 ...

  3. mybatis学习 十二 多表查询

    Mybatis 实现多表查询方式: (1)业务装配.对两个表编写单表查询语句,在业务(Service)把查询的两个结果进行关联. (2)使用Auto Mapping特性,在实现两表联合查询时通过别名完 ...

  4. MyBatis学习总结(五)——关联表查询的实现

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  5. Oracle学习笔记_04_多表查询

    一.概念: 1.多表连接有以下几种分法: (1)内连接           vs          外连接 (左.右.满) (2)等值连接        vs         不等值连接 (3)非自连 ...

  6. MySQL学习笔记8——多表查询

    多表查询 多表查询 *合并结果集 *连接查询 *子查询 合并结果集 *要求被合并的表中,列的类型和列数相同(实际上是查询的结果集列类型和列数相同即可) *UNION,去除重复行 *UNION ALL, ...

  7. MySQL数据库学习笔记----MySQL多表查询之外键、表连接、子查询、索引

    本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复 ...

  8. MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)

    mysql> create table test5( -> id int, ) -> )engine myisam charset utf8; Query OK, rows affe ...

  9. Mybatis学习——一对多关联表查询

    1.实体类 public class Student { private int id; private String name; } public class Classes { private i ...

随机推荐

  1. neo4j - 查询效率的几种优化思路

    最近在公司实习做的就是优化neo4j图形数据库查询效率的事,公司提供的是一个在Linux上搭建且拥有几亿个节点的数据库.开始一段时间主要是熟悉该数据库的一些基本操作,直到上周才正式开始步入了优化数据库 ...

  2. [转帖]软件的变革与 AOT

    软件的变革与 AOT https://www.colabug.com/851475.html 文章写的很牛B .. 前言 AOT 即 Ahead of Time Compilation,即运行前编,与 ...

  3. 插入数据库失败([Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version)

    报错信息如下: , ) 原因,read是数据库的关键字, 牢记,如果一个词是数据库的关键字,那么在写数据库语句的时候,这个词一定是蓝色的(关键字颜色)!!

  4. js数组与对象的区别

    数组和对象两者都可以用来表示数据的集合,曾一度搞不清楚”数组”(array)和”对象”(object)的根本区别在哪里. 有一个数组a=[1,2,3,4],还有一个对象a={0:1,1:2,2:3,3 ...

  5. 什么是file_sort?如何避免file_sort

    阿里巴巴编码规范有这么一例 [推荐]如果有order by场景,请注意利用索引的有序性. order by最后的字段是组合索引的一部分,并且放在索引组合顺序的最后,避免出现file_sort的情况,影 ...

  6. luffyapi项目 --短信认证的基本操作

    一.开通腾讯云短信 SDK 文档 :https://cloud.tencent.com/document/product/382/11672 1.官网注册实名账号:https://cloud.tenc ...

  7. 2019-11-29-C#-序列类为-xml-可以使用的特性大全

    title author date CreateTime categories C# 序列类为 xml 可以使用的特性大全 lindexi 2019-11-29 8:59:2 +0800 2018-6 ...

  8. python snippets

    1.Find memory used by an object import sys 2.Combine a list of strings into a single string strings ...

  9. Tomcat的3种部署方式

    tomcat部署的三种方式及优缺点对比 部署方法一:将编译成功的web项目直接放到webapps目录中(注意是编译成功的web项目,也可以是war包):   部署方式二:修改tomcat安装目录下的  ...

  10. feign 发送请求时,传多个参数时的写法

    第一:传参方式写法,当参数个数大于2个时,需要用@RequestParam @PostMapping(value = "/configReader/configValue.do", ...