mysql 多对多映射_MyBatis中多对多关系的映射和查询

先说一下需求:

在页面上显示数据库中的所有图书,显示图书的同时,显示出该图书所属的类别(这里一本书可能同时属于多个类别)

测试环境:MySQL、MyEclipse

创建表:

笔者这里使用 中间表 连接 图书表 和 图书类别表,图书表中 没有使用外键关联 图书类别表

而是在中间表中引用了 图书主键 和 类别主键

通过中间表来 表示 图书 和 图书类别 的关系

建立图书表(图书编号,图书名字)

create table book

(

bid int primary key auto_increment,

bname varchar(20)

);

建立类别表(类别编号,类别名字)

create table category

(

cid int primary key auto_increment,

cname varchar(20)

);

建立中间表(图书编号,类别编号)

48304ba5e6f9fe08f3fa1abda7d326ab.png

create table middle

(

m_bid int,

m_cid int,

constraint fk_bid foreign key(m_bid) references book(bid),

constraint fk_cid foreign key(m_cid) references category(cid)

);

48304ba5e6f9fe08f3fa1abda7d326ab.png

插入测试数据

48304ba5e6f9fe08f3fa1abda7d326ab.png

insert into category values (default,'java');

insert into category values (default,'c++');

insert into category values (default,'mysql');

insert into book values (default,'SQL技术');

insert into book values (default,'SSM+MySQL详解');

insert into book values (default,'C++和java对比');

insert into middle values (1,3);

insert into middle values (2,1);

insert into middle values (2,3);

insert into middle values (3,2);

insert into middle values (3,1);

48304ba5e6f9fe08f3fa1abda7d326ab.png

插入的数据中,第一本书 有一个类别,第二本书和第三本书都有两个类别

到现在为止,数据库的事情就完事了。下面,通过MyBatis-Generator生成实体类、DAO接口、XML映射文件  不会点击这里

为了方便省事,笔者这里通过Java项目演示,将自动生成的文件 放入新建的Java项目中,导入相关的Jar包,项目结构 如下图

9fc71d4cf85afbb26ca8589b4398651f.png

现在我们打开生成的 图书实体类 看一下

48304ba5e6f9fe08f3fa1abda7d326ab.png

public class Book {

private Integer bid;

private String bname;

public Integer getBid() {

return bid;

}

public void setBid(Integer bid) {

this.bid = bid;

}

public String getBname() {

return bname;

}

public void setBname(String bname) {

this.bname = bname == null ? null : bname.trim();

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

只有图书编号、图书名字 这两个属性,而我们的需求是 得到图书的同时,得到该图书所属的 所有类别, 所以 我们可以考虑 给图书实体类 添加 一个 图书类别的集合

修改后的图书实体类 如下

48304ba5e6f9fe08f3fa1abda7d326ab.png

public class Book {

private Integer bid;

private String bname;

private List categories;

public Integer getBid() {

return bid;

}

public void setBid(Integer bid) {

this.bid = bid;

}

public String getBname() {

return bname;

}

public void setBname(String bname) {

this.bname = bname == null ? null : bname.trim();

}

public List getCategories() {

return categories;

}

public void setCategories(List categories) {

this.categories = categories;

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

下面 我们开始写SQL语句,使用连接查询 查出所有的图书和图书类别

48304ba5e6f9fe08f3fa1abda7d326ab.png

select

*

from

book b

inner join

middle m

on

b.bid=m.m_bid

inner join

category c

on

m.m_cid=c.cid

48304ba5e6f9fe08f3fa1abda7d326ab.png

执行结果如下 完美的显示了所有图书 和 该图书的类别

5390cee0d705c72be45ed34ab5ea0df5.png

下面 我们就在XML映射文件中动手脚,使得 这些数据 能按我们所期望的 自动填充到 图书实体类中

这里为突出重点 所以将图书的映射文件和DAO接口 清空,清空后 如下

48304ba5e6f9fe08f3fa1abda7d326ab.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

public interface BookMapper {

List queryAll();

}

清空后 我们开始编写,编写结果如下

48304ba5e6f9fe08f3fa1abda7d326ab.png

select

*

from

book b

inner join

middle m

on

b.bid=m.m_bid

inner join

category c

on

m.m_cid=c.cid

48304ba5e6f9fe08f3fa1abda7d326ab.png

最后我们 编写main方法测试

48304ba5e6f9fe08f3fa1abda7d326ab.png

public class MyMain {

public static void main(String[] args) throws IOException {

String resource = "mybatis-config.xml";

Reader reader = Resources.getResourceAsReader(resource);

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);

SqlSession session = factory.openSession();

BookMapper bookMapper = session.getMapper(BookMapper.class);

for (Book book : bookMapper.queryAll()) {

System.out.print("["+book.getBname()+"]");

for(Category category :book.getCategories()){

System.out.print(category.getCname()+"\t");

}

System.out.println("\n");

}

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

测试结果如下图

6390e846812a04a00c3c1664a11bf6a2.png

成功输出了 所有图书 和 对应的图书类别

完整项目下载:点击下载 (为方便,笔者将SSM整合的jar包引入到项目中了,大家可以删去无用的jar包)

笔者能力有限,有哪些可以改进或者不对的地方欢迎提出!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 进行多查询多对多关系,可以通过以下步骤实现: 1. 创建对应的数据库,包括主要的两个和一个。 2. 在 Java 代码创建对应的实体类,并进行关联映射。 3. 创建 XML 映射文件,编写 SQL 查询语句。 4. 在 MyBatis 的配置文件配置对应的映射关系。 5. 调用 MyBatis 的接口方法进行多查询。 具体步骤如下: 1. 创建数据库,假设有两个:`users` 和 `roles`,为 `user_role`。其 `users` 包含用户信息,`roles` 包含角色信息,`user_role` 用于关联用户和角色。 2. 创建 Java 实体类,分别对应 `User` 和 `Role`,并在 `User` 类包含一个 `List<Role>` 的属性。 ```java public class User { private int id; private String username; private List<Role> roles; // Getters and setters } public class Role { private int id; private String roleName; // Getters and setters } ``` 3. 创建 XML 映射文件 `UserMapper.xml`,编写 SQL 查询语句。 ```xml <!-- 查询用户及其角色信息 --> <select id="getUserWithRolesById" resultMap="userMap"> SELECT u.id, u.username, r.id AS role_id, r.roleName FROM users u INNER JOIN user_role ur ON u.id = ur.userId INNER JOIN roles r ON r.id = ur.roleId WHERE u.id = #{id} </select> <!-- 映射结果 --> <resultMap id="userMap" type="User"> <id property="id" column="id" /> <result property="username" column="username" /> <collection property="roles" ofType="Role"> <id property="id" column="role_id" /> <result property="roleName" column="roleName" /> </collection> </resultMap> ``` 4. 配置 MyBatis 的配置文件 `mybatis-config.xml`,包括连接数据库的配置和映射文件的配置。 ```xml <!-- 数据库连接配置 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> <!-- 映射文件配置 --> <mappers> <mapper resource="com/example/mappers/UserMapper.xml" /> </mappers> ``` 5. 调用 MyBatis 的接口方法进行多查询。 ```java // 创建 MyBatis 的 SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml")); // 获取 SqlSession SqlSession sqlSession = sqlSessionFactory.openSession(); // 获取 Mapper 接口实例 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 调用接口方法进行多查询 User user = userMapper.getUserWithRolesById(1); // 打印查询结果 System.out.println(user.getUsername()); for (Role role : user.getRoles()) { System.out.println(role.getRoleName()); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值