小白日记:Mybatis-多表查询体验(超级详细的讲解)

项目环境:idea2020 + MySQL 8 + Maven 3.6

1、数据关系:

   准备两张表,一张用户表,一张角色表,一个用户可以有多个角色,一个角色可以有多个用户

#用户信息表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `sex` char(1) default NULL COMMENT '性别',
  `address` varchar(256) default NULL COMMENT '地址',
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert  into `user`(`id`,`username`,`sex`,`address`) 
values (41,'老王','男','北京'),
(42,'小二王','女','天津'),
(43,'小二王','女','重庆'),

#角色表
DROP TABLE IF EXISTS `role`;
CREATE TABLE `role` (
  `ID` int(11) NOT NULL COMMENT '编号',
  `ROLE_NAME` varchar(30) default NULL COMMENT '角色名称',
  `ROLE_DESC` varchar(60) default NULL COMMENT '角色描述',
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert  into `role`(`ID`,`ROLE_NAME`,`ROLE_DESC`) 
values (1,'院长','管理学院'),
(2,'总裁','管理公司'),
(3,'校长','管理学校');

#用户角色对应表
DROP TABLE IF EXISTS `user_role`;
CREATE TABLE `user_role` (
  `UID` int(11) NOT NULL COMMENT '用户编号',
  `RID` int(11) NOT NULL COMMENT '角色编号',
  #保证每个用户和每个角色只能对应一次
  PRIMARY KEY  (`UID`,`RID`),
  KEY `FK_Reference_10` (`RID`),
  CONSTRAINT `FK_Reference_10` FOREIGN KEY (`RID`) REFERENCES `role` (`ID`),
  CONSTRAINT `FK_Reference_9` FOREIGN KEY (`UID`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert  into `user_role`(`UID`,`RID`) 
values (41,1),
(43,1),
(41,2);

2、创建一个maven项目,导入项目所需的包:

<dependencies>
  <!--mybatis本体-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.5</version>
</dependency>
<!--数据库连接-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.13</version>
</dependency>
<!--测试类-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
</dependencies>

3、创建实体类User和Role,中间表不需要创建,它只是做为查询时的连接作用,不用来展示:

这一步略过,记住创建的实体类的属性要与数据表中的字段名一一对应(如果可以直接使用idea的数据库工具创建,特别的方便)。并且要给每个属性加上get和set方法,给每个类加上toString方法!

在User实体类中加入与Role的关联映射

//多对多关系映射
  private List<Role> roles;
//添加roles的get和 set方法

4、创建UserAao接口

public interface UserDao {

    /**
     * 多对多
     */
    List<User> findUserAndRole();
}

5、配置文件

5.1mybatis主配置文件(mybatis-config.xml)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--主配置-->
<configuration>
    <!--加载外部数据库配置文件-->
    <properties resource="db.properties"/>
    <!--是否使用驼峰映射,role表是用的xxx_xxx_xxx对应Java就是xxxXxxXxx-->
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--设定实体类别名,这样设置后pojo包下的所有实体类的别名默认为首字母小写的类名,也可以用@Alias("别名")去指定每个实体类的别名-->
    <typeAliases>
        <package name="com.moro.pojo"/>
    </typeAliases>
    <!--环境配置文件-->
    <environments default="mysql" >
        <environment id="mysql">
            <!--设置事务类型,mybatis有两种事务-->
            <transactionManager type="JDBC"/>
            <!--连接池选项,我们选择mybatis自带连接池-->
            <dataSource type="POOLED">
                <!--从配置文件中加载对应的配置信息-->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--对应的Dao的配置文件映射,有好多种,可以官网看一下-->
    <mappers>
        <package name="com.moro.dao"/>
    </mappers>
</configuration>

4.2UserDao.xml映射文件配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.moro.dao.UserDao">
    <resultMap id="userAndRole" type="user">
        <id property="id" column="id"/>
        <id property="username" column="username"/>
        <id property="sex" column="sex"/>
        <id property="address" column="address"/>
        <collection property="roles" ofType="role">
            <id property="id" column="rid"/>
            <result property="roleName" column="ROLE_NAME"/>
            <result property="roleDesc" column="ROLE_DESC"/>
        </collection>
    </resultMap>


    <select id="findUserAndRole" resultMap="userAndRole">
        select u.*,r.id as rid,r.ROLE_NAME,r.ROLE_DESC
        from user u
        left outer join user_role ur on u.id = ur.UID
        left outer join role r on ur.RID = r.ID
    </select>

</mapper>

5、测试类

public class MyUserTest {

    

    @Test
    public void testUserAndRole(){
        SqlSession init = MybatisUtil.init();
        List<User> userAndRole = init.getMapper(UserDao.class).findUserAndRole();
        for (User user : userAndRole) {
            System.out.println(user);
            System.out.println(user.getRoles());
        }
    }


}

最后附上我的目录结构:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值