zoukankan      html  css  js  c++  java
  • 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()+"	");
                }
                System.out.println("
    ");
            }
        }
    }
    

      

  • 相关阅读:
    【MySQL】MySQL之备份
    【MySQL】MySQL之导入和导出
    MySQL逻辑备份之MySQLDump
    【Perl】Linux下安装Perl
    【MySQL】MySQL NDB Cluster维护
    【MySQL】MySQL NDB Cluster安装
    Linux服务器开启ssh服务,实现ssh远程登陆!
    PDO异常处理
    PHP异常处理
    PDO中的事务处理
  • 原文地址:https://www.cnblogs.com/dongyuhan/p/7191393.html
Copyright © 2011-2022 走看看