版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gongm24/article/details/81102107
实验内容
执行多对多关联查询
前两章分别实现了一对多查询以及多对一查询。其中多对一查询,对于整体而言是多对一,但我们操作的是一个实体,所以对于多方的个体而言可以看成是一对一。同理,多对多查询针对个体而言就可以看成是一对多,所以多对多查询的处理跟一对多查询的处理实际上是一样一样的。
操作步骤
一、安装
添加Maven依赖(本文使用版本为3.4.6)
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>x.x.x</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.42</version>
</dependency>
二、创建数据库及表结构
分别创建用户表、角色表以及用户角色关联表,一个用户可以属于多个角色,一个角色也可以包含多个用户
CREATE TABLE `user` (
`id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`username` varchar(32) NOT NULL COMMENT '用户名',
`password` varchar(64) NOT NULL COMMENT '密码',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT '用户';
CREATE TABLE `role` (
`id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(32) NOT NULL DEFAULT '' COMMENT '角色名',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT '角色';
CREATE TABLE `user_role` (
`user_id` bigint(11) unsigned NOT NULL COMMENT '主键',
`role_id` bigint(11) unsigned NOT NULL COMMENT '主键',
PRIMARY KEY (`user_id`, `role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT '用户角色关联表';
初始化数据
delete from `user`;
delete from `role`;
delete from `user_role`;
insert into `user` values (1, 'user1', '123');
insert into `user` values (2, 'user2', '123');
insert into `role` values (1, 'admin');
insert into `role` values (2, 'user');
insert into `user_role` values (1, 1);
insert into `user_role` values (1, 2);
insert into `user_role` values (2, 2);
三、创建 Mybatis 配置文件
在 src/main/resources
目录下创建 mybatis-config.xml
文件,内容如下
<configuration>
<properties resource="jdbc.properties"></properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载XML,同时加载接口类 -->
<mappers>
<mapper class="tutorial.mybatis.mapper.UserMapper"></mapper>
<mapper resource="mybatis/User.xml"></mapper>
<mapper class="tutorial.mybatis.mapper.RoleMapper"></mapper>
<mapper resource="mybatis/Role.xml"></mapper>
</mappers>
</configuration>
在 src/main/resources
目录下创建 jdbc.properties
文件,内容如下
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/tutorial_mybatis?characterEncoding=utf-8&useSSL=true
jdbc.username=root
jdbc.password=
四、创建实体类
创建包 tutorial.mybatis.model
,并在该包下创建 User
及 Role
类,内容如下
其中,Topic 类中添加了一个 userList 属性,用于存储用户信息
public class User {
private Long id;
private String username;
private String password;
private List<Role> roleList;
// 省略 get / set 方法
}
public class Role {
private Long id;
private String name;
private List<User> userList;
// 省略 get / set 方法
}
在 src/main/resources
目录下创建目录 mybatis
,并在该目录下创建 User.xml
以及 Role.xml
,内容如下
User.xml
<mapper namespace="tutorial.mybatis.mapper.UserMapper">
<resultMap id="BaseResultMap" type="tutorial.mybatis.model.User">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="username" jdbcType="VARCHAR" property="username" />
<result column="password" jdbcType="VARCHAR" property="password" />
<collection property="roleList" ofType="tutorial.mybatis.model.Role">
<id column="role_id" jdbcType="BIGINT" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
</collection>
</resultMap>
<select id="listAll" resultMap="BaseResultMap">
SELECT a.id, a.username, a.password, c.name
FROM `user` a
LEFT JOIN `user_role` b on a.id = b.user_id
LEFT JOIN `role` c on c.id = b.role_id
</select>
</mapper>
Topic.xml
<mapper namespace="tutorial.mybatis.mapper.RoleMapper">
<resultMap id="BaseResultMap" type="tutorial.mybatis.model.Role">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<collection property="userList" javaType="tutorial.mybatis.model.User">
<id column="user_id" jdbcType="BIGINT" property="id" />
<result column="username" jdbcType="VARCHAR" property="username" />
<result column="password" jdbcType="VARCHAR" property="password" />
</collection>
</resultMap>
<select id="listAll" resultMap="BaseResultMap">
SELECT a.id, a.name, c.username, c.password
FROM `role` a
LEFT JOIN `user_role` b on a.id = b.role_id
LEFT JOIN `user` c on c.id = b.user_id
</select>
</mapper>
五、创建接口类
创建包 tutorial.mybatis.mapper
,并在该包下创建接口 UserMapper
,内容如下
public interface UserMapper {
List<User> listAll();
}
public interface RoleMapper {
List<Role> listAll();
}
六、构建
准备工作就绪,开始最终章,创建启动类 MybatisConfig
,内容如下:
public class MybatisConfig {
private static SqlSessionFactory sqlSessionFactory;
private static Reader reader;
static {
try {
reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws IOException {
SqlSession session = sqlSessionFactory.openSession();
try {
listUser(session);
listRole(session);
} finally {
session.close();
}
}
/**
* 查询用户
*/
public static void listUser(SqlSession session) {
UserMapper userMapper = session.getMapper(UserMapper.class);
System.out.println("------- 获取用户列表 --------");
printUser(userMapper.listAll());
}
/**
* 查询角色
*/
public static void listRole(SqlSession session) {
RoleMapper roleMapper = session.getMapper(RoleMapper.class);
System.out.println("------- 获取角色列表 --------");
printRole(roleMapper.listAll());
}
private static void printRole(List<Role> list) {
if (list != null && !list.isEmpty()) {
for (Role role : list) {
printRole(role);
}
}
}
private static void printRole(Role role) {
if (role == null) {
System.out.println("没有找到数据");
} else {
System.out.println("角色:" + role.getName());
printUser(role.getUserList());
}
}
private static void printUser(List<User> list) {
if (list != null && !list.isEmpty()) {
for (User user : list) {
printUser(user);
}
}
}
private static void printUser(User user) {
if (user == null) {
System.out.println("没有找到数据");
} else {
String userInfo = "ID:" + user.getId() + "名字:" + user.getUsername()+", 密码:" + user.getPassword();
System.out.println(userInfo);
printRole(user.getRoleList());
}
}
}
打印结果为:
------- 获取用户列表 --------
ID:1名字:user1, 密码:123
角色:admin
角色:user
ID:2名字:user2, 密码:123
角色:user
------- 获取角色列表 --------
角色:admin
ID:1名字:user1, 密码:123
角色:user
ID:1名字:user1, 密码:123
ID:2名字:user2, 密码:123