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 查询方面的强大功能。熟练掌握这些操作,可以极大提升开发效率和代码质量。