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)
);
建立中间表(图书编号,类别编号)

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

测试结果如下图

Mybatis-多对多的更多相关文章
- mybatis多对一关联
		
mybatis多对一关联查询实现 1.定义实体 定义实体的时候需要注意,若是双向关联,就是说双方的属性中都含有对方对象作为域属性出现, 那么在写toString()方法时需要注意,只让某一方输出即可, ...
 - Java基础-SSM之mybatis多对多关联
		
Java基础-SSM之mybatis多对多关联 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.准备测试环境(创建数据库表) 1>.创建teas,stus,links表 u ...
 - MyBatis多对多查询
		
-------------------siwuxie095 MyBatis 多对多查询 以订单和商品为例,即 一个订单可 ...
 - mybatis多对多关联关系映射
		
mybatis多对多关联关系映射 多对多关系在java类实体中表示为,一个类中包含了集合为另一个类的属性.而这连个实体都需要包含对方的集合类的属性. 例如:订单和商品,一个订单包含多个商品,一个商品又 ...
 - mybatis多对一关联的两种方式
		
第一个种是Address找到自己的user_id,扔给User,让User自己去再查一次,即使在有缓存的前提下,每遇到一个新的user_id,就会查一次,对比hibernate的话,相当于多对一eag ...
 - mybatis多对多关联查询——(十)
		
1.需求 查询用户及用户购买商品信息. 2 sql语句 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表: orders.orderdetail. ...
 - mybatis多对多关联查询
		
多对多关系 一个学生可以选多门课程,而一门课程可以由多个学生选择,这就是一个典型的多对多关联关系.所谓多对多关系,其实是由两个互反的一对多关系组成.即多对多关系都会通过一个中间表来建立,例如选课表.学 ...
 - mybatis多对多
		
这里我们以用户 user 表和 角色role 表为例,假定一个用户能被分配成多重角色,而一种角色也能分给多个用户,故用户和角色构成多对多的关系 需求:给定角色id,查询这个角色所属的所有用户信息 ①. ...
 - mybatis多对一
		
产品和分类的多对一关系 多个产品属于一个分类 public class Product { private int id; private String name; private float pri ...
 - Mybatis 多对多(易百教程)
		
mybatis3.0 添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联删除操作.因此在进行实体类多对多映射表 ...
 
随机推荐
- 简易-五星评分-jQuery纯手写
			
超级简单的评分功能,分为四个步骤轻松搞定: 第一步: 引入jquery文件:这里我用百度CDN的jquery: <script src="http://apps.bdimg.com/l ...
 - iOS架构设计-URL缓存
			
概览 缓存组件应该说是每个客户端程序必备的核心组件,试想对于每个界面的访问都必须重新请求势必降低用户体验.但是如何处理客户端缓存貌似并没有统一的解决方案,多数开发者选择自行创建数据库直接将服务器端请求 ...
 - hdu3715
			
hdu3715 题意 给出一个递归的伪代码,当 x[a[dep]] + x[b[dep]] != c[dep],就向下递归,给出a,b,c数组的值 问 dep 最大多少.其中 0 <= c[i] ...
 - .Net中的AOP系列之《AOP实现类型》
			
返回<.Net中的AOP>系列学习总目录 本篇目录 AOP是如何跑起来的 运行时编织 复习代理模式 动态代理 编译时编织 后期编译(PostCompiling) 来龙去脉 运行时编织 VS ...
 - Backbox Linux简介与配置内网IP
			
总体说起来,Backbox内置的工具什么的,并不是很多,但是它集成了一些用起来很棒的工具. 比如:Beef.Sqlmap.wpscan.zenmap.msf.w3af.dns嗅探等一系列工具,传说中的 ...
 - 编写一个简单的Web Server
			
编写一个简单的Web Server其实是轻而易举的.如果我们只是想托管一些HTML页面,我们可以这么实现: 在VS2013中创建一个C# 控制台程序 编写一个字符串扩展方法类,主要用于在URL中截取文 ...
 - VR全景智慧城市常诚:信息技术点亮“智慧城市”
			
亚太城市峰会暨市长论坛日前在澳大利亚昆士兰州首府布里斯班举行,"智慧城市"成为焦点议题.来自135个国家和地区的市长.副市长及代表们共同讨论如何利用高新科技解决城市发展中的问题,让 ...
 - .NET ORM框架 SqlSuagr4.0 功能详解与实践【开源】
			
SqlSugar 4.0 ORM框架的优势 为了未来能够更好的支持多库分布式的存储,并行计算等功能,将SqlSugar3.x全部重写,现有的架构可以轻松扩展多库. 源码下载: https://gith ...
 - node.js零基础详细教程(7.5):mongo可视化工具webstorm插件、nodejs自动重启模块Node Supervisor(修改nodejs后不用再手动命令行启动服务了)
			
第七章 建议学习时间4小时 课程共10章 学习方式:详细阅读,并手动实现相关代码 学习目标:此教程将教会大家 安装Node.搭建服务器.express.mysql.mongodb.编写后台业务逻辑. ...
 - canvas学习总结三:绘制虚线
			
上一章节我们说到,线性路径的绘制,主要利用movoTo(),lineTo()等方法,当然 Canvas 2D API 也提供了虚线的绘制方法,CanvasRenderingContext2D.setL ...