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()));
posted @   老夫写代码  阅读(17)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示