项目环境: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());
}
}
}
最后附上我的目录结构: