myBatis 多对多

先说明一下需求:

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

测试环境:MySQL、MyEclipse

创建表:

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

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

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

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

create table book
(
    bid int primary key auto_increment,
    bname 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映射文件

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

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

  

时间: 2024-12-23 11:30:10

myBatis 多对多的相关文章

mybatis多对一关联

mybatis多对一关联查询实现 1.定义实体 定义实体的时候需要注意,若是双向关联,就是说双方的属性中都含有对方对象作为域属性出现, 那么在写toString()方法时需要注意,只让某一方输出即可,不要让双方的toString()都输出对方, 这样会形成递归调用,程序会出错,报堆栈溢出. Country实体类 Minsiter 实体类 2.数据库设计 a) country数据库 b) minsiter数据库 3.DAO层设计 4.service层设计 5.impl实现类 6.Controlle

mybatis 多对多 处理

下面的例子让新手看不错.可以改进的一点是 1.不必建立 关联对象实体,可以用map传递两个id进去 2.文章的resultMap 继承和 查询配置 比较清楚,可以借鉴 mybatis3.0添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联删除操作.因此在进行实体类多对多映射表设计时,需要专门建立一个关联对象类对相关实体类的关联关系进行描述.下文将以"User"和"Group"两

mybatis多对多关联查询——(十)

1.需求 查询用户及用户购买商品信息. 2     sql语句 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表: orders.orderdetail.items SELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.

Mybatis 多对多(易百教程)

mybatis3.0 添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联删除操作.因此在进行实体类多对多映射表设计时,需要专门建立一个关联对象类对相关实体类的关联关系进行描述.下文将以"User"和"Group"两个实体类之间的多对多关联映射为例进行CRUD操作. 1.应用场景 假设项目中存在用户和用户组,从一个用户读取出它所在的用户组,从一个用户组也知道这个组内的所有用户信息

mybatis多对一

产品和分类的多对一关系 多个产品属于一个分类 public class Product { private int id; private String name; private float price; private Category category; public Category getCategory() { return category; } public void setCategory(Category category) { this.category = categor

Mybatis—多对一和一对多

1.多对一处理 多对一: 多个学生,对应一个老师 对于学生这边而言, 关联 .. 多个学生,关联一个老师 [多对一] 对于老师而言, 集合 , 一个老师,有很多学生 [一对多] 搭建环境 创建Teacher,Student表并插入 Teacher表 CREATE TABLE `teacher` ( `id` INT(10) NOT NULL, `name` VARCHAR(30) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT C

mybatis 多对多映射关系

xml映射文件:一个用户对应多个订单,一个订单对应多个订单明细,一个订单明细对应一个商品 可以推断出用户和商品是多对多的关系用户和商品的关系分析 可以发现一层套一层... <!-- #######################################多对多的关系映射####################################################### --> <resultMap type="cn.itcast.domain.User"

mybatis多对多级联查询

1.实体 package com.govmade.govdata.modules.sys.pojo; import java.util.List; import javax.persistence.Table; import javax.persistence.Transient; import com.google.common.collect.Lists; import com.govmade.govdata.common.persistence.BasePo; @Table(name =

mybatis多对多映射

数据库里面有角色实体类app_cms_role 权限实体类app_cms_right 以及一张中间表app_cms_role_right 建立对应的实体类AppCmsRole package com.qianlong.cms.entity; import java.util.Date; import java.util.Set; public class AppCmsRole { private Integer id; private String name; private Date crea