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())); 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号