Mybaties Plus多表查询-以User、Order表为例


Mybatis Plus是一个基于Mybatis的优秀框架,它提供了许多功能来简化Mybatis的操作,其中最重要的是多表查询和分页查询。

多表查询是在同一个SQL查询中查询多个表的数据,可以在Mybatis Plus中使用注解,XML映射文件来实现多表查询。

Mybatis Plus提供了@TableName注解,可以用来为每个表指定表名,还可以使用@TableField注解为每个字段指定列名,以及@TableJoin注解来为表之间指定连接关系。

分页查询是一种特殊查询,可以让用户在数据库查询指定页数的数据,而不是将所有的数据进行提取,从而提高了查询效率。

Mybatis Plus提供了Page对象来实现分页查询,可以通过Page对象指定每页多少条数据以及第几页,Mybatis Plus会自动将这些信息添加到查询语句中。总之,Mybatis Plus提供了大量的功能来简化Mybatis的操作,其中最重要的是多表查询和分页查询,可以使程序员更轻松地操作数据库。

Mybatis Plus提供了多表查询和分页查询等功能,能够方便我们更轻松地操作数据库。以User(用户)、Order(订单)进行举例。

首先通过maven进行pom.xml依赖的导入

<dependencies>
<!--Spring Boot Web依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--MyBatisPlus依赖-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.2</version>
</dependency>

<!--Mysql驱动依赖-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>

<!--数据连接池Druid依赖-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.20</version>
</dependency>

<!--Spring Boot单元测试依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

</dependencies>

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

修改springBoot的基础配置

# 添加MySQL驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# MySQL URL
spring.datasource.url=jdbc:mysql://localhost:3306/mydb?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
# MySQL用户名
spring.datasource.username=root
# MySQL密码
spring.datasource.password=admin
# 数据库连接池类型
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
# MyBatis Plus日志实现
mybatis-plus.configuration.Log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
# 禁止Thymeleaf缓存
spring.thymeleaf.cache=false

Spring Boot控制器是一种特殊的组件,用于处理从Web浏览器发出的HTTP请求,它可以从请求中提取参数,并将其映射到控制器方法中。控制器方法可以使用这些参数来执行业务逻辑,然后将响应发送回浏览器。

创建UserController、OrderController控制器

UserController用于处理用户相关的请求:

注解

作用

用法

@RestController

标记控制器类

在类上使用

@GetMapping

标记Get请求的映射

在方法上使用

@PostMapping

标记POST请求的映射

在方法上使用

@DeleteMapping

标记Delete请求的映射

在方法上使用

@TableField

用于实体类和表字段的映射关系

在字段上使用

@RestController
public class UserController {
    /**Atuowired注解的作用是:
    能够自动按照类型进行注入,可以对类成员变量、方法以及构造函数进行标注
    从而完成自动装配的工作,可以消除setter()方法。
    说人话就是:@AutoWired的作用是自动把相关联的类或者接口的对象创建出来。

    */
    @Autowired
    private UserMapper userMapper;
    //查询所有用户,返回查询到的用户列表。
    @GetMapping("/user/findAll")
    public List<User> find() { return userMapper.selectAllUserAndOrders();

    }
    /**
    * 保存用户
    * @param user 传入的User对象
    * @return 返回成功或失败的消息
    */ 
    @PostMapping("/user")
    public String save(User user) {
        int i = userMapper.insert(user);
        System.out.println(user);
        if (i > 0) {
            return "插入成功!!!!!!";

        } else {
            return "插入失败!";
        }
    }
    /**
    * 根据id删除用户
    * @param id 需要删除用户的id
    * @return 返回成功或失败的消息
    */ 
    @DeleteMapping("/user/{id}")
    public String delete(@PathVariable Long id) {
        int result = userMapper.deleteById(id);
        if (result>0){
            return "删除成功";
        }else {
            return "删除失败";
        }

    }
}
//OrderController
@RestController
public class OrderController {

    @Autowired
    private OrderMapper orderMapper;

    @GetMapping("/order/findAll")
    public List findAll () {
        List orders = orderMapper.selectAllOrderAndUser();
        return orders;
    }

}

创建User、Order类

public class User {
    @TableId(type = IdType.AUTO)
    private int id;
    private String username;
    private String password;
    private String birthday;
/**@TableField注解用于实体类和表字段的映射关系,它可以定义实体类中的属性和表中字段的映射关系,用于解决实体类属性和表字段不一致的问题。它可以在字段上使用,它有以下几个参数:
value:指定字段名称,如果实体类字段和表字段名称一致,可以省略不指定。
exist:标记此字段在数据库中是否存在,默认为true,如果该字段在数据库中不存在,可以将该字段设置为false。
fill:标记插入或更新操作时该字段的填充策略,默认为 FieldFill.DEFAULT,可以设置为 FieldFill.INSERT和FieldFill.UPDATE。
    */
    //将order进行排除,避免查询时,将orders加入查询。
    @TableField(exist = false)
    private List<Order> orders;

    public List<Order> getOrders() {
        return orders;
    }

    public void setOrders(List<Order> orders) {
        this.orders = orders;
    }

    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    @Override

    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", birthday='" + birthday + '\'' +
                ", orders=" + orders+
                '}';
    }
}

user表结构如下:

t_order表结构:

public class Order {
    private int id;
    private String order_time;
    private int total;
    private int uid;
    @TableField(exist = false)
    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String getOrder_time() {
        return order_time;
    }

    public void setOrder_time(String order_time) {
        this.order_time = order_time;
    }


    public int getTotal() {
        return total;
    }

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

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

    public int getUid() {
        return uid;
    }

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

创建UserMapper、OrderMapper接口

Mybatis Plus的UserMapper接口是Mybatis Plus的核心接口,它继承了Mybatis的UserMapper接口,并提供了一系列额外的方法,以更加高效地操作数据库。Mybatis Plus的UserMapper接口可以更轻松、更快速地执行增删改查操作,并可以完成复杂的SQL查询。

注解

功能/作用

用法

@Results

定义映射关系

在方法上使用

@Select

标记查询方法

在方法上使用

@Mapper

标记接口为Mybatis Mapper接口

在接口上使用

@Result

标记实体类和表字段的映射关系

在字段上使用

@One

标记一对一的查询结果

在@Result中使用

@More

标记一对多的查询结果

在@Result中使用

@Mapper
public interface OrderMapper extends BaseMapper {
    @Select("select * from t_order where uid = #{uid};")
    List<Order> selectByUid(int uid);

    @Select("select * from t_order")
    @Results({
            @Result(column = "id",property = "id"),
            @Result(column = "ordertime",property = "ordertime"),
            @Result(column = "total",property = "total"),
            //定义Mybatis Plus查询结果的映射关系,它将uid字段映射到实体类的uid属性,并且将查询结果转换为实体类对象,one参数用于指定一对一的查询方法,该方法的返回值将被设置到实体类中。
            @Result(column = "uid",property = "uid",javaType = User.class,
            one=@One(select = "com.example.mpdemo.mapper.UserMapper.selectById"))

    })
    List<Order> selectAllOrderAndUser();
}
@Mapper
public interface UserMapper extends BaseMapper <User>{

    @Select("select * from user where id = #{id}")
    User selectById(int id);
    @Select("select * from user")
    @Results(
            {
                    @Result(column = "id",property = "id"),
                    @Result(column = "username",property = "username"),
                    @Result(column = "password",property = "password"),
                    @Result(column = "id",property = "orders",javaType = List.class,
                            many = @Many(select = "com.example.mpdemo.mapper.OrderMapper.selectByUid")

                    )
            }
    )

    List<User> selectAllUserAndOrders();


}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis-Plus 是一款 MyBatis 的增强工具,在多表查询方面提供了许多便利的功能和API。 MyBatis-Plus 多表查询可以通过以下方式实现: 1. 使用 MyBatis-Plus 提供的 QueryWrapper 类,通过链式调用方法实现多表查询。例如: ```java QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.select("user.*", "order.*") .eq("user.id", 1) .eq("order.user_id", 1) .orderByDesc("order.create_time"); List<Map<String, Object>> list = userMapper.selectMaps(queryWrapper); ``` 2. 使用 MyBatis-Plus 提供的 @TableField 注解,在实体类中定义关联字段。例如: ```java @Data public class User { private Long id; private String name; private Integer age; @TableField(exist = false) private List<Order> orders; } @Data public class Order { private Long id; private Long userId; private String orderNo; } @Mapper public interface UserMapper extends BaseMapper<User> { @Select("SELECT user.*, order.* FROM user LEFT JOIN order ON user.id = order.user_id WHERE user.id = #{id}") @Results({ @Result(property = "id", column = "id"), @Result(property = "name", column = "name"), @Result(property = "age", column = "age"), @Result(property = "orders", column = "id", many = @Many(select = "com.example.mapper.OrderMapper.selectByUserId")) }) User selectWithOrders(Long id); } @Mapper public interface OrderMapper extends BaseMapper<Order> { @Select("SELECT * FROM order WHERE user_id = #{userId}") List<Order> selectByUserId(Long userId); } ``` 以上是两种常用的 MyBatis-Plus 多表查询方式,具体使用方式可以根据实际情况选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值