.Mybatis的注解开发(@Results、@Resut、@One、@Many)

本文介绍了如何使用Mybatis的注解进行开发,包括基于注解的简单操作,不再需要xml配置。重点讲解了一对一、一对多和多对多的注解实现,提供了详细的代码示例和关键配置,帮助理解如何在接口中直接定义SQL操作。

1、基于注解的简单操作

在这里插入图片描述
在这里插入图片描述
我们可以不用xxxMapper.xml了
把sqlMapConfig.xml的
在这里插入图片描述

换成这个:

在这里插入图片描述

2.基于注解的多表操作,一对一、一对多、多对多

在这里插入图片描述
在这里插入图片描述
代码的注释可参考xml的博客:https://blog.youkuaiyun.com/GLOAL_COOK/article/details/113523359

2.1一对一

在这里插入图片描述在这里插入图片描述

之前是在xml这样写:
在这里插入图片描述
现在不要xxxMapper.xml,直接在xxxMapper接口写:

package com.itheima.mapper;

import com.itheima.domain.Order;
import com.itheima.domain.Sys_user;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;

import java.util.List;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/1 23:12
 */
public interface OrderMapper {
   
   

    @Select("select * from orders")
    @Results({
   
   
            @Result(column = "id",property = "id"),
            @Result(column = "ordertime",property = "ordertime"),
            @Result(column = "total",property = "total"),
            @Result(column = "uid",property = "uid"),
            @Result(
                    property = "sys_user",  //写你下面要封装实体(Order)的属性名称(private Sys_user sys_user)
                    column = "uid", //写根据哪个字段去查询sys_user表的数据,就表示这里是select * from orders查到的uid再去请求下面的findById的意思
                    javaType = Sys_user.class,  //写你这个Result要封装的实体类型
                    //select属性  代表查询哪个接口的方法获得数据,前提是findById是真的的存在的方法
                    one = @One(select = "com.itheima.mapper.UserMapper.findById")
            )

    })
    public List<Order> findAll();  //演示一对一,一个订单对应一个用户,全部查出来而已
}

在这里插入图片描述

2.2 一对多

在这里插入图片描述在这里插入图片描述
之前这样写:
在这里插入图片描述现在这样:

在这里插入图片描述

在这里插入图片描述

2.3多对多

在这里插入图片描述

跟1对多差不多,多个中间表而已(不用建实体类)
在这里插入图片描述

在这里插入图片描述
之前xml是这样的:
在这里插入图片描述现在是这样的:
在这里插入图片描述

在这里插入图片描述

3.代码:

在这里插入图片描述
domain:

package com.itheima.domain;

import java.util.Date;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/1 16:32
 */
public class Order {
   
   
    private int id;
    private Date ordertime;
    private double total;
    private int uid;

    @Override
    public String toString() {
   
   
        return "Order{" +
                "id=" + id +
                ", ordertime=" + ordertime +
                ", total=" + total +
                ", uid=" + uid +
                ", sys_user=" + sys_user +
                '}';
    }

    public int getUid() {
   
   
        return uid;
    }

    public void setUid(int uid) {
   
   
        this.uid = uid;
    }

    //当前订单属于哪个用户(外键在实体类得用对象或者对象集合岚表示),1.演示一对一
    private Sys_user sys_user;

    public int getId() {
   
   
        return id;
    }

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

    public Date getOrdertime() {
   
   
        return ordertime;
    }

    public void setOrdertime(Date ordertime) {
   
   
        this.ordertime = ordertime;
    }

    public double getTotal() {
   
   
        return total;
    }

    public void setTotal(double total) {
   
   
        this.total = total;
    }

    public Sys_user getSys_user() {
   
   
        return sys_user;
    }

    public void setSys_user(Sys_user sys_user) {
   
   
        this.sys_user = sys_user;
    }
}

package com.itheima.domain;

/**
 * @author QLBF
 * @version 1.0
 * @date 2021/2/1 18:22
 */
public class Role {
   
   
    private int id;
    private String roleName;
    private String roleDesc;

    @Override
    public String toString() {
   
   
        return "Role{" +
                "id=" + id +
                ", roleName='" + roleName + '\'' +
                ", roleDesc='" + roleDesc + '\'' +
                '}'
MyBatis中,@One@Many是用于处理一对一和一对多关系的注解。它们用于在结果映射中定义实体类之间的关联关系。 1. **@One注解**: - 用于处理一对一的关系。 - 通过一个查询语句来加载关联的实体对象。 - 通常与`@Select`注解结合使用,定义一个查询来获取关联对象。 2. **@Many注解**: - 用于处理一对多的关系。 - 通过一个查询语句来加载关联的实体对象集合。 - 通常与`@Select`注解结合使用,定义一个查询来获取关联对象集合。 以下是两个示例,展示了如何使用@One@Many注解: ```java public class User { private Integer id; private String name; // 一对一关系 @One(select = "com.example.mapper.OrderMapper.getOrderByUserId", fetchType = FetchType.LAZY) private Order order; // 一对多关系 @Many(select = "com.example.mapper.OrderMapper.getOrdersByUserId", fetchType = FetchType.LAZY) private List<Order> orders; // Getters and Setters } public class Order { private Integer id; private String product; // Getters and Setters } public interface UserMapper { @Select("SELECT * FROM users WHERE id = #{id}") @Results({ @Result(property = "id", column = "id", id = true), @Result(property = "name", column = "name"), @Result(property = "order", column = "id", one = @One(select = "com.example.mapper.OrderMapper.getOrderByUserId")), @Result(property = "orders", column = "id", many = @Many(select = "com.example.mapper.OrderMapper.getOrdersByUserId")) }) User getUserById(Integer id); } public interface OrderMapper { @Select("SELECT * FROM orders WHERE user_id = #{userId}") List<Order> getOrdersByUserId(Integer userId); @Select("SELECT * FROM orders WHERE user_id = #{userId} LIMIT 1") Order getOrderByUserId(Integer userId); } ``` 在上述示例中,`User`类通过`@One`和`@Many`注解分别定义了一对一和一对多的关系。`OrderMapper`接口提供了获取关联订单的查询方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值