Java自学之mybatis:多对一查询

本文介绍如何使用MyBatis实现商品与分类的多对一查询,通过修改Product类添加Category属性,配置XML映射文件实现关联查询,最后展示测试代码及结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习目的:查询出所有的Product(商品)数据,每一个商品都有分类(Category),且可能多个商品属于同一个分类。根据以上关系,使用mybatis完成多对一查询。

Part 1

修改Product类,加入Category属性,并添加相应的getter、setter。

package cn.vaefun.pojo;

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 = category;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Product{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

Part 2

在pojo包里新增一个product.xml,配置如下:

或者将<mapper>和<select>配置在pojo.xml文件中(基于前面几节的学习)。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybaits.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="cn.vaefun.pojo">
        <resultMap id="productBean" type="Product">
            <id column="pid" property="id"/>
            <result column="pname" property="name"/>
            <result column="price" property="price"/>
<!--            多对一的关系-->
<!--            property:属性名称-->
<!--            javatype:属性的类型-->
            <association property="category" javaType="Category">
                <id column="cid" property="id"/>
                <result column="cname" property="name"/>
            </association>
        </resultMap>

<!--        根据id查询Product 关联将orders查询出来-->
        <select id="listProductNTo1" resultMap="productBean">
            select c.*, p.*, c.id 'cid', p.id 'pid', c.name 'cname',
                p.name 'pname' from category_ c left join product_ p on c.id = p.cid
        </select>
    </mapper>

Part 3

在mybatis-config.xml中,关联product.xml(代码中加粗的部分)。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <package name="cn.vaefun.pojo"/>
        <!--    扫描该包下的类
            使得在后续配置文件pojo.xml中使用resultType的时候,可以直接使用Category,
            而不必写全cn.vaefun.pojo.Category-->
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/vaefun_mybatis?characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="cn/vaefun/pojo/pojo.xml"/>
        <mapper resource="cn/vaefun/pojo/product.xml"/>
        <!--    映射pojo.xml    -->
    </mappers>
</configuration>

Part 4

测试代码块

    /**
     * 多对一查询
     * @param session
     */
    public static void listProductNTo1(SqlSession session){
        List<Product> productList = session.selectList("listProductNTo1");
        for (Product p :
                productList) {
            System.out.println(p+"对应的分类是\t"+p.getCategory());
        }
    }

测试结果

v2-c82928a3a98ba51aa62b3b53cc2808b1_b.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值