mysql 多对多映射_MyBatis中多对多关系的映射和查询
发布日期:2021-06-24 12:40:34 浏览次数:2 分类:技术文章

本文共 3064 字,大约阅读时间需要 10 分钟。

先说一下需求:

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

创建表:

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

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

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

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

create table book

(

bid int primary key auto_increment,

bname varchar(20)

);

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

create table category

(

cid int primary key auto_increment,

cname varchar(20)

);

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

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)

);

插入测试数据

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);

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

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

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

a5ed75cd20c15c76243a646e5792f948.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();

}

}

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

修改后的图书实体类如下

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;

}

}

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

select

*

from

book b

inner join

middle m

on

b.bid=m.m_bid

inner join

category c

on

m.m_cid=c.cid

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

4e3a3456b893ac6d43da42ce297985ca.png

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

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

public interface BookMapper {

List queryAll();

}

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

select

*

from

book b

inner join

middle m

on

b.bid=m.m_bid

inner join

category c

on

m.m_cid=c.cid

最后我们 编写main方法测试

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");

}

}

}

测试结果如下图

c4795d1dd1de511f66a740a736048326.png

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

完整项目下载:点击下载

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

转载地址:https://blog.csdn.net/weixin_32804237/article/details/113201651 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:mysql 中的左右连接_MySQL之内连接、左连接和右连接
下一篇:java 调用mysql存储过程实例_java 调用mysql的存储过程(简单示例)

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月20日 23时26分37秒