mybatis多对多查询
mybatis多对多查询
多对多关系其实我们看成是双向的一对多关系
需求:实现用户和角色的多对多查询
1、用户实体类
package com.yl.bean;
import java.io.Serializable;
import java.sql.Date;
import java.util.List;
/**
* 用户实体类
*/
public class User implements Serializable {
private Integer id;//id
private String username;//用户名
private Date birthday;//生日
private String sex;//性别
private String address;//地址
private List<Role> roleList;//用户所包含的角色
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public List<Role> getRoleList() {
return roleList;
}
public void setRoleList(List<Role> roleList) {
this.roleList = roleList;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
2、角色实体类
package com.yl.bean;
import java.io.Serializable;
import java.util.List;
/**
* 角色实体类
*/
public class Role implements Serializable {
private Integer id;//id
private String name;//姓名
private String desc;//描述
private List<User> userList;//角色所包含的用户
public Role() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
@Override
public String toString() {
return "Role{" +
"id=" + id +
", name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
}
3、用户持久层接口
package com.yl.dao;
import com.yl.bean.User;
import java.util.List;
/**
* 用户持久层接口
*/
public interface IUserDao {
/**
* 查询所有用户
*/
List<User> queryAll();
}
4、角色持久层接口
package com.yl.dao;
import com.yl.bean.Role;
import java.util.List;
/**
* 角色持久层接口
*/
public interface IRoleDao {
/**
* 查询所有
*/
List<Role> queryAll();
}
5、全局配置文件
<?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>
<!--配置别名-->
<typeAliases>
<package name="com.yl.bean"/>
</typeAliases>
<!--配置mybatis环境-->
<environments default="mysql">
<!--配置mysql环境-->
<environment id="mysql">
<!--事务类型-->
<transactionManager type="JDBC"></transactionManager>
<!--数据源-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8&serverTimezone=GMT%2B8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件位置-->
<mappers>
<mapper resource="IUserDao.xml"></mapper>
<mapper resource="IRoleDao.xml"></mapper>
</mappers>
</configuration>
6、用户映射配置文件
<?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.yl.dao.IUserDao">
<!--配置用户实体类和数据库的对应信息-->
<resultMap id="userMap" type="com.yl.bean.User">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="birthday" column="birthday"></result>
<result property="sex" column="sex"></result>
<result property="address" column="address"></result>
<!--多对多映射关系-->
<collection property="roleList" ofType="com.yl.bean.Role">
<id property="id" column="rid"></id>
<result property="name" column="role_name"></result>
<result property="desc" column="role_desc"></result>
</collection>
</resultMap>
<!--查询所有用户-->
<select id="queryAll" resultMap="userMap">
SELECT u.*,r.`ID` rid,r.`ROLE_DESC`,r.`ROLE_NAME` FROM USER u LEFT OUTER JOIN user_role ur
ON u.`ID`=ur.uid
LEFT OUTER JOIN role r
ON r.`id`=ur.rid
</select>
</mapper>
7、角色映射配置文件
<?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.yl.dao.IRoleDao">
<!--配置角色实体类和数据库的对应信息-->
<resultMap id="roleMap" type="com.yl.bean.Role">
<id property="id" column="rid"></id>
<result property="name" column="role_name"></result>
<result property="desc" column="role_desc"></result>
<!--多对多映射关系-->
<collection property="userList" ofType="com.yl.bean.User">
<id property="id" column="id"></id>
<result property="username" column="username"></result>
<result property="birthday" column="birthday"></result>
<result property="sex" column="sex"></result>
<result property="address" column="address"></result>
</collection>
</resultMap>
<!--查询所有角色-->
<select id="queryAll" resultMap="roleMap">
SELECT u.*,r.`ID` rid,r.`ROLE_DESC`,r.`ROLE_NAME` FROM role r LEFT OUTER JOIN user_role ur
ON r.`ID`=ur.rid
LEFT OUTER JOIN USER u
ON u.`id`=ur.`UID`
</select>
</mapper>
8、用户测试类
package com.yl;
import com.yl.bean.Role;
import com.yl.bean.User;
import com.yl.dao.IRoleDao;
import com.yl.dao.IUserDao;
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 inputStream;
private IUserDao userDao;
private SqlSession sqlSession;
@Before
public void init() throws IOException {
//读取配置文件
inputStream= Resources.getResourceAsStream("SqlMapperConfig.xml");
//创建工厂
SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sessionFactory= factoryBuilder.build(inputStream);
//创建SqlSession对象
sqlSession=sessionFactory.openSession();
//创建IUserDao接口代理对象
userDao=sqlSession.getMapper(IUserDao.class);
}
@After
public void after() throws IOException {
//提交事务
sqlSession.commit();;
//关闭资源
sqlSession.close();
inputStream.close();
}
/**
* 查询所有
*/
@Test
public void test01() throws IOException {
//查询所有角色
List<User> userList=userDao.queryAll();
//遍历输出
for (User user:userList){
System.out.println(user);
System.out.println(user.getRoleList());
}
}
}
9、角色测试类
package com.yl;
import com.yl.bean.Role;
import com.yl.dao.IRoleDao;
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 inputStream;
private IRoleDao roleDao;
private SqlSession sqlSession;
@Before
public void init() throws IOException {
//读取配置文件
inputStream= Resources.getResourceAsStream("SqlMapperConfig.xml");
//创建工厂
SqlSessionFactoryBuilder factoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sessionFactory= factoryBuilder.build(inputStream);
//创建SqlSession对象
sqlSession=sessionFactory.openSession();
//创建IUserDao接口代理对象
roleDao=sqlSession.getMapper(IRoleDao.class);
}
@After
public void after() throws IOException {
//提交事务
sqlSession.commit();;
//关闭资源
sqlSession.close();
inputStream.close();
}
/**
* 查询所有
*/
@Test
public void test01() throws IOException {
//查询所有角色
List<Role> roleList=roleDao.queryAll();
//遍历输出
for (Role role:roleList){
System.out.println(role);
System.out.println(role.getUserList());
}
}
}
记得快乐
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!