lovebet体育官网JAVA入门[9]-mybatis多表关联查询。JAVA入门[9]-mybatis多表关联查询,java-mybatis

概要

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

概要

本节而实现之凡多表关联查询的大概demo。场景是基于id查询有商品分类信息,并展示该分类下之货品列表。

本节要是兑现之是多表关联查询的简短demo。场景是因id查询有商品归类信息,并展示该分类下之货物列表。

如出一辙、Mysql测试数据

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

lovebet体育官网 1create
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); create index productName on product
(Name); 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核心技术’); db.sql

同等、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,自动生成相关的近乎。

其三、自定义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>

 

二、配置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,自动生成相关的类似。

lovebet体育官网 2

四、测试

于达到同节省测试基础及增产测试方法:

@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

http://www.bkjia.com/Javabc/1195322.htmlwww.bkjia.comtruehttp://www.bkjia.com/Javabc/1195322.htmlTechArticleJAVA入门\[9\]-mybatis多表关联查询,java-mybatis
概要
本节要落实的凡多表关联查询的简约demo。场景是根据id查询有商品分类信息,并显示该分类…

其三、自定义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