MyBatis中多对多关系的映射和查询
程序员文章站
2024-03-07 12:51:51
先说一下需求:
在页面上显示数据库中的所有图书,显示图书的同时,显示出该图书所属的类别(这里一本书可能同时属于多个类别)
创建表:
笔者这里使用中间表连接图书表和...
先说一下需求:
在页面上显示数据库中的所有图书,显示图书的同时,显示出该图书所属的类别(这里一本书可能同时属于多个类别)
创建表:
笔者这里使用中间表连接图书表和图书类别表,图书表中没有使用外键关联图书类别表
而是在中间表中引用了图书主键和类别主键
通过中间表来 表示 图书 和 图书类别 的关系
建立图书表(图书编号,图书名字)
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包,项目结构 如下图
现在我们打开生成的 图书实体类 看一下
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<category> 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<category> getcategories() { return categories; } public void setcategories(list<category> 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
执行结果如下 完美的显示了所有图书 和 该图书的类别
下面 我们就在xml映射文件中动手脚,使得 这些数据 能按我们所期望的 自动填充到 图书实体类中
这里为突出重点 所以将图书的映射文件和dao接口 清空,清空后 如下
<?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.mybatis.dao.bookmapper" > <select id="queryall"> </select> </mapper>
public interface bookmapper { list<book> queryall(); }
清空后 我们开始编写,编写结果如下
<?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.mybatis.dao.bookmapper" > <resultmap type="com.mybatis.entity.book" id="bookmap"> <id property="bid" column="bid" /> <result property="bname" column="bname" /> <collection property="categories" oftype="com.mybatis.entity.category"> <id property="cid" column="cid" /> <result property="cname" column="cname" /> </collection> </resultmap> <select id="queryall" resultmap="bookmap"> select * from book b inner join middle m on b.bid=m.m_bid inner join category c on m.m_cid=c.cid </select> </mapper>
最后我们 编写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"); } } }
测试结果如下图
成功输出了 所有图书 和 对应的图书类别
完整项目下载:点击下载
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!