spring和Mybatis的各种查询

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: Spring 和 MyBatis 的结合使得数据访问层的开发变得更加简洁和高效。通过以上各种查询操作的详细讲解,我们可以看到 MyBatis 在处理简单查询、条件查询、分页查询、联合查询和动态 SQL 查询方面的强大功能。熟练掌握这些操作,可以极大提升开发效率和代码质量。

Spring 和 MyBatis 的各种查询

Spring 和 MyBatis 是 Java 开发中广泛使用的两个框架。Spring 提供了全面的基础设施支持,而 MyBatis 是一个优秀的持久层框架,两者结合能够简化数据访问层的开发。本文将详细介绍如何在 Spring 中使用 MyBatis 进行各种查询操作,包括简单查询、条件查询、分页查询、联合查询和动态 SQL 查询。

一、环境配置

1. Maven 依赖

pom.xml 文件中添加 Spring 和 MyBatis 的相关依赖:

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

    <!-- Spring Boot Starter MyBatis -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>

    <!-- MySQL Connector -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
</dependencies>
​

2. 配置文件

application.yml 中配置数据库连接和 MyBatis 设置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/your_database
    username: your_username
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis:
  mapper-locations: classpath:mappers/*.xml
  type-aliases-package: com.example.demo.model
​

二、实体类和 Mapper 接口

1. 实体类

创建一个简单的实体类 User

package com.example.demo.model;

public class User {
    private Long id;
    private String name;
    private String email;

    // Getters and setters
}
​

2. Mapper 接口

定义 UserMapper 接口:

package com.example.demo.mapper;

import com.example.demo.model.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM users WHERE id = #{id}")
    User findById(Long id);

    @Select("SELECT * FROM users")
    List<User> findAll();

    @Select("SELECT * FROM users WHERE name = #{name}")
    List<User> findByName(String name);

    @Insert("INSERT INTO users(name, email) VALUES(#{name}, #{email})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insert(User user);

    @Update("UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}")
    void update(User user);

    @Delete("DELETE FROM users WHERE id = #{id}")
    void delete(Long id);
}
​

三、各种查询操作

1. 简单查询

通过主键 ID 查询用户:

User user = userMapper.findById(1L);
System.out.println(user.getName());
​

2. 条件查询

根据用户名查询用户列表:

List<User> users = userMapper.findByName("John");
users.forEach(user -> System.out.println(user.getEmail()));
​

3. 分页查询

分页查询可以通过 SQL 语句中的 LIMIT 关键字实现。首先在 Mapper 接口中添加分页查询方法:

@Select("SELECT * FROM users LIMIT #{offset}, #{limit}")
List<User> findByPage(@Param("offset") int offset, @Param("limit") int limit);
​

然后在业务代码中调用分页查询方法:

int page = 1;
int pageSize = 10;
int offset = (page - 1) * pageSize;
List<User> users = userMapper.findByPage(offset, pageSize);
users.forEach(user -> System.out.println(user.getName()));
​

4. 联合查询

假设有另一个表 orders,我们需要查询用户及其订单信息。首先创建 Order 实体类:

package com.example.demo.model;

public class Order {
    private Long id;
    private Long userId;
    private String product;
    private int quantity;

    // Getters and setters
}
​

然后在 UserMapper 中添加联合查询方法:

@Select("SELECT u.*, o.* FROM users u JOIN orders o ON u.id = o.user_id WHERE u.id = #{userId}")
@Results({
    @Result(property = "id", column = "id"),
    @Result(property = "name", column = "name"),
    @Result(property = "email", column = "email"),
    @Result(property = "orders", column = "user_id", 
            many = @Many(select = "com.example.demo.mapper.OrderMapper.findByUserId"))
})
User findUserWithOrders(Long userId);
​

OrderMapper 中添加 findByUserId 方法:

package com.example.demo.mapper;

import com.example.demo.model.Order;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;

@Mapper
public interface OrderMapper {

    @Select("SELECT * FROM orders WHERE user_id = #{userId}")
    List<Order> findByUserId(Long userId);
}
​

调用联合查询方法:

User user = userMapper.findUserWithOrders(1L);
System.out.println(user.getName());
user.getOrders().forEach(order -> System.out.println(order.getProduct()));
​

5. 动态 SQL 查询

动态 SQL 查询使用 MyBatis 的 <if><choose> 等标签。首先创建 XML 映射文件 UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.demo.mapper.UserMapper">
    <select id="findUsersByCriteria" parameterType="map" resultType="com.example.demo.model.User">
        SELECT * FROM users
        <where>
            <if test="name != null">
                AND name = #{name}
            </if>
            <if test="email != null">
                AND email = #{email}
            </if>
        </where>
    </select>
</mapper>
​

UserMapper 接口中声明方法:

List<User> findUsersByCriteria(@Param("name") String name, @Param("email") String email);
​

调用动态查询方法:

Map<String, Object> params = new HashMap<>();
params.put("name", "John");
params.put("email", null);

List<User> users = userMapper.findUsersByCriteria(params);
users.forEach(user -> System.out.println(user.getEmail()));
​

四、总结

Spring 和 MyBatis 的结合使得数据访问层的开发变得更加简洁和高效。通过以上各种查询操作的详细讲解,我们可以看到 MyBatis 在处理简单查询、条件查询、分页查询、联合查询和动态 SQL 查询方面的强大功能。熟练掌握这些操作,可以极大提升开发效率和代码质量。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7月前
|
Java 数据库连接 Spring
Spring 整合mybatis
Spring 整合mybatis
48 2
|
7月前
|
XML Java 数据库连接
MyBatis-Spring的实现方式有哪些?
MyBatis-Spring的实现方式有哪些?
31 0
|
7月前
|
Java 数据库连接 Spring
spring 整合mybatis
spring 整合mybatis
35 0
|
7月前
|
Java 关系型数据库 数据库连接
Mybatis与Spring的整合
Mybatis与Spring的整合
42 0
|
Java Spring
mybatis-plus不使用spring
mybatis-plus不使用spring
347 0
|
Java 数据库连接 数据库
Spring和mybatis整合
Spring和mybatis整合
53 0
|
Java 数据库连接 Spring
34MyBatis - MyBatis整合Spring
34MyBatis - MyBatis整合Spring
65 0
|
Java 数据库连接 数据库
【Spring学习笔记 八】Spring整合MyBatis实现方式
【Spring学习笔记 八】Spring整合MyBatis实现方式
90 0
|
Java 数据库连接 程序员
【Spring学习笔记 八】Spring整合MyBatis实现方式(下)
【Spring学习笔记 八】Spring整合MyBatis实现方式(下)
70 0
|
Java 数据库连接 Spring
04 Mybatis与mybatis-spring对应版本关系
在Spring整合Mybatis的时候整合包与Spring版本、Mybatis版本、mybatis-Spring版本都有直接关系
1369 0