• JAVA入门[9]-mybatis多表关联查询


    概要

    本节要实现的是多表关联查询的简单demo。场景是根据id查询某商品分类信息,并展示该分类下的商品列表。

    一、Mysql测试数据

    新建表Category(商品分类)和Product(商品),并插入几条测试数据。

    create table Category (
    Id int not null auto_increment,
    Name varchar(80) null,
    constraint pk_category primary key (Id)
    );
    
    INSERT INTO category(Name) VALUES ('女装');
    INSERT INTO category(Name) VALUES ('美妆');
    INSERT INTO category(Name) VALUES ('书籍');
    
    
    create table product (
    Id int not null auto_increment,
    categoryId int not null,
    Name varchar(80) null,
    constraint pk_product primary key (Id),
    constraint fk_product_2 foreign key (categoryId)
    references category (Id)
    );
    create index productCat on product (categoryId);
    
    
    INSERT INTO product(CategoryId,Name) VALUES (1, '裂帛');
    INSERT INTO product(CategoryId,Name) VALUES (1, '雅鹿');
    INSERT INTO product(CategoryId,Name)  VALUES (2,'膜法世家');
    INSERT INTO product(CategoryId,Name)  VALUES (2,'御泥坊');
    INSERT INTO product(CategoryId,Name)  VALUES (2, '雅诗兰黛');
    INSERT INTO product(CategoryId,Name)  VALUES (2, '欧莱雅');
    INSERT INTO product(CategoryId,Name)  VALUES (2, '韩后');
    INSERT INTO product(CategoryId,Name)  VALUES (2, '相宜本草');
    INSERT INTO product(CategoryId,Name)  VALUES (3,'疯狂JAVA');
    INSERT INTO product(CategoryId,Name)  VALUES (3,'JAVA核心技术');

    二、配置mybatis-generator-config.xml

    配置mybatis-generator-config.xml的方法见 JAVA入门[7]-Mybatis generator(MBG)自动生成mybatis代码 ,这里主要改动的是table节点。

    <table tableName="category" enableCountByExample="true" enableDeleteByExample="true" enableSelectByExample="true" enableUpdateByExample="true">
        <generatedKey column="Id" sqlStatement="mysql" identity="true"/>
    </table>
    <table tableName="product" enableCountByExample="true" enableSelectByExample="true" enableSelectByPrimaryKey="true" enableUpdateByPrimaryKey="true" enableDeleteByPrimaryKey="true" enableInsert="true">
        <generatedKey column="Id" sqlStatement="mysql" identity="true"></generatedKey>
    </table>

    配置好xml文件后,在Maven面板运行mybatis-generator:generate,自动生成相关的类。

    Image(36)

    三、自定义mybatis关联查询

    1.封装实体dto

    我们新定义CategoryDto,封装商品分类信息及其商品列表。

    public class CategoryDto {
        private Category category;
        private List<Product> products;
        private int id;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public Category getCategory() {
            return category;
        }
    
        public void setCategory(Category category) {
            this.category = category;
        }
    
        public List<Product> getProducts() {
            return products;
        }
    
        public void setProducts(List<Product> products) {
            this.products = products;
        }
    }

    2.为CategoryMapper.java接口新增方法getById()

    CategoryDto getById(int id);

    3.配置CategoryMapper.xml

    首先定义select节点,id对应上面的方法名getById;parameterType参数类型为Integer;resultMap为自定义resultMap的id。

     <select id="getById" parameterType="java.lang.Integer" resultMap="CategoryResult">
        SELECT Category.Id AS CateId,Category.Name AS CateName,Product.Id AS ProductId,Product.Name AS ProductName
        FROM Category,Product
        WHERE Category.Id=Product.CategoryId AND Category.Id=#{id}
      </select>

    接下来定义resultMap节点id为CategoryResult,type为CategoryDto。

    关于resultMap:

    • id – 一个 ID 结果;标记结果作为 ID 可以帮助提高整体效能
    • result – 注入到字段或 JavaBean 属性的普通结果
    • association – 一个复杂的类型关联;许多结果将包成这种类型
      • 嵌入结果映射 – 结果映射自身的关联,或者参考一个
    • collection – 复杂类型的集
      • 嵌入结果映射 – 结果映射自身的集,或者参考一个

    完整参考官网:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Result_Maps

    用association对应category,collection对应products,然后用result对应到每个具体字段。

    <resultMap id="CategoryResult" type="com.data.dto.CategoryDto">
        <association property="category" javaType="com.data.pojo.Category">
          <result property="id" column="CateId"></result>
          <result property="name" column="CateName"></result>
        </association>
        <collection property="products" ofType="com.data.pojo.Product">
          <result property="id" column="ProductId"></result>
          <result property="name" column="ProductName"></result>
        </collection>
      </resultMap>

    四、测试

    在上一节测试基础上新增测试方法:

    @Test
        public void test_getById(){
            int id=2;
            CategoryDto dto= categoryMapper.getById(id);
            if(dto==null){
                System.out.println("不存在");
            }else {
    
                System.out.println("商品id="+dto.getId()+" name="+dto.getCategory().getName());
                System.out.println("Products:"+dto.getProducts().size());
                for(Product product:dto.getProducts()){
                    System.out.println("    |_"+product.getName());
                }
            }
    
        }

    运行之后居然报错了

    org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 6

    后来找到了解决方案,修改resultMap,添加id节点就可以了。

    <resultMap id="CategoryResult" type="com.data.dto.CategoryDto">
      <id property="id" column="CateId"></id>
    ……
    </resultMap>

    运行结果:

    商品id=2 name=美妆

    Products:6

        |_膜法世家

        |_御泥坊

        |_雅诗兰黛

        |_欧莱雅

        |_韩后

        |_相宜本草

    源码地址:http://pan.baidu.com/s/1eScI7z8

  • 相关阅读:
    Android众说纷纭分辨率
    Android初识Helloworld
    Android从零开始
    PHP使用APC获取上传文件进度
    央行mlf,SLF,PSL,MLF,SLO
    python的lxml解析器
    美国风投行业50年数据揭示的10条VC投资秘密法则
    osx的10款文本编辑器
    nano命令,vi ed pico sed joe emacs jed ex
    修改centos7/osx的MAC地址
  • 原文地址:https://www.cnblogs.com/janes/p/6437351.html
Copyright © 2020-2023  润新知